mirror of
https://git.mirrors.martin98.com/https://github.com/syoyo/tinygltf.git
synced 2025-06-21 00:30:55 +08:00
Applyind clang-format on main.cc. Included gltf-loader
Signed-off by: Arthur Brainville (Ybalrid) <ybalrid@ybalrid.info>
This commit is contained in:
parent
3903446bfc
commit
a6cbf3d35b
@ -55,10 +55,10 @@ THE SOFTWARE.
|
|||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <limits>
|
#include <limits>
|
||||||
|
#include <map>
|
||||||
|
#include <sstream>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <sstream>
|
|
||||||
#include <map>
|
|
||||||
|
|
||||||
#include <atomic> // C++11
|
#include <atomic> // C++11
|
||||||
#include <chrono> // C++11
|
#include <chrono> // C++11
|
||||||
@ -75,19 +75,20 @@ THE SOFTWARE.
|
|||||||
#pragma warning(disable : 4201)
|
#pragma warning(disable : 4201)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "glm/mat4x4.hpp"
|
|
||||||
#include "glm/gtc/quaternion.hpp"
|
|
||||||
#include "glm/gtc/matrix_transform.hpp"
|
#include "glm/gtc/matrix_transform.hpp"
|
||||||
|
#include "glm/gtc/quaternion.hpp"
|
||||||
#include "glm/gtc/type_ptr.hpp"
|
#include "glm/gtc/type_ptr.hpp"
|
||||||
|
#include "glm/mat4x4.hpp"
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER)
|
||||||
#pragma warning(pop)
|
#pragma warning(pop)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "gltf-loader.h"
|
||||||
#include "nanosg.h"
|
#include "nanosg.h"
|
||||||
|
#include "obj-loader.h"
|
||||||
#include "render-config.h"
|
#include "render-config.h"
|
||||||
#include "render.h"
|
#include "render.h"
|
||||||
#include "obj-loader.h"
|
|
||||||
#include "trackball.h"
|
#include "trackball.h"
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
@ -102,7 +103,8 @@ int gHeight = 512;
|
|||||||
int gMousePosX = -1, gMousePosY = -1;
|
int gMousePosX = -1, gMousePosY = -1;
|
||||||
bool gMouseLeftDown = false;
|
bool gMouseLeftDown = false;
|
||||||
|
|
||||||
//FIX issue when max passes is done - no modes is switched. pass must be set to 0 when mode is changed
|
// FIX issue when max passes is done - no modes is switched. pass must be set to
|
||||||
|
// 0 when mode is changed
|
||||||
int gShowBufferMode_prv = SHOW_BUFFER_COLOR;
|
int gShowBufferMode_prv = SHOW_BUFFER_COLOR;
|
||||||
int gShowBufferMode = SHOW_BUFFER_COLOR;
|
int gShowBufferMode = SHOW_BUFFER_COLOR;
|
||||||
|
|
||||||
@ -125,8 +127,7 @@ std::atomic<bool> gSceneDirty;
|
|||||||
example::RenderConfig gRenderConfig;
|
example::RenderConfig gRenderConfig;
|
||||||
std::mutex gMutex;
|
std::mutex gMutex;
|
||||||
|
|
||||||
struct RenderLayer
|
struct RenderLayer {
|
||||||
{
|
|
||||||
std::vector<float> displayRGBA; // Accumurated image.
|
std::vector<float> displayRGBA; // Accumurated image.
|
||||||
std::vector<float> rgba;
|
std::vector<float> rgba;
|
||||||
std::vector<float> auxRGBA; // Auxiliary buffer
|
std::vector<float> auxRGBA; // Auxiliary buffer
|
||||||
@ -140,14 +141,12 @@ struct RenderLayer
|
|||||||
|
|
||||||
RenderLayer gRenderLayer;
|
RenderLayer gRenderLayer;
|
||||||
|
|
||||||
struct Camera
|
struct Camera {
|
||||||
{
|
|
||||||
glm::mat4 view;
|
glm::mat4 view;
|
||||||
glm::mat4 projection;
|
glm::mat4 projection;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ManipConfig
|
struct ManipConfig {
|
||||||
{
|
|
||||||
glm::vec3 snapTranslation;
|
glm::vec3 snapTranslation;
|
||||||
glm::vec3 snapRotation;
|
glm::vec3 snapRotation;
|
||||||
glm::vec3 snapScale;
|
glm::vec3 snapScale;
|
||||||
@ -198,10 +197,10 @@ void RenderThread() {
|
|||||||
// gRenderCancel may be set to true in main loop.
|
// gRenderCancel may be set to true in main loop.
|
||||||
// Render() will repeatedly check this flag inside the rendering loop.
|
// Render() will repeatedly check this flag inside the rendering loop.
|
||||||
|
|
||||||
bool ret =
|
bool ret = example::Renderer::Render(
|
||||||
example::Renderer::Render(&gRenderLayer.rgba.at(0), &gRenderLayer.auxRGBA.at(0), &gRenderLayer.sampleCounts.at(0),
|
&gRenderLayer.rgba.at(0), &gRenderLayer.auxRGBA.at(0),
|
||||||
gCurrQuat, gScene, gAsset, gRenderConfig, gRenderCancel
|
&gRenderLayer.sampleCounts.at(0), gCurrQuat, gScene, gAsset,
|
||||||
,
|
gRenderConfig, gRenderCancel,
|
||||||
gShowBufferMode // added mode passing
|
gShowBufferMode // added mode passing
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -225,10 +224,12 @@ void InitRender(example::RenderConfig* rc) {
|
|||||||
rc->max_passes = 128;
|
rc->max_passes = 128;
|
||||||
|
|
||||||
gRenderLayer.sampleCounts.resize(rc->width * rc->height);
|
gRenderLayer.sampleCounts.resize(rc->width * rc->height);
|
||||||
std::fill(gRenderLayer.sampleCounts.begin(), gRenderLayer.sampleCounts.end(), 0.0);
|
std::fill(gRenderLayer.sampleCounts.begin(), gRenderLayer.sampleCounts.end(),
|
||||||
|
0.0);
|
||||||
|
|
||||||
gRenderLayer.displayRGBA.resize(rc->width * rc->height * 4);
|
gRenderLayer.displayRGBA.resize(rc->width * rc->height * 4);
|
||||||
std::fill(gRenderLayer.displayRGBA.begin(), gRenderLayer.displayRGBA.end(), 0.0);
|
std::fill(gRenderLayer.displayRGBA.begin(), gRenderLayer.displayRGBA.end(),
|
||||||
|
0.0);
|
||||||
|
|
||||||
gRenderLayer.rgba.resize(rc->width * rc->height * 4);
|
gRenderLayer.rgba.resize(rc->width * rc->height * 4);
|
||||||
std::fill(gRenderLayer.rgba.begin(), gRenderLayer.rgba.end(), 0.0);
|
std::fill(gRenderLayer.rgba.begin(), gRenderLayer.rgba.end(), 0.0);
|
||||||
@ -237,19 +238,23 @@ void InitRender(example::RenderConfig* rc) {
|
|||||||
std::fill(gRenderLayer.auxRGBA.begin(), gRenderLayer.auxRGBA.end(), 0.0);
|
std::fill(gRenderLayer.auxRGBA.begin(), gRenderLayer.auxRGBA.end(), 0.0);
|
||||||
|
|
||||||
gRenderLayer.normalRGBA.resize(rc->width * rc->height * 4);
|
gRenderLayer.normalRGBA.resize(rc->width * rc->height * 4);
|
||||||
std::fill(gRenderLayer.normalRGBA.begin(), gRenderLayer.normalRGBA.end(), 0.0);
|
std::fill(gRenderLayer.normalRGBA.begin(), gRenderLayer.normalRGBA.end(),
|
||||||
|
0.0);
|
||||||
|
|
||||||
gRenderLayer.positionRGBA.resize(rc->width * rc->height * 4);
|
gRenderLayer.positionRGBA.resize(rc->width * rc->height * 4);
|
||||||
std::fill(gRenderLayer.positionRGBA.begin(), gRenderLayer.positionRGBA.end(), 0.0);
|
std::fill(gRenderLayer.positionRGBA.begin(), gRenderLayer.positionRGBA.end(),
|
||||||
|
0.0);
|
||||||
|
|
||||||
gRenderLayer.depthRGBA.resize(rc->width * rc->height * 4);
|
gRenderLayer.depthRGBA.resize(rc->width * rc->height * 4);
|
||||||
std::fill(gRenderLayer.depthRGBA.begin(), gRenderLayer.depthRGBA.end(), 0.0);
|
std::fill(gRenderLayer.depthRGBA.begin(), gRenderLayer.depthRGBA.end(), 0.0);
|
||||||
|
|
||||||
gRenderLayer.texCoordRGBA.resize(rc->width * rc->height * 4);
|
gRenderLayer.texCoordRGBA.resize(rc->width * rc->height * 4);
|
||||||
std::fill(gRenderLayer.texCoordRGBA.begin(), gRenderLayer.texCoordRGBA.end(), 0.0);
|
std::fill(gRenderLayer.texCoordRGBA.begin(), gRenderLayer.texCoordRGBA.end(),
|
||||||
|
0.0);
|
||||||
|
|
||||||
gRenderLayer.varyCoordRGBA.resize(rc->width * rc->height * 4);
|
gRenderLayer.varyCoordRGBA.resize(rc->width * rc->height * 4);
|
||||||
std::fill(gRenderLayer.varyCoordRGBA.begin(), gRenderLayer.varyCoordRGBA.end(), 0.0);
|
std::fill(gRenderLayer.varyCoordRGBA.begin(),
|
||||||
|
gRenderLayer.varyCoordRGBA.end(), 0.0);
|
||||||
|
|
||||||
rc->normalImage = &gRenderLayer.normalRGBA.at(0);
|
rc->normalImage = &gRenderLayer.normalRGBA.at(0);
|
||||||
rc->positionImage = &gRenderLayer.positionRGBA.at(0);
|
rc->positionImage = &gRenderLayer.positionRGBA.at(0);
|
||||||
@ -268,9 +273,8 @@ void checkErrors(std::string desc) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int CreateDisplayTextureGL(const float *data, int width, int height,
|
||||||
static int CreateDisplayTextureGL(const float *data, int width,
|
int components) {
|
||||||
int height, int components) {
|
|
||||||
GLuint id;
|
GLuint id;
|
||||||
glGenTextures(1, &id);
|
glGenTextures(1, &id);
|
||||||
|
|
||||||
@ -294,8 +298,8 @@ static int CreateDisplayTextureGL(const float *data, int width,
|
|||||||
assert(0); // "Invalid components"
|
assert(0); // "Invalid components"
|
||||||
}
|
}
|
||||||
|
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, format,
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, format, GL_FLOAT,
|
||||||
GL_FLOAT, data);
|
data);
|
||||||
|
|
||||||
glBindTexture(GL_TEXTURE_2D, last_texture);
|
glBindTexture(GL_TEXTURE_2D, last_texture);
|
||||||
|
|
||||||
@ -312,8 +316,10 @@ void keyboardCallback(int keycode, int state) {
|
|||||||
// reset.
|
// reset.
|
||||||
trackball(gCurrQuat, 0.0f, 0.0f, 0.0f, 0.0f);
|
trackball(gCurrQuat, 0.0f, 0.0f, 0.0f, 0.0f);
|
||||||
// clear buffer.
|
// clear buffer.
|
||||||
memset(gRenderLayer.rgba.data(), 0, sizeof(float) * gRenderConfig.width * gRenderConfig.height * 4);
|
memset(gRenderLayer.rgba.data(), 0,
|
||||||
memset(gRenderLayer.sampleCounts.data(), 0, sizeof(int) * gRenderConfig.width * gRenderConfig.height);
|
sizeof(float) * gRenderConfig.width * gRenderConfig.height * 4);
|
||||||
|
memset(gRenderLayer.sampleCounts.data(), 0,
|
||||||
|
sizeof(int) * gRenderConfig.width * gRenderConfig.height);
|
||||||
} else if (keycode == 9) {
|
} else if (keycode == 9) {
|
||||||
gTabPressed = (state == 1);
|
gTabPressed = (state == 1);
|
||||||
} else if (keycode == B3G_SHIFT) {
|
} else if (keycode == B3G_SHIFT) {
|
||||||
@ -330,7 +336,6 @@ void keyboardCallback(int keycode, int state) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void mouseMoveCallback(float x, float y) {
|
void mouseMoveCallback(float x, float y) {
|
||||||
|
|
||||||
if (gMouseLeftDown) {
|
if (gMouseLeftDown) {
|
||||||
if (ImGuizmo::IsOver() || ImGuizmo::IsUsing()) {
|
if (ImGuizmo::IsOver() || ImGuizmo::IsUsing()) {
|
||||||
} else {
|
} else {
|
||||||
@ -491,13 +496,14 @@ void UpdateDisplayTextureGL(GLint tex_id, int width, int height) {
|
|||||||
disp.resize(width * height * 4);
|
disp.resize(width * height * 4);
|
||||||
{
|
{
|
||||||
for (size_t y = 0; y < height; y++) {
|
for (size_t y = 0; y < height; y++) {
|
||||||
memcpy(&disp[4 * (y * width)], &buf[4 * ((height - y - 1) * width)], sizeof(float) * 4 * width);
|
memcpy(&disp[4 * (y * width)], &buf[4 * ((height - y - 1) * width)],
|
||||||
|
sizeof(float) * 4 * width);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
glBindTexture(GL_TEXTURE_2D, tex_id);
|
glBindTexture(GL_TEXTURE_2D, tex_id);
|
||||||
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RGBA, GL_FLOAT, disp.data());
|
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RGBA, GL_FLOAT,
|
||||||
|
disp.data());
|
||||||
glBindTexture(GL_TEXTURE_2D, 0);
|
glBindTexture(GL_TEXTURE_2D, 0);
|
||||||
|
|
||||||
// glRasterPos2i(-1, -1);
|
// glRasterPos2i(-1, -1);
|
||||||
@ -505,17 +511,16 @@ void UpdateDisplayTextureGL(GLint tex_id, int width, int height) {
|
|||||||
// static_cast<const GLvoid*>(&buf.at(0)));
|
// static_cast<const GLvoid*>(&buf.at(0)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void EditTransform(const ManipConfig &config, const Camera& camera, glm::mat4& matrix)
|
void EditTransform(const ManipConfig &config, const Camera &camera,
|
||||||
{
|
glm::mat4 &matrix) {
|
||||||
static ImGuizmo::OPERATION mCurrentGizmoOperation(ImGuizmo::ROTATE);
|
static ImGuizmo::OPERATION mCurrentGizmoOperation(ImGuizmo::ROTATE);
|
||||||
static ImGuizmo::MODE mCurrentGizmoMode(ImGuizmo::WORLD);
|
static ImGuizmo::MODE mCurrentGizmoMode(ImGuizmo::WORLD);
|
||||||
if (ImGui::IsKeyPressed(90))
|
if (ImGui::IsKeyPressed(90)) mCurrentGizmoOperation = ImGuizmo::TRANSLATE;
|
||||||
mCurrentGizmoOperation = ImGuizmo::TRANSLATE;
|
if (ImGui::IsKeyPressed(69)) mCurrentGizmoOperation = ImGuizmo::ROTATE;
|
||||||
if (ImGui::IsKeyPressed(69))
|
|
||||||
mCurrentGizmoOperation = ImGuizmo::ROTATE;
|
|
||||||
if (ImGui::IsKeyPressed(82)) // r Key
|
if (ImGui::IsKeyPressed(82)) // r Key
|
||||||
mCurrentGizmoOperation = ImGuizmo::SCALE;
|
mCurrentGizmoOperation = ImGuizmo::SCALE;
|
||||||
if (ImGui::RadioButton("Translate", mCurrentGizmoOperation == ImGuizmo::TRANSLATE))
|
if (ImGui::RadioButton("Translate",
|
||||||
|
mCurrentGizmoOperation == ImGuizmo::TRANSLATE))
|
||||||
mCurrentGizmoOperation = ImGuizmo::TRANSLATE;
|
mCurrentGizmoOperation = ImGuizmo::TRANSLATE;
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (ImGui::RadioButton("Rotate", mCurrentGizmoOperation == ImGuizmo::ROTATE))
|
if (ImGui::RadioButton("Rotate", mCurrentGizmoOperation == ImGuizmo::ROTATE))
|
||||||
@ -524,14 +529,15 @@ void EditTransform(const ManipConfig &config, const Camera& camera, glm::mat4& m
|
|||||||
if (ImGui::RadioButton("Scale", mCurrentGizmoOperation == ImGuizmo::SCALE))
|
if (ImGui::RadioButton("Scale", mCurrentGizmoOperation == ImGuizmo::SCALE))
|
||||||
mCurrentGizmoOperation = ImGuizmo::SCALE;
|
mCurrentGizmoOperation = ImGuizmo::SCALE;
|
||||||
float matrixTranslation[3], matrixRotation[3], matrixScale[3];
|
float matrixTranslation[3], matrixRotation[3], matrixScale[3];
|
||||||
ImGuizmo::DecomposeMatrixToComponents(&matrix[0][0], matrixTranslation, matrixRotation, matrixScale);
|
ImGuizmo::DecomposeMatrixToComponents(&matrix[0][0], matrixTranslation,
|
||||||
|
matrixRotation, matrixScale);
|
||||||
ImGui::InputFloat3("Tr", matrixTranslation, 3);
|
ImGui::InputFloat3("Tr", matrixTranslation, 3);
|
||||||
ImGui::InputFloat3("Rt", matrixRotation, 3);
|
ImGui::InputFloat3("Rt", matrixRotation, 3);
|
||||||
ImGui::InputFloat3("Sc", matrixScale, 3);
|
ImGui::InputFloat3("Sc", matrixScale, 3);
|
||||||
ImGuizmo::RecomposeMatrixFromComponents(matrixTranslation, matrixRotation, matrixScale, &matrix[0][0]);
|
ImGuizmo::RecomposeMatrixFromComponents(matrixTranslation, matrixRotation,
|
||||||
|
matrixScale, &matrix[0][0]);
|
||||||
|
|
||||||
if (mCurrentGizmoOperation != ImGuizmo::SCALE)
|
if (mCurrentGizmoOperation != ImGuizmo::SCALE) {
|
||||||
{
|
|
||||||
if (ImGui::RadioButton("Local", mCurrentGizmoMode == ImGuizmo::LOCAL))
|
if (ImGui::RadioButton("Local", mCurrentGizmoMode == ImGuizmo::LOCAL))
|
||||||
mCurrentGizmoMode = ImGuizmo::LOCAL;
|
mCurrentGizmoMode = ImGuizmo::LOCAL;
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
@ -539,13 +545,11 @@ void EditTransform(const ManipConfig &config, const Camera& camera, glm::mat4& m
|
|||||||
mCurrentGizmoMode = ImGuizmo::WORLD;
|
mCurrentGizmoMode = ImGuizmo::WORLD;
|
||||||
}
|
}
|
||||||
static bool useSnap(false);
|
static bool useSnap(false);
|
||||||
if (ImGui::IsKeyPressed(83))
|
if (ImGui::IsKeyPressed(83)) useSnap = !useSnap;
|
||||||
useSnap = !useSnap;
|
|
||||||
ImGui::Checkbox("", &useSnap);
|
ImGui::Checkbox("", &useSnap);
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
glm::vec3 snap;
|
glm::vec3 snap;
|
||||||
switch (mCurrentGizmoOperation)
|
switch (mCurrentGizmoOperation) {
|
||||||
{
|
|
||||||
case ImGuizmo::TRANSLATE:
|
case ImGuizmo::TRANSLATE:
|
||||||
snap = config.snapTranslation;
|
snap = config.snapTranslation;
|
||||||
ImGui::InputFloat3("Snap", &snap.x);
|
ImGui::InputFloat3("Snap", &snap.x);
|
||||||
@ -561,11 +565,12 @@ void EditTransform(const ManipConfig &config, const Camera& camera, glm::mat4& m
|
|||||||
}
|
}
|
||||||
ImGuiIO &io = ImGui::GetIO();
|
ImGuiIO &io = ImGui::GetIO();
|
||||||
ImGuizmo::SetRect(0, 0, io.DisplaySize.x, io.DisplaySize.y);
|
ImGuizmo::SetRect(0, 0, io.DisplaySize.x, io.DisplaySize.y);
|
||||||
ImGuizmo::Manipulate(&camera.view[0][0], &camera.projection[0][0], mCurrentGizmoOperation, mCurrentGizmoMode, &matrix[0][0], NULL, useSnap ? &snap.x : NULL);
|
ImGuizmo::Manipulate(&camera.view[0][0], &camera.projection[0][0],
|
||||||
|
mCurrentGizmoOperation, mCurrentGizmoMode, &matrix[0][0],
|
||||||
|
NULL, useSnap ? &snap.x : NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DrawMesh(const example::Mesh<float> *mesh)
|
void DrawMesh(const example::Mesh<float> *mesh) {
|
||||||
{
|
|
||||||
// TODO(LTE): Use vertex array or use display list.
|
// TODO(LTE): Use vertex array or use display list.
|
||||||
|
|
||||||
glBegin(GL_TRIANGLES);
|
glBegin(GL_TRIANGLES);
|
||||||
@ -579,20 +584,17 @@ void DrawMesh(const example::Mesh<float> *mesh)
|
|||||||
glNormal3f(mesh->facevarying_normals[9 * i + 0],
|
glNormal3f(mesh->facevarying_normals[9 * i + 0],
|
||||||
mesh->facevarying_normals[9 * i + 1],
|
mesh->facevarying_normals[9 * i + 1],
|
||||||
mesh->facevarying_normals[9 * i + 2]);
|
mesh->facevarying_normals[9 * i + 2]);
|
||||||
glVertex3f(mesh->vertices[3 * f0 + 0],
|
glVertex3f(mesh->vertices[3 * f0 + 0], mesh->vertices[3 * f0 + 1],
|
||||||
mesh->vertices[3 * f0 + 1],
|
|
||||||
mesh->vertices[3 * f0 + 2]);
|
mesh->vertices[3 * f0 + 2]);
|
||||||
glNormal3f(mesh->facevarying_normals[9 * i + 3],
|
glNormal3f(mesh->facevarying_normals[9 * i + 3],
|
||||||
mesh->facevarying_normals[9 * i + 4],
|
mesh->facevarying_normals[9 * i + 4],
|
||||||
mesh->facevarying_normals[9 * i + 5]);
|
mesh->facevarying_normals[9 * i + 5]);
|
||||||
glVertex3f(mesh->vertices[3 * f1 + 0],
|
glVertex3f(mesh->vertices[3 * f1 + 0], mesh->vertices[3 * f1 + 1],
|
||||||
mesh->vertices[3 * f1 + 1],
|
|
||||||
mesh->vertices[3 * f1 + 2]);
|
mesh->vertices[3 * f1 + 2]);
|
||||||
glNormal3f(mesh->facevarying_normals[9 * i + 6],
|
glNormal3f(mesh->facevarying_normals[9 * i + 6],
|
||||||
mesh->facevarying_normals[9 * i + 7],
|
mesh->facevarying_normals[9 * i + 7],
|
||||||
mesh->facevarying_normals[9 * i + 8]);
|
mesh->facevarying_normals[9 * i + 8]);
|
||||||
glVertex3f(mesh->vertices[3 * f2 + 0],
|
glVertex3f(mesh->vertices[3 * f2 + 0], mesh->vertices[3 * f2 + 1],
|
||||||
mesh->vertices[3 * f2 + 1],
|
|
||||||
mesh->vertices[3 * f2 + 2]);
|
mesh->vertices[3 * f2 + 2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -602,14 +604,11 @@ void DrawMesh(const example::Mesh<float> *mesh)
|
|||||||
unsigned int f1 = mesh->faces[3 * i + 1];
|
unsigned int f1 = mesh->faces[3 * i + 1];
|
||||||
unsigned int f2 = mesh->faces[3 * i + 2];
|
unsigned int f2 = mesh->faces[3 * i + 2];
|
||||||
|
|
||||||
glVertex3f(mesh->vertices[3 * f0 + 0],
|
glVertex3f(mesh->vertices[3 * f0 + 0], mesh->vertices[3 * f0 + 1],
|
||||||
mesh->vertices[3 * f0 + 1],
|
|
||||||
mesh->vertices[3 * f0 + 2]);
|
mesh->vertices[3 * f0 + 2]);
|
||||||
glVertex3f(mesh->vertices[3 * f1 + 0],
|
glVertex3f(mesh->vertices[3 * f1 + 0], mesh->vertices[3 * f1 + 1],
|
||||||
mesh->vertices[3 * f1 + 1],
|
|
||||||
mesh->vertices[3 * f1 + 2]);
|
mesh->vertices[3 * f1 + 2]);
|
||||||
glVertex3f(mesh->vertices[3 * f2 + 0],
|
glVertex3f(mesh->vertices[3 * f2 + 0], mesh->vertices[3 * f2 + 1],
|
||||||
mesh->vertices[3 * f2 + 1],
|
|
||||||
mesh->vertices[3 * f2 + 2]);
|
mesh->vertices[3 * f2 + 2]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -617,8 +616,7 @@ void DrawMesh(const example::Mesh<float> *mesh)
|
|||||||
glEnd();
|
glEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DrawNode(const nanosg::Node<float, example::Mesh<float> > &node)
|
void DrawNode(const nanosg::Node<float, example::Mesh<float> > &node) {
|
||||||
{
|
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
glMultMatrixf(node.GetLocalXformPtr());
|
glMultMatrixf(node.GetLocalXformPtr());
|
||||||
|
|
||||||
@ -634,8 +632,8 @@ void DrawNode(const nanosg::Node<float, example::Mesh<float> > &node)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Draw scene with OpenGL
|
// Draw scene with OpenGL
|
||||||
void DrawScene(const nanosg::Scene<float, example::Mesh<float> > &scene, const Camera &camera)
|
void DrawScene(const nanosg::Scene<float, example::Mesh<float> > &scene,
|
||||||
{
|
const Camera &camera) {
|
||||||
glEnable(GL_DEPTH_TEST);
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
|
||||||
glEnable(GL_LIGHTING);
|
glEnable(GL_LIGHTING);
|
||||||
@ -653,7 +651,8 @@ void DrawScene(const nanosg::Scene<float, example::Mesh<float> > &scene, const C
|
|||||||
glLightfv(GL_LIGHT1, GL_POSITION, &light1_pos[0]);
|
glLightfv(GL_LIGHT1, GL_POSITION, &light1_pos[0]);
|
||||||
glLightfv(GL_LIGHT1, GL_DIFFUSE, &light_diffuse[0]);
|
glLightfv(GL_LIGHT1, GL_DIFFUSE, &light_diffuse[0]);
|
||||||
|
|
||||||
const std::vector<nanosg::Node<float, example::Mesh<float> > > &root_nodes = scene.GetNodes();
|
const std::vector<nanosg::Node<float, example::Mesh<float> > > &root_nodes =
|
||||||
|
scene.GetNodes();
|
||||||
|
|
||||||
glMatrixMode(GL_PROJECTION);
|
glMatrixMode(GL_PROJECTION);
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
@ -675,15 +674,12 @@ void DrawScene(const nanosg::Scene<float, example::Mesh<float> > &scene, const C
|
|||||||
glDisable(GL_LIGHT1);
|
glDisable(GL_LIGHT1);
|
||||||
glDisable(GL_LIGHTING);
|
glDisable(GL_LIGHTING);
|
||||||
glDisable(GL_DEPTH_TEST);
|
glDisable(GL_DEPTH_TEST);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void BuildSceneItems(
|
void BuildSceneItems(std::vector<std::string> *display_names,
|
||||||
std::vector<std::string> *display_names,
|
|
||||||
std::vector<std::string> *names,
|
std::vector<std::string> *names,
|
||||||
const nanosg::Node<float, example::Mesh<float> > &node,
|
const nanosg::Node<float, example::Mesh<float> > &node,
|
||||||
int indent)
|
int indent) {
|
||||||
{
|
|
||||||
if (node.GetName().empty()) {
|
if (node.GetName().empty()) {
|
||||||
// Skip a node with empty name.
|
// Skip a node with empty name.
|
||||||
return;
|
return;
|
||||||
@ -703,7 +699,6 @@ void BuildSceneItems(
|
|||||||
for (size_t i = 0; i < node.GetChildren().size(); i++) {
|
for (size_t i = 0; i < node.GetChildren().size(); i++) {
|
||||||
BuildSceneItems(display_names, names, node.GetChildren()[i], indent + 1);
|
BuildSceneItems(display_names, names, node.GetChildren()[i], indent + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// tigra: add default material
|
// tigra: add default material
|
||||||
@ -741,9 +736,11 @@ int main(int argc, char** argv) {
|
|||||||
default_material.specular[1] = 0;
|
default_material.specular[1] = 0;
|
||||||
default_material.specular[2] = 0;
|
default_material.specular[2] = 0;
|
||||||
|
|
||||||
bool ret = LoadObj(gRenderConfig.obj_filename, gRenderConfig.scene_scale, &meshes, &materials, &textures);
|
bool ret = LoadObj(gRenderConfig.obj_filename, gRenderConfig.scene_scale,
|
||||||
|
&meshes, &materials, &textures);
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
std::cerr << "Failed to load .obj [ " << gRenderConfig.obj_filename << " ]" << std::endl;
|
std::cerr << "Failed to load .obj [ " << gRenderConfig.obj_filename
|
||||||
|
<< " ]" << std::endl;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -757,10 +754,10 @@ int main(int argc, char** argv) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (size_t n = 0; n < gAsset.meshes.size(); n++) {
|
for (size_t n = 0; n < gAsset.meshes.size(); n++) {
|
||||||
|
|
||||||
nanosg::Node<float, example::Mesh<float> > node(&gAsset.meshes[n]);
|
nanosg::Node<float, example::Mesh<float> > node(&gAsset.meshes[n]);
|
||||||
node.SetName(meshes[n].name);
|
node.SetName(meshes[n].name);
|
||||||
node.SetLocalXform(meshes[n].pivot_xform); // Use mesh's pivot transform as node's local transform.
|
node.SetLocalXform(meshes[n].pivot_xform); // Use mesh's pivot transform
|
||||||
|
// as node's local transform.
|
||||||
gNodes.push_back(node);
|
gNodes.push_back(node);
|
||||||
|
|
||||||
gScene.AddNode(node);
|
gScene.AddNode(node);
|
||||||
@ -774,9 +771,10 @@ int main(int argc, char** argv) {
|
|||||||
float bmin[3], bmax[3];
|
float bmin[3], bmax[3];
|
||||||
gScene.GetBoundingBox(bmin, bmax);
|
gScene.GetBoundingBox(bmin, bmax);
|
||||||
printf(" # of nodes : %d\n", int(gNodes.size()));
|
printf(" # of nodes : %d\n", int(gNodes.size()));
|
||||||
printf(" Scene Bmin : %f, %f, %f\n", bmin[0], bmin[1], bmin[2]);
|
printf(" Scene Bmin : %f, %f, %f\n", bmin[0], bmin[1],
|
||||||
printf(" Scene Bmax : %f, %f, %f\n", bmax[0], bmax[1], bmax[2]);
|
bmin[2]);
|
||||||
|
printf(" Scene Bmax : %f, %f, %f\n", bmax[0], bmax[1],
|
||||||
|
bmax[2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<const char *> imgui_node_names;
|
std::vector<const char *> imgui_node_names;
|
||||||
@ -786,7 +784,8 @@ int main(int argc, char** argv) {
|
|||||||
|
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i < gScene.GetNodes().size(); i++) {
|
for (size_t i = 0; i < gScene.GetNodes().size(); i++) {
|
||||||
BuildSceneItems(&display_node_names, &node_names, gScene.GetNodes()[i], /* indent */0);
|
BuildSceneItems(&display_node_names, &node_names, gScene.GetNodes()[i],
|
||||||
|
/* indent */ 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// List of strings for imgui.
|
// List of strings for imgui.
|
||||||
@ -801,13 +800,13 @@ int main(int argc, char** argv) {
|
|||||||
nanosg::Node<float, example::Mesh<float> > *node;
|
nanosg::Node<float, example::Mesh<float> > *node;
|
||||||
|
|
||||||
if (gScene.FindNode(node_names[i], &node)) {
|
if (gScene.FindNode(node_names[i], &node)) {
|
||||||
//std::cout << "id : " << i << ", name : " << node_names[i] << std::endl;
|
// std::cout << "id : " << i << ", name : " << node_names[i] <<
|
||||||
|
// std::endl;
|
||||||
node_map[i] = node;
|
node_map[i] = node;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
window = new b3gDefaultOpenGLWindow;
|
window = new b3gDefaultOpenGLWindow;
|
||||||
b3gWindowConstructionInfo ci;
|
b3gWindowConstructionInfo ci;
|
||||||
#ifdef USE_OPENGL2
|
#ifdef USE_OPENGL2
|
||||||
@ -922,34 +921,33 @@ int main(int argc, char** argv) {
|
|||||||
checkErrors("clear");
|
checkErrors("clear");
|
||||||
|
|
||||||
// fix max passes issue
|
// fix max passes issue
|
||||||
if(gShowBufferMode_prv!=gShowBufferMode)
|
if (gShowBufferMode_prv != gShowBufferMode) {
|
||||||
{
|
|
||||||
gRenderConfig.pass = 0;
|
gRenderConfig.pass = 0;
|
||||||
gShowBufferMode_prv = gShowBufferMode;
|
gShowBufferMode_prv = gShowBufferMode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Render display window
|
// Render display window
|
||||||
{
|
{
|
||||||
static GLint gl_texid = -1;
|
static GLint gl_texid = -1;
|
||||||
if (gl_texid < 0) {
|
if (gl_texid < 0) {
|
||||||
gl_texid = CreateDisplayTextureGL(NULL, gRenderConfig.width, gRenderConfig.height, 4);
|
gl_texid = CreateDisplayTextureGL(NULL, gRenderConfig.width,
|
||||||
|
gRenderConfig.height, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Refresh texture until rendering finishes.
|
// Refresh texture until rendering finishes.
|
||||||
if (gRenderConfig.pass < gRenderConfig.max_passes) {
|
if (gRenderConfig.pass < gRenderConfig.max_passes) {
|
||||||
// FIXME(LTE): Do not update GL texture frequently.
|
// FIXME(LTE): Do not update GL texture frequently.
|
||||||
UpdateDisplayTextureGL(gl_texid, gRenderConfig.width, gRenderConfig.height);
|
UpdateDisplayTextureGL(gl_texid, gRenderConfig.width,
|
||||||
|
gRenderConfig.height);
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::Begin("Render");
|
ImGui::Begin("Render");
|
||||||
ImTextureID tex_id = reinterpret_cast<void *>(
|
ImTextureID tex_id =
|
||||||
static_cast<intptr_t>(gl_texid));
|
reinterpret_cast<void *>(static_cast<intptr_t>(gl_texid));
|
||||||
ImGui::Image(tex_id, ImVec2(256, 256), ImVec2(0, 0),
|
ImGui::Image(tex_id, ImVec2(256, 256), ImVec2(0, 0),
|
||||||
ImVec2(1, 1)); // Setup camera and draw imguizomo
|
ImVec2(1, 1)); // Setup camera and draw imguizomo
|
||||||
|
|
||||||
ImGui::End();
|
ImGui::End();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// scene graph tree
|
// scene graph tree
|
||||||
@ -958,7 +956,8 @@ int main(int argc, char** argv) {
|
|||||||
{
|
{
|
||||||
ImGui::Begin("Scene");
|
ImGui::Begin("Scene");
|
||||||
|
|
||||||
ImGui::ListBox("Node list", &node_selected, imgui_node_names.data(), imgui_node_names.size(), 16);
|
ImGui::ListBox("Node list", &node_selected, imgui_node_names.data(),
|
||||||
|
imgui_node_names.size(), 16);
|
||||||
node_matrix = glm::make_mat4(node_map[node_selected]->GetLocalXformPtr());
|
node_matrix = glm::make_mat4(node_map[node_selected]->GetLocalXformPtr());
|
||||||
|
|
||||||
ImGui::End();
|
ImGui::End();
|
||||||
@ -984,11 +983,14 @@ int main(int argc, char** argv) {
|
|||||||
up[2] = gRenderConfig.up[2];
|
up[2] = gRenderConfig.up[2];
|
||||||
|
|
||||||
// NOTE(LTE): w, then (x,y,z) for glm::quat.
|
// NOTE(LTE): w, then (x,y,z) for glm::quat.
|
||||||
glm::quat rot = glm::quat(gCurrQuat[3], gCurrQuat[0], gCurrQuat[1], gCurrQuat[2]);
|
glm::quat rot =
|
||||||
|
glm::quat(gCurrQuat[3], gCurrQuat[0], gCurrQuat[1], gCurrQuat[2]);
|
||||||
glm::mat4 rm = glm::mat4_cast(rot);
|
glm::mat4 rm = glm::mat4_cast(rot);
|
||||||
|
|
||||||
view = glm::lookAt(eye, lookat, up) * glm::inverse(glm::mat4_cast(rot));
|
view = glm::lookAt(eye, lookat, up) * glm::inverse(glm::mat4_cast(rot));
|
||||||
projection = glm::perspective (45.0f, float(window->getWidth()) / float(window->getHeight()), 0.01f, 1000.0f);
|
projection = glm::perspective(
|
||||||
|
45.0f, float(window->getWidth()) / float(window->getHeight()), 0.01f,
|
||||||
|
1000.0f);
|
||||||
|
|
||||||
camera.view = view;
|
camera.view = view;
|
||||||
camera.projection = projection;
|
camera.projection = projection;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user