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
|
//! Only transform the position of the node transformation matrix
|
||||||
//! by the parent transformation matrix.
|
//! by the parent transformation matrix.
|
||||||
//! Parent will not affect the rotation/scale of the node transformation.
|
//! 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
|
//! Names for culling type
|
||||||
@ -25,6 +29,7 @@ namespace scene
|
|||||||
{
|
{
|
||||||
"matrix",
|
"matrix",
|
||||||
"pos",
|
"pos",
|
||||||
|
"relative",
|
||||||
0
|
0
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -79,7 +79,7 @@ namespace scene
|
|||||||
|
|
||||||
//! This method is called just before the rendering process of the whole 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,
|
/** 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
|
children from being able to register themselves if they are clipped by simply
|
||||||
not calling their OnRegisterSceneNode method.
|
not calling their OnRegisterSceneNode method.
|
||||||
If you are implementing your own scene node, you should overwrite this 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.
|
//! 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
|
all SceneNodes support culling and that some nodes always cull
|
||||||
their geometry because it is their only reason for existence,
|
their geometry because it is their only reason for existence,
|
||||||
for example the OctreeSceneNode.
|
for example the OctreeSceneNode.
|
||||||
@ -682,16 +682,24 @@ namespace scene
|
|||||||
{
|
{
|
||||||
if (Parent)
|
if (Parent)
|
||||||
{
|
{
|
||||||
if ( AbsPosUpdateBehavior == ESNUA_TRANSFORM_MATRIX )
|
switch ( AbsPosUpdateBehavior )
|
||||||
|
{
|
||||||
|
case ESNUA_TRANSFORM_MATRIX:
|
||||||
{
|
{
|
||||||
AbsoluteTransformation =
|
AbsoluteTransformation =
|
||||||
Parent->getAbsoluteTransformation() * getRelativeTransformation();
|
Parent->getAbsoluteTransformation() * getRelativeTransformation();
|
||||||
}
|
}
|
||||||
else if ( AbsPosUpdateBehavior == ESNUA_TRANSFORM_POSITION )
|
break;
|
||||||
|
case ESNUA_TRANSFORM_POSITION:
|
||||||
{
|
{
|
||||||
AbsoluteTransformation = getRelativeTransformation();
|
AbsoluteTransformation = getRelativeTransformation();
|
||||||
Parent->getAbsoluteTransformation().transformVect(reinterpret_cast<irr::core::vector3df&>(AbsoluteTransformation[12]));
|
Parent->getAbsoluteTransformation().transformVect(reinterpret_cast<irr::core::vector3df&>(AbsoluteTransformation[12]));
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
case ESNUA_RELATIVE:
|
||||||
|
AbsoluteTransformation = getRelativeTransformation();
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
AbsoluteTransformation = getRelativeTransformation();
|
AbsoluteTransformation = getRelativeTransformation();
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
Tests finished. 72 tests of 72 passed.
|
Tests finished. 72 tests of 72 passed.
|
||||||
Compiled as DEBUG
|
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