Added a very basic camera. Still work to do
parent
3ad53ab630
commit
f9f2d617a2
|
@ -114,8 +114,11 @@ PbrtExporter::PbrtExporter (
|
||||||
// Write metadata to file
|
// Write metadata to file
|
||||||
WriteMetaData();
|
WriteMetaData();
|
||||||
|
|
||||||
// Write preamble
|
// Write scene-wide rendering options
|
||||||
WritePreamble();
|
WriteSceneWide();
|
||||||
|
|
||||||
|
// Write geometry
|
||||||
|
WriteGeometry();
|
||||||
|
|
||||||
// Write World Description
|
// Write World Description
|
||||||
WriteWorldDefinition();
|
WriteWorldDefinition();
|
||||||
|
@ -127,6 +130,9 @@ PbrtExporter::PbrtExporter (
|
||||||
// explicitly release file pointer,
|
// explicitly release file pointer,
|
||||||
// so we don't have to rely on class destruction.
|
// so we don't have to rely on class destruction.
|
||||||
outfile.reset();
|
outfile.reset();
|
||||||
|
|
||||||
|
// TODO Prettify the output
|
||||||
|
// TODO Do Animation
|
||||||
}
|
}
|
||||||
|
|
||||||
// Destructor
|
// Destructor
|
||||||
|
@ -135,7 +141,7 @@ PbrtExporter::~PbrtExporter() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void PbrtExporter::WriteHeader() {
|
void PbrtExporter::WriteHeader() {
|
||||||
|
// TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
void PbrtExporter::WriteMetaData() {
|
void PbrtExporter::WriteMetaData() {
|
||||||
|
@ -189,20 +195,119 @@ void PbrtExporter::WriteMetaData() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case AI_AIVECTOR3D :
|
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;
|
break;
|
||||||
}
|
}
|
||||||
mOutput << std::endl;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void PbrtExporter::WritePreamble() {
|
void PbrtExporter::WriteSceneWide() {
|
||||||
|
// Cameras
|
||||||
|
WriteCameras();
|
||||||
|
|
||||||
|
// Samplers
|
||||||
|
|
||||||
|
// Film
|
||||||
|
|
||||||
|
// Filters
|
||||||
|
|
||||||
|
// Integrators
|
||||||
|
|
||||||
|
// Accelerators
|
||||||
|
|
||||||
|
// Participating Media
|
||||||
}
|
}
|
||||||
|
|
||||||
void PbrtExporter::WriteWorldDefinition() {
|
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<aiMatrix4x4> 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_PBRT_EXPORTER
|
||||||
#endif // ASSIMP_BUILD_NO_EXPORT
|
#endif // ASSIMP_BUILD_NO_EXPORT
|
||||||
|
|
|
@ -105,11 +105,19 @@ private:
|
||||||
// Writing the metadata into a comment
|
// Writing the metadata into a comment
|
||||||
void WriteMetaData();
|
void WriteMetaData();
|
||||||
|
|
||||||
// Writing the pbrt file preamble
|
// Writing the pbrt scene-wide rendering options
|
||||||
void WritePreamble();
|
void WriteSceneWide();
|
||||||
|
|
||||||
|
// Writing the geometry to distinct files
|
||||||
|
void WriteGeometry();
|
||||||
|
|
||||||
// Writing the pbrt world defintion
|
// Writing the pbrt world defintion
|
||||||
void WriteWorldDefinition();
|
void WriteWorldDefinition();
|
||||||
|
|
||||||
|
|
||||||
|
// Writing the Camera data
|
||||||
|
void WriteCameras();
|
||||||
|
void WriteCamera(int i);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Assimp
|
} // namespace Assimp
|
||||||
|
|
Loading…
Reference in New Issue