mirror of
https://github.com/minetest/irrlicht.git
synced 2024-12-24 17:50:31 +01:00
Allow nodes ignoring parent transformations with ESNUA_RELATIVE
New AbsPosUpdateBehavior which makes updateAbsolutePosition calls behave as if a node had no parent. Allows for micro optimizations in cases where we have non-moving root node (all scenenodes are always added to the SceneManager which is generally not moved but it's transformation is still multiplied each frame for each node) As a side-effect this also allows abusing the SceneManager to group objects without affecting transformations. No real extra cost since I added ESNUA_TRANSFORM_POSITION already. Thought turns out those matrix transformations are so fast that I also didn't noticed any difference in tests with > 20.000 nodes. git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6481 dfc29bdd-3216-0410-991c-e03cc46cb475
This commit is contained in:
parent
1b4912fcc4
commit
04d814ee31
@ -17,7 +17,11 @@ namespace scene
|
||||
//! Only transform the position of the node transformation matrix
|
||||
//! by the parent transformation matrix.
|
||||
//! Parent will not affect the rotation/scale of the node transformation.
|
||||
ESNUA_TRANSFORM_POSITION
|
||||
ESNUA_TRANSFORM_POSITION,
|
||||
|
||||
//! Use the relative matrix as absolute transformation matrix
|
||||
//! Parent node transformation is ignored just like when the parent is set to 0
|
||||
ESNUA_RELATIVE
|
||||
};
|
||||
|
||||
//! Names for culling type
|
||||
@ -25,6 +29,7 @@ namespace scene
|
||||
{
|
||||
"matrix",
|
||||
"pos",
|
||||
"relative",
|
||||
0
|
||||
};
|
||||
|
||||
|
@ -79,7 +79,7 @@ namespace scene
|
||||
|
||||
//! This method is called just before the rendering process of the whole scene.
|
||||
/** Nodes may register themselves in the render pipeline during this call,
|
||||
precalculate the geometry which should be rendered, and prevent their
|
||||
pre-calculate the geometry which should be rendered, and prevent their
|
||||
children from being able to register themselves if they are clipped by simply
|
||||
not calling their OnRegisterSceneNode method.
|
||||
If you are implementing your own scene node, you should overwrite this method
|
||||
@ -543,7 +543,7 @@ namespace scene
|
||||
|
||||
|
||||
//! Set a culling style or disable culling completely.
|
||||
/** Box cullling (EAC_BOX) is set by default. Note that not
|
||||
/** Box culling (EAC_BOX) is set by default. Note that not
|
||||
all SceneNodes support culling and that some nodes always cull
|
||||
their geometry because it is their only reason for existence,
|
||||
for example the OctreeSceneNode.
|
||||
@ -682,16 +682,24 @@ namespace scene
|
||||
{
|
||||
if (Parent)
|
||||
{
|
||||
if ( AbsPosUpdateBehavior == ESNUA_TRANSFORM_MATRIX )
|
||||
switch ( AbsPosUpdateBehavior )
|
||||
{
|
||||
case ESNUA_TRANSFORM_MATRIX:
|
||||
{
|
||||
AbsoluteTransformation =
|
||||
Parent->getAbsoluteTransformation() * getRelativeTransformation();
|
||||
}
|
||||
else if ( AbsPosUpdateBehavior == ESNUA_TRANSFORM_POSITION )
|
||||
break;
|
||||
case ESNUA_TRANSFORM_POSITION:
|
||||
{
|
||||
AbsoluteTransformation = getRelativeTransformation();
|
||||
Parent->getAbsoluteTransformation().transformVect(reinterpret_cast<irr::core::vector3df&>(AbsoluteTransformation[12]));
|
||||
}
|
||||
break;
|
||||
case ESNUA_RELATIVE:
|
||||
AbsoluteTransformation = getRelativeTransformation();
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
AbsoluteTransformation = getRelativeTransformation();
|
||||
|
@ -1,4 +1,4 @@
|
||||
Tests finished. 72 tests of 72 passed.
|
||||
Compiled as DEBUG
|
||||
Test suite pass at GMT Fri Apr 28 17:44:32 2023
|
||||
Test suite pass at GMT Tue May 02 15:59:37 2023
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user