added best bbox calc using instance world space xforms to do zoomextents
This commit is contained in:
parent
5c593ed0f9
commit
3a618bb112
@ -171,6 +171,7 @@ The 't' field in the snapshot's 's.id' dictionary indicates the type of snapshot
|
||||
*/
|
||||
|
||||
#include <iostream> // For input/output operations (cout, cin, etc.)
|
||||
#include <limits> // For std::numeric_limits
|
||||
|
||||
// Bella SDK includes - external libraries for 3D rendering
|
||||
#include "../bella_engine_sdk/src/bella_sdk/bella_scene.h" // For creating and manipulating 3D scenes in Bella
|
||||
@ -352,7 +353,7 @@ int DL_main(dl::Args& args) {
|
||||
std::vector<std::vector<oom::vmax::RGBA>> vmaxPalettes; // one palette per model
|
||||
std::vector<std::array<oom::vmax::Material, 8>> vmaxMaterials; // one material per model
|
||||
|
||||
oom::bella::defaultScene2025(belScene); // create the basic scene elements in Bella
|
||||
//oom::bella::defaultScene2025(belScene); // create the basic scene elements in Bella
|
||||
|
||||
// Loop over each model defined in scene.json and process the first instance
|
||||
// This will be out canonical models, not instances
|
||||
@ -483,6 +484,47 @@ int DL_main(dl::Args& args) {
|
||||
}
|
||||
}
|
||||
|
||||
// Initialize bbox to "inverted infinity" so first point will always expand it
|
||||
dl::Aabb sceneBbox;
|
||||
sceneBbox.min = dl::Pos3::make(std::numeric_limits<double>::max(),
|
||||
std::numeric_limits<double>::max(),
|
||||
std::numeric_limits<double>::max());
|
||||
sceneBbox.max = dl::Pos3::make(std::numeric_limits<double>::lowest(),
|
||||
std::numeric_limits<double>::lowest(),
|
||||
std::numeric_limits<double>::lowest());
|
||||
int voxelCount = 0;
|
||||
|
||||
//
|
||||
auto worldPaths = belScene.world().paths(); // Scene Tree Loop
|
||||
for ( auto eachPath : worldPaths )
|
||||
{
|
||||
auto eachLeaf = eachPath.leaf();
|
||||
if ( !eachLeaf.isTypeOf( "instancer" ) )
|
||||
continue;
|
||||
voxelCount++;
|
||||
|
||||
auto instances = eachLeaf["steps"][0]["instances"].asBufferT<dl::Mat4f>(); // just need count
|
||||
for (dl::UInt i = 0; i < instances.count; ++i) {
|
||||
// Since we are dealing with 1x1x1 voxels
|
||||
// approximate by using center of voxel instance instead of 8 corners
|
||||
// for bbox calculation
|
||||
auto instanceXform = eachPath.transform(0.0,i); // feed InstanceIdx
|
||||
auto instancePos = dl::math::translation(instanceXform); // Extract translation directly
|
||||
|
||||
// No branch - always expand (faster for large instance counts)
|
||||
if (instancePos.x < sceneBbox.min.x) sceneBbox.min.x = instancePos.x;
|
||||
if (instancePos.y < sceneBbox.min.y) sceneBbox.min.y = instancePos.y;
|
||||
if (instancePos.z < sceneBbox.min.z) sceneBbox.min.z = instancePos.z;
|
||||
if (instancePos.x > sceneBbox.max.x) sceneBbox.max.x = instancePos.x;
|
||||
if (instancePos.y > sceneBbox.max.y) sceneBbox.max.y = instancePos.y;
|
||||
if (instancePos.z > sceneBbox.max.z) sceneBbox.max.z = instancePos.z;
|
||||
}
|
||||
}
|
||||
|
||||
auto center = ( sceneBbox.min.v3 + sceneBbox.max.v3 ) * 0.5;
|
||||
auto radius =dl::math::norm( sceneBbox.max - sceneBbox.min ) * 0.5;
|
||||
dl::bella_sdk::zoomExtents(belScene.cameraPath(), dl::Vec3{center.x, center.y, center.z}, radius);
|
||||
|
||||
// Write Bella File .bsz=compressed .bsa=ascii .bsx=binary
|
||||
belScene.write(bszName.buf());
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user