改用遍历Component法创建BoundingBox

This commit is contained in:
2025-07-09 21:18:11 +08:00
parent 51e043f07d
commit b0fd716af9

View File

@@ -55,7 +55,7 @@ private:
MeshComponentData *data; MeshComponentData *data;
ComponentDataPtr cdp; ComponentDataPtr cdp;
MeshComponent *component[7]; MeshComponent *component;
public: public:
@@ -204,8 +204,8 @@ private:
tci.innerRadius=0.9; tci.innerRadius=0.9;
tci.outerRadius=1.1; tci.outerRadius=1.1;
tci.numberSlices=64; tci.numberSlices=128;
tci.numberStacks=8; tci.numberStacks=16;
rm_torus=CreateRenderMesh(CreateTorus(prim_creater,&tci),&solid,4); rm_torus=CreateRenderMesh(CreateTorus(prim_creater,&tci),&solid,4);
} }
@@ -234,17 +234,14 @@ private:
{ {
cci.mat=ScaleMatrix(10,10,1); cci.mat=ScaleMatrix(10,10,1);
//rm_plane->component=CreateComponent<MeshComponent>(&cci,rm_plane->cdp); rm_plane->component=CreateComponent<MeshComponent>(&cci,rm_plane->cdp);
} }
{ {
for(int i=0;i<6;i++) cci.mat=AxisYRotate(deg2rad(90.0f));
{
cci.mat=AxisYRotate(deg2rad(i*30.0f))*ScaleMatrix((i+1)*1.0f);
rm_torus->component[i]=CreateComponent<MeshComponent>(&cci,rm_torus->cdp); rm_torus->component=CreateComponent<MeshComponent>(&cci,rm_torus->cdp);
rm_torus->component[i]->SetOverrideMaterial(solid.mi[i]); rm_torus->component->SetOverrideMaterial(solid.mi[1]);
}
} }
return(true); return(true);
@@ -252,18 +249,33 @@ private:
bool InitBoundingBoxScene() bool InitBoundingBoxScene()
{ {
CreateComponentInfo cci(GetSceneRoot()); SceneNode *root=GetSceneRoot();
OBB obb; CreateComponentInfo cci(root);
for(int i=0;i<6;i++) ArrayList<Matrix4f> box_matrices;
for(Component *c:root->GetComponents())
{ {
MeshComponent *component=rm_torus->component[i]; if(c->GetTypeHash()!=MeshComponent::StaticTypeHash())
if(!component->GetWorldOBBMatrix(cci.mat))
continue; continue;
auto *box_component=CreateComponent<MeshComponent>(&cci,rm_box->cdp); MeshComponent *component=(MeshComponent *)c;
Matrix4f mat;
if(component->GetWorldOBBMatrix(mat))
box_matrices.Add(mat);
}
//不可以直接在上面的循环中创建新的Component因为循环本身就要读取Component列表
for(const Matrix4f &mat:box_matrices)
{
cci.mat=mat;
if(!CreateComponent<MeshComponent>(&cci,rm_box->cdp))
return(false);
} }
return(true); return(true);