From f9f2d617a219b9d51c953bb5a8ede7b50d59e8d9 Mon Sep 17 00:00:00 2001 From: Trevor David Black Date: Fri, 17 Apr 2020 10:42:13 -0700 Subject: [PATCH] Added a very basic camera. Still work to do --- code/Pbrt/PbrtExporter.cpp | 117 +++++++++++++++++++++++++++++++++++-- code/Pbrt/PbrtExporter.h | 12 +++- 2 files changed, 121 insertions(+), 8 deletions(-) diff --git a/code/Pbrt/PbrtExporter.cpp b/code/Pbrt/PbrtExporter.cpp index 1ce73e07e..b65d1e057 100644 --- a/code/Pbrt/PbrtExporter.cpp +++ b/code/Pbrt/PbrtExporter.cpp @@ -114,8 +114,11 @@ PbrtExporter::PbrtExporter ( // Write metadata to file WriteMetaData(); - // Write preamble - WritePreamble(); + // Write scene-wide rendering options + WriteSceneWide(); + + // Write geometry + WriteGeometry(); // Write World Description WriteWorldDefinition(); @@ -127,6 +130,9 @@ PbrtExporter::PbrtExporter ( // explicitly release file pointer, // so we don't have to rely on class destruction. outfile.reset(); + + // TODO Prettify the output + // TODO Do Animation } // Destructor @@ -135,7 +141,7 @@ PbrtExporter::~PbrtExporter() { } void PbrtExporter::WriteHeader() { - + // TODO } void PbrtExporter::WriteMetaData() { @@ -189,20 +195,119 @@ void PbrtExporter::WriteMetaData() { break; } case AI_AIVECTOR3D : - + // TODO + mOutput << " Vector3D (unable to print)" << std::endl; + break; + default: + // AI_META_MAX and FORCE_32BIT + mOutput << " META_MAX or FORCE_32Bit (unable to print)" << std::endl; break; } - mOutput << std::endl; } } -void PbrtExporter::WritePreamble() { +void PbrtExporter::WriteSceneWide() { + // Cameras + WriteCameras(); + // Samplers + + // Film + + // Filters + + // Integrators + + // Accelerators + + // Participating Media } void PbrtExporter::WriteWorldDefinition() { } +void PbrtExporter::WriteCameras() { + mOutput << std::endl; + mOutput << "# Writing Camera data:" << std::endl; + mOutput << "# - Number of Cameras found in scene: "; + mOutput << mScene->mNumCameras << std::endl; + + if (mScene->mNumCameras == 0){ + mOutput << "# - No Cameras found in the scene" << std::endl; + return; + } + + if (mScene->mNumCameras > 1) { + mOutput << "# - Multiple Cameras found in scene" << std::endl; + mOutput << "# - Defaulting to first Camera specified" << std::endl; + } + + for(int i = 0; i < mScene->mNumCameras; i++){ + WriteCamera(i); + } +} + +void PbrtExporter::WriteCamera(int i) { + auto camera = mScene->mCameras[i]; + bool cameraActive = i == 0; + + mOutput << "# - Camera " << i+1 << ": " + << camera->mName.C_Str() << std::endl; + + // Get camera aspect ratio + // IMMEDIATELY + + // Get camera hfov + if (!cameraActive) + mOutput << "# "; + mOutput << "\"float hfov_" << camera->mName.C_Str() << "\" [" + << AI_RAD_TO_DEG(camera->mHorizontalFOV) + << "]" << std::endl; + + // Get Camera clipping planes? + // TODO + + // Get camera transform + // Isn't optimally efficient, but is the simplest implementation + // Get camera node + auto cameraNode = mScene->mRootNode->FindNode(camera->mName); + + if (!cameraNode) { + mOutput << "# ERROR: Camera declared but not found in scene tree" << std::endl; + } + else { + std::vector matrixChain; + auto tempNode = cameraNode; + while(tempNode) { + matrixChain.insert(matrixChain.begin(), tempNode->mTransformation); + tempNode = tempNode->mParent; + } + + aiMatrix4x4 w2c = matrixChain[0]; + for(int i = 1; i < matrixChain.size(); i++){ + w2c *= matrixChain[i]; + } + + if (!cameraActive) + mOutput << "# "; + + mOutput << "Transform " + << w2c.a1 << " " << w2c.a2 << " " << w2c.a3 << " " << w2c.a4 << " " + << w2c.b1 << " " << w2c.b2 << " " << w2c.b3 << " " << w2c.b4 << " " + << w2c.c1 << " " << w2c.c2 << " " << w2c.c3 << " " << w2c.c4 << " " + << w2c.d1 << " " << w2c.d2 << " " << w2c.d3 << " " << w2c.d4 + << std::endl; + } + + // Print camera descriptor + +} + + +void PbrtExporter::WriteGeometry() { + +} + #endif // ASSIMP_BUILD_NO_PBRT_EXPORTER #endif // ASSIMP_BUILD_NO_EXPORT diff --git a/code/Pbrt/PbrtExporter.h b/code/Pbrt/PbrtExporter.h index a8b8a9ba8..cd48f5cfa 100644 --- a/code/Pbrt/PbrtExporter.h +++ b/code/Pbrt/PbrtExporter.h @@ -105,11 +105,19 @@ private: // Writing the metadata into a comment void WriteMetaData(); - // Writing the pbrt file preamble - void WritePreamble(); + // Writing the pbrt scene-wide rendering options + void WriteSceneWide(); + + // Writing the geometry to distinct files + void WriteGeometry(); // Writing the pbrt world defintion void WriteWorldDefinition(); + + + // Writing the Camera data + void WriteCameras(); + void WriteCamera(int i); }; } // namespace Assimp