mirror of
https://github.com/lighttransport/tinyusdz.git
synced 2026-01-18 01:11:17 +01:00
Merge branch 'dev' of github.com:syoyo/tinyusdz into dev
This commit is contained in:
@@ -3,6 +3,10 @@
|
||||
This viewer uses NanoRT(SW ray tracer) to render the model and display it using SDL2
|
||||
(So no OpenGL dependency)
|
||||
|
||||
## Status
|
||||
|
||||
W.I.P.
|
||||
|
||||
## Requirements
|
||||
|
||||
* C++14 compiler
|
||||
|
||||
@@ -15,6 +15,12 @@
|
||||
#include <emscripten/html5.h>
|
||||
#endif
|
||||
|
||||
// To avoid some C define symbol conflict with SDL(e.g. 'Bool')
|
||||
// tinyusdz headers muet be included before SDL
|
||||
#include "tinyusdz.hh"
|
||||
#include "tydra/render-data.hh"
|
||||
|
||||
|
||||
// ../common/SDL2
|
||||
#include <SDL.h>
|
||||
|
||||
@@ -33,6 +39,7 @@
|
||||
#include "imnodes.h"
|
||||
#include "roboto_mono_embed.inc.h"
|
||||
#include "virtualGizmo3D/vGizmo.h"
|
||||
#include "trackball.h"
|
||||
|
||||
//
|
||||
#include "gui.hh"
|
||||
@@ -91,7 +98,7 @@ struct GUIContext {
|
||||
// std::array<float, 3> lookat = {0.0f, 0.0f, 0.0f};
|
||||
// std::array<float, 3> up = {0.0f, 1.0f, 0.0f};
|
||||
|
||||
//example::RenderScene render_scene;
|
||||
example::RTRenderScene rt_render_scene;
|
||||
|
||||
example::Camera camera;
|
||||
|
||||
@@ -104,8 +111,8 @@ struct GUIContext {
|
||||
int render_width = 512;
|
||||
int render_height = 512;
|
||||
|
||||
tinyusdz::Stage stage;
|
||||
std::string filename;
|
||||
//tinyusdz::Stage stage;
|
||||
std::string usd_filename;
|
||||
|
||||
// RenderScene: Scene graph object which is suited for GL/Vulkan renderer.
|
||||
// Constructed from `tinyusdz::Stage`
|
||||
@@ -308,17 +315,20 @@ bool LoadModel(const std::string& filename, /* out */tinyusdz::Stage* stage) {
|
||||
std::string warn;
|
||||
std::string err;
|
||||
|
||||
bool ret = tinyusdz::LoadUSDFromFile(filename, stage, &warn, &err);
|
||||
if (!warn.empty()) {
|
||||
std::cerr << "WARN : " << warn << "\n";
|
||||
if (!tinyusdz::IsUSD(filename)) {
|
||||
std::cerr << "ERR: file not found or file is not USD format : " << filename << "\n";
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!err.empty()) {
|
||||
std::cerr << "ERR : " << err << "\n";
|
||||
bool ret = tinyusdz::LoadUSDFromFile(filename, stage, &warn, &err);
|
||||
if (warn.size()) {
|
||||
std::cerr << "WARN : " << warn << "\n";
|
||||
}
|
||||
|
||||
if (!ret) {
|
||||
std::cerr << "Failed to load USD file: " << filename << "\n";
|
||||
if (!err.empty()) {
|
||||
std::cerr << "ERR : " << err << "\n";
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -334,11 +344,11 @@ void RenderThread(GUIContext* ctx) {
|
||||
}
|
||||
|
||||
if (ctx->request_reload) {
|
||||
ctx->stage = tinyusdz::Stage(); // reset
|
||||
//ctx->stage = tinyusdz::Stage(); // reset
|
||||
|
||||
#if 0 // TODO
|
||||
if (LoadModel(ctx->filename, &ctx->stage)) {
|
||||
Proc(ctx->stage);
|
||||
#if 0
|
||||
if (ctx->scene.geom_meshes.empty()) {
|
||||
std::cerr << "The scene contains no GeomMesh\n";
|
||||
} else {
|
||||
@@ -356,8 +366,8 @@ void RenderThread(GUIContext* ctx) {
|
||||
}
|
||||
std::cout << "Setup render mesh\n";
|
||||
}
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
ctx->request_reload = false;
|
||||
|
||||
@@ -370,7 +380,7 @@ void RenderThread(GUIContext* ctx) {
|
||||
continue;
|
||||
}
|
||||
|
||||
//example::Render(ctx->render_scene, ctx->camera, &ctx->aov);
|
||||
example::Render(ctx->rt_render_scene, ctx->camera, &ctx->aov);
|
||||
|
||||
ctx->update_texture = true;
|
||||
|
||||
@@ -746,14 +756,9 @@ int main(int argc, char** argv) {
|
||||
filename = std::string(argv[1]);
|
||||
}
|
||||
|
||||
std::cout << "Loading file " << filename << "\n";
|
||||
|
||||
bool init_with_empty = false;
|
||||
|
||||
if (!LoadModel(filename, &g_gui_ctx.stage)) {
|
||||
init_with_empty = true;
|
||||
}
|
||||
g_gui_ctx.usd_filename = filename;
|
||||
|
||||
#if 0
|
||||
if (!init_with_empty) {
|
||||
std::cout << "Loaded USDC file\n";
|
||||
|
||||
@@ -763,6 +768,7 @@ int main(int argc, char** argv) {
|
||||
// exit(-1);
|
||||
//}
|
||||
}
|
||||
#endif
|
||||
|
||||
// Assume single monitor
|
||||
SDL_DisplayMode DM;
|
||||
@@ -818,17 +824,17 @@ int main(int argc, char** argv) {
|
||||
GUIContext& gui_ctx = g_gui_ctx;
|
||||
gui_ctx.renderer = renderer;
|
||||
|
||||
if (!init_with_empty) {
|
||||
if (gui_ctx.usd_filename.size()) {
|
||||
//for (size_t i = 0; i < g_gui_ctx.scene.geom_meshes.size(); i++) {
|
||||
// example::DrawGeomMesh draw_mesh(&g_gui_ctx.scene.geom_meshes[i]);
|
||||
// gui_ctx.render_scene.draw_meshes.push_back(draw_mesh);
|
||||
//}
|
||||
|
||||
// Setup render mesh
|
||||
//if (!gui_ctx.render_scene.Setup()) {
|
||||
// std::cerr << "Failed to setup render mesh.\n";
|
||||
// exit(-1);
|
||||
//}
|
||||
if (!gui_ctx.rt_render_scene.SetupFromUSDFile(gui_ctx.usd_filename)) {
|
||||
std::cerr << "Failed to setup render mesh.\n";
|
||||
exit(-1);
|
||||
}
|
||||
std::cout << "Setup render mesh\n";
|
||||
}
|
||||
|
||||
@@ -973,7 +979,7 @@ int main(int argc, char** argv) {
|
||||
std::string fname = filepath;
|
||||
|
||||
// Scene reloading is done in render thread.
|
||||
g_gui_ctx.filename = fname;
|
||||
g_gui_ctx.usd_filename = fname;
|
||||
g_gui_ctx.request_reload = true;
|
||||
|
||||
SDL_free(filepath);
|
||||
|
||||
@@ -3,7 +3,8 @@
|
||||
#include <cassert>
|
||||
#include <thread>
|
||||
|
||||
// tinyusdz Tydra
|
||||
// tinyusdz & Tydra
|
||||
#include "io-util.hh"
|
||||
#include "tydra/render-data.hh"
|
||||
|
||||
//
|
||||
@@ -494,7 +495,7 @@ void BuildCameraFrame(float3* origin, float3* corner, float3* u, float3* v,
|
||||
}
|
||||
}
|
||||
|
||||
bool Render(const RenderScene& scene, const Camera& cam, AOV* output) {
|
||||
bool Render(const RTRenderScene& scene, const Camera& cam, AOV* output) {
|
||||
int width = output->width;
|
||||
int height = output->height;
|
||||
|
||||
@@ -685,7 +686,7 @@ bool Render(const RenderScene& scene, const Camera& cam, AOV* output) {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool RenderLines(int start_y, int end_y, const RenderScene& scene,
|
||||
bool RenderLines(int start_y, int end_y, const RTRenderScene& scene,
|
||||
const Camera& cam, AOV* output) {
|
||||
int width = output->width;
|
||||
int height = output->height;
|
||||
@@ -840,14 +841,32 @@ bool RenderLines(int start_y, int end_y, const RenderScene& scene,
|
||||
return true;
|
||||
}
|
||||
|
||||
bool RenderScene::SetupFromUSDFile(const std::string &usd_filename) {
|
||||
bool RTRenderScene::SetupFromUSDFile(const std::string &usd_filename) {
|
||||
|
||||
if (!tinyusdz::IsUSD(usd_filename)) {
|
||||
std::cerr << "File not found or not a USD file: " << usd_filename << "\n";
|
||||
return false;
|
||||
}
|
||||
|
||||
std::string warn, err;
|
||||
tinyusdz::Stage stage;
|
||||
bool ret = tinyusdz::LoadUSDFromFile(usd_filename, &stage, &warn, &err);
|
||||
if (warn.size()) {
|
||||
std::cout << "WARN: " << warn << "\n";
|
||||
}
|
||||
|
||||
if (!ret) {
|
||||
std::cerr << "USD load error: " << err << "\n";
|
||||
return false;
|
||||
}
|
||||
|
||||
warn.clear();
|
||||
|
||||
// Convert USD Scene(Stage) to Vulkan-friendly scene data using TinyUSDZ Tydra
|
||||
tinyusdz::tydra::RenderScene render_scene;
|
||||
tinyusdz::tydra::RenderSceneConverter converter;
|
||||
tinyusdz::tydra::RenderSceneConverterEnv env(stage);
|
||||
|
||||
std::string warn, err;
|
||||
|
||||
bool is_usdz = tinyusdz::IsUSDZ(usd_filename);
|
||||
|
||||
@@ -868,7 +887,7 @@ bool RenderScene::SetupFromUSDFile(const std::string &usd_filename) {
|
||||
// Setup AssetResolutionResolver to read a asset(file) from memory.
|
||||
if (!tinyusdz::ReadUSDZAssetInfoFromFile(usd_filename, &usdz_asset, &warn, &err )) {
|
||||
std::cerr << "Failed to read USDZ assetInfo from file: " << err << "\n";
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (warn.size()) {
|
||||
@@ -880,7 +899,7 @@ bool RenderScene::SetupFromUSDFile(const std::string &usd_filename) {
|
||||
// NOTE: Pointer address of usdz_asset must be valid until the call of RenderSce neConverter::ConvertToRenderScene.
|
||||
if (!tinyusdz::SetupUSDZAssetResolution(arr, &usdz_asset)) {
|
||||
std::cerr << "Failed to setup AssetResolution for USDZ asset\n";
|
||||
return;
|
||||
return false;
|
||||
};
|
||||
|
||||
env.asset_resolver = arr;
|
||||
@@ -890,10 +909,10 @@ bool RenderScene::SetupFromUSDFile(const std::string &usd_filename) {
|
||||
}
|
||||
|
||||
env.timecode = tinyusdz::value::TimeCode::Default();
|
||||
bool ret = converter.ConvertToRenderScene(env, &render_scene);
|
||||
ret = converter.ConvertToRenderScene(env, &render_scene);
|
||||
if (!ret) {
|
||||
std::cerr << "Failed to convert USD Stage to RenderScene: \n" << converter.GetError() << "\n";
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (converter.GetWarning().size()) {
|
||||
|
||||
@@ -4,7 +4,9 @@
|
||||
|
||||
#include "nanort.h"
|
||||
#include "nanosg.h"
|
||||
//
|
||||
#include "tinyusdz.hh"
|
||||
#include "tydra/render-data.hh"
|
||||
|
||||
namespace example {
|
||||
|
||||
@@ -201,7 +203,7 @@ struct Image {
|
||||
int32_t channels{-1}; // e.g. 3 for RGB.
|
||||
};
|
||||
|
||||
class RenderScene {
|
||||
class RTRenderScene {
|
||||
public:
|
||||
std::vector<DrawGeomMesh> draw_meshes;
|
||||
std::vector<Material> materials;
|
||||
@@ -211,15 +213,14 @@ class RenderScene {
|
||||
std::vector<nanosg::Node<float, DrawGeomMesh>> nodes;
|
||||
nanosg::Scene<float, DrawGeomMesh> scene;
|
||||
|
||||
// Convert scene and build BVH
|
||||
bool SetupFromStage(const tinyusdz::Stage &stage);
|
||||
bool SetupFromUSDFile(const std::string &usd_filename);
|
||||
};
|
||||
|
||||
bool Render(const RenderScene &scene, const Camera &cam, AOV *output);
|
||||
bool Render(const RTRenderScene &scene, const Camera &cam, AOV *output);
|
||||
|
||||
// Render images for lines [start_y, end_y]
|
||||
// single-threaded. for webassembly.
|
||||
bool RenderLines(int start_y, int end_y, const RenderScene &scene,
|
||||
bool RenderLines(int start_y, int end_y, const RTRenderScene &scene,
|
||||
const Camera &cam, AOV *output);
|
||||
|
||||
} // namespace example
|
||||
|
||||
Reference in New Issue
Block a user