From 91f281229b765ff3aa889ce59872bce5232b8caf Mon Sep 17 00:00:00 2001 From: cutealien Date: Thu, 29 Sep 2022 14:12:12 +0000 Subject: [PATCH] Fix: Make CBillboardSceneNode bounding-box large enough to fit the billboard inside. It still won't work yet for scaled boundingboxes (or parents being scaled). But at least it's now large enough for typical unscaled boundingboxes. Before it was always too small - even for the simplest quadratic billboard case seen without rotation. Now it's always a bit too large, but that's way less of a problem (collisions still work and culling simply happens a bit less often, but not too often which is way worse) git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6431 dfc29bdd-3216-0410-991c-e03cc46cb475 --- source/Irrlicht/CBillboardSceneNode.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/source/Irrlicht/CBillboardSceneNode.cpp b/source/Irrlicht/CBillboardSceneNode.cpp index 9eddb98..d4193d3 100644 --- a/source/Irrlicht/CBillboardSceneNode.cpp +++ b/source/Irrlicht/CBillboardSceneNode.cpp @@ -143,7 +143,7 @@ void CBillboardSceneNode::updateMesh(const irr::scene::ICameraSceneNode* camera) //! returns the axis aligned bounding box of this node const core::aabbox3d& CBillboardSceneNode::getBoundingBox() const { - // Really wrong when scaled. + // Really wrong when scaled (as the node does not scale it's vertices - maybe it should?) return BBoxSafe; } @@ -164,9 +164,9 @@ void CBillboardSceneNode::setSize(const core::dimension2d& size) if (core::equals(Size.Height, 0.0f)) Size.Height = 1.0f; - const f32 avg = (Size.Width + Size.Height)/6; - BBoxSafe.MinEdge.set(-avg,-avg,-avg); - BBoxSafe.MaxEdge.set(avg,avg,avg); + const f32 extent = 0.5f*sqrt(Size.Width*Size.Width + Size.Height*Size.Height); + BBoxSafe.MinEdge.set(-extent,-extent,-extent); + BBoxSafe.MaxEdge.set(extent,extent,extent); } @@ -184,9 +184,9 @@ void CBillboardSceneNode::setSize(f32 height, f32 bottomEdgeWidth, f32 topEdgeWi TopEdgeWidth = 1.0f; } - const f32 avg = (core::max_(Size.Width,TopEdgeWidth) + Size.Height)/6; - BBoxSafe.MinEdge.set(-avg,-avg,-avg); - BBoxSafe.MaxEdge.set(avg,avg,avg); + const f32 extent = 0.5f*sqrt(Size.Width*Size.Width + Size.Height*Size.Height); + BBoxSafe.MinEdge.set(-extent,-extent,-extent); + BBoxSafe.MaxEdge.set(extent,extent,extent); }