From d6afed4e8db6f7f51550083b2bd039e9d2157d58 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Sun, 6 Jul 2025 12:48:02 +0800 Subject: [PATCH] =?UTF-8?q?Gizmo=E6=94=B9=E6=88=90=E4=BD=BF=E7=94=A8Overri?= =?UTF-8?q?deMaterial=E8=AE=BE=E7=BD=AE=E9=A2=9C=E8=89=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMCore | 2 +- CMPlatform | 2 +- example/Gizmo/Gizmo.h | 3 +- example/Gizmo/Gizmo3DMove.cpp | 67 ++++++++++++++++----------------- example/Gizmo/GizmoResource.cpp | 50 +++++++++++------------- example/Gizmo/GizmoResource.h | 4 +- 6 files changed, 59 insertions(+), 69 deletions(-) diff --git a/CMCore b/CMCore index a3886669..25060b07 160000 --- a/CMCore +++ b/CMCore @@ -1 +1 @@ -Subproject commit a38866694c9b50b1b5fc1c01258469a19654d4cd +Subproject commit 25060b07d03d088b940f78ac1223f4888377f608 diff --git a/CMPlatform b/CMPlatform index bc5623e4..ea52f06e 160000 --- a/CMPlatform +++ b/CMPlatform @@ -1 +1 @@ -Subproject commit bc5623e4621e2957a6458f599a97c228fbd83d9a +Subproject commit ea52f06e72c27bf1039cc7c458cf52464a0a3108 diff --git a/example/Gizmo/Gizmo.h b/example/Gizmo/Gizmo.h index 6c11a4cc..da2209ba 100644 --- a/example/Gizmo/Gizmo.h +++ b/example/Gizmo/Gizmo.h @@ -35,7 +35,8 @@ enum class GizmoShape:uint bool InitGizmoResource(RenderFramework *); void FreeGizmoResource(); -ComponentDataPtr GetGizmoMeshCDP(const GizmoShape &shape,const GizmoColor &color); +MaterialInstance *GetGizmoMI(const GizmoColor &); +ComponentDataPtr GetGizmoMeshCDP(const GizmoShape &shape); SceneNode *GetGizmoMoveNode(); //SceneNode *GetGizmoScaleMesh(); diff --git a/example/Gizmo/Gizmo3DMove.cpp b/example/Gizmo/Gizmo3DMove.cpp index 1d60ba85..1c3bab36 100644 --- a/example/Gizmo/Gizmo3DMove.cpp +++ b/example/Gizmo/Gizmo3DMove.cpp @@ -71,40 +71,25 @@ namespace bool Init(RenderFramework *render_framework) { - ComponentDataPtr sphere_ptr=GetGizmoMeshCDP(GizmoShape::Sphere,GizmoColor::White); + ComponentDataPtr SpherePtr =GetGizmoMeshCDP(GizmoShape::Sphere); + ComponentDataPtr CylinderPtr=GetGizmoMeshCDP(GizmoShape::Cylinder); + ComponentDataPtr ConePtr =GetGizmoMeshCDP(GizmoShape::Cone); + ComponentDataPtr SquarePtr =GetGizmoMeshCDP(GizmoShape::Square); - #define GET_GIZMO_MESH_CDP(shape) ComponentDataPtr shape##Ptr[3]{ \ - GetGizmoMeshCDP(GizmoShape::shape,GizmoColor::Red), \ - GetGizmoMeshCDP(GizmoShape::shape,GizmoColor::Green), \ - GetGizmoMeshCDP(GizmoShape::shape,GizmoColor::Blue) \ - }; - - GET_GIZMO_MESH_CDP(Cylinder) - GET_GIZMO_MESH_CDP(Cone) - GET_GIZMO_MESH_CDP(Square) - - if(!sphere_ptr) - return(false); - - for(int i=0;i<3;i++) - { - if(!CylinderPtr[i]) - return(false); - - if(!ConePtr[i]) - return(false); - - if(!SquarePtr[i]) - return(false); - } + if(!SpherePtr )return(false); + if(!CylinderPtr )return(false); + if(!ConePtr )return(false); + if(!SquarePtr )return(false); CreateComponentInfo cci(this); - sphere=render_framework->CreateComponent(&cci,sphere_ptr); + sphere=render_framework->CreateComponent(&cci,SpherePtr); //中心球 + sphere->SetOverrideMaterial(GetGizmoMI(GizmoColor::White)); //白色 { Transform tm; GizmoMoveAxis *gma; + MaterialInstance *mi=nullptr; const Vector3f one_scale(1); const Vector3f square_scale(2); @@ -112,61 +97,73 @@ namespace { gma=axis+size_t(AXIS::Z); + mi=GetGizmoMI(GizmoColor::Blue); tm.SetScale(cylinder_scale); tm.SetTranslation(0,0,GIZMO_CYLINDER_OFFSET); cci.mat=tm; - gma->cylinder=render_framework->CreateComponent(&cci,CylinderPtr[2]); //Z 向上圆柱 + gma->cylinder=render_framework->CreateComponent(&cci,CylinderPtr); //Z 向上圆柱 + gma->cylinder->SetOverrideMaterial(mi); tm.SetScale(one_scale); tm.SetTranslation(0,0,GIZMO_CONE_OFFSET); cci.mat=tm; - gma->cone=render_framework->CreateComponent(&cci,ConePtr[2]); //Z 向上圆锥 + gma->cone=render_framework->CreateComponent(&cci,ConePtr); //Z 向上圆锥 + gma->cone->SetOverrideMaterial(mi); tm.SetScale(square_scale); tm.SetTranslation(GIZMO_TWO_AXIS_OFFSET,GIZMO_TWO_AXIS_OFFSET,0); cci.mat=tm; - gma->square=render_framework->CreateComponent(&cci,SquarePtr[2]); + gma->square=render_framework->CreateComponent(&cci,SquarePtr); + gma->square->SetOverrideMaterial(mi); } { gma=axis+size_t(AXIS::X); + mi=GetGizmoMI(GizmoColor::Red); tm.SetScale(cylinder_scale); tm.SetRotation(AxisVector::Y,90); tm.SetTranslation(GIZMO_CYLINDER_OFFSET,0,0); cci.mat=tm; - gma->cylinder=render_framework->CreateComponent(&cci,CylinderPtr[0]); //X 向右圆柱 + gma->cylinder=render_framework->CreateComponent(&cci,CylinderPtr); //X 向右圆柱 + gma->cylinder->SetOverrideMaterial(mi); tm.SetScale(one_scale); tm.SetTranslation(GIZMO_CONE_OFFSET,0,0); cci.mat=tm; - gma->cone=render_framework->CreateComponent(&cci,ConePtr[0]); //X 向右圆锥 + gma->cone=render_framework->CreateComponent(&cci,ConePtr); //Z 向上圆锥 + gma->cone->SetOverrideMaterial(mi); tm.SetScale(square_scale); tm.SetTranslation(0,GIZMO_TWO_AXIS_OFFSET,GIZMO_TWO_AXIS_OFFSET); cci.mat=tm; - gma->square=render_framework->CreateComponent(&cci,SquarePtr[0]); + gma->square=render_framework->CreateComponent(&cci,SquarePtr); + gma->square->SetOverrideMaterial(mi); } { gma=axis+size_t(AXIS::Y); + mi=GetGizmoMI(GizmoColor::Green); tm.SetScale(cylinder_scale); tm.SetRotation(AxisVector::X,-90); tm.SetTranslation(0,GIZMO_CYLINDER_OFFSET,0); cci.mat=tm; - gma->cylinder=render_framework->CreateComponent(&cci,CylinderPtr[1]); //Y 向前圆柱 + gma->cylinder=render_framework->CreateComponent(&cci,CylinderPtr); //X 向右圆柱 + gma->cylinder->SetOverrideMaterial(mi); tm.SetScale(one_scale); tm.SetTranslation(0,GIZMO_CONE_OFFSET,0); cci.mat=tm; - gma->cone=render_framework->CreateComponent(&cci,ConePtr[1]); //Y 向前圆锥 + gma->cone=render_framework->CreateComponent(&cci,ConePtr); //Z 向上圆锥 + gma->cone->SetOverrideMaterial(mi); tm.SetScale(square_scale); tm.SetTranslation(GIZMO_TWO_AXIS_OFFSET,0,GIZMO_TWO_AXIS_OFFSET); cci.mat=tm; - gma->square=render_framework->CreateComponent(&cci,SquarePtr[1]); + gma->square=render_framework->CreateComponent(&cci,SquarePtr); + gma->square->SetOverrideMaterial(mi); } } diff --git a/example/Gizmo/GizmoResource.cpp b/example/Gizmo/GizmoResource.cpp index fe0b2860..ac6eb841 100644 --- a/example/Gizmo/GizmoResource.cpp +++ b/example/Gizmo/GizmoResource.cpp @@ -28,11 +28,11 @@ namespace { static RenderFramework *render_framework=nullptr; static RenderResource * gizmo_rr=nullptr; + static MaterialInstance *gizmo_mi[size_t(GizmoColor::RANGE_SIZE)]{}; struct GizmoResource { Material * mtl; - MaterialInstance * mi[size_t(GizmoColor::RANGE_SIZE)]; Pipeline * pipeline; VertexDataManager * vdm; @@ -46,21 +46,9 @@ namespace { Primitive *prim; - struct - { - Mesh *mesh; - MeshComponentData *mcd; - ComponentDataPtr cdp; - - public: - - void Create(Primitive *prim,MaterialInstance *mi,Pipeline *ppl) - { - mesh=CreateMesh(prim,mi,ppl); - mcd=new MeshComponentData(mesh); - cdp=mcd; - } - }mesh_data[size_t(GizmoColor::RANGE_SIZE)]; + Mesh *mesh; + MeshComponentData *mcd; + ComponentDataPtr cdp; public: @@ -68,19 +56,16 @@ namespace { prim=p; - for(uint i=0;imi[i]=gizmo_rr->CreateMaterialInstance(gr->mtl,nullptr,&color); - if(!gr->mi[i]) + gizmo_mi[i]=gizmo_rr->CreateMaterialInstance(gr->mtl,nullptr,&color); + + if(!gizmo_mi[i]) return(false); } @@ -338,15 +324,21 @@ void FreeGizmoResource() SAFE_CLEAR(gizmo_line.vdm); } -ComponentDataPtr GetGizmoMeshCDP(const GizmoShape &shape,const GizmoColor &color) +MaterialInstance *GetGizmoMI(const GizmoColor &color) +{ + RANGE_CHECK_RETURN_NULLPTR(color) + + return gizmo_mi[size_t(color)]; +} + +ComponentDataPtr GetGizmoMeshCDP(const GizmoShape &shape) { if(!gizmo_rr) return(nullptr); RANGE_CHECK_RETURN_NULLPTR(shape) - RANGE_CHECK_RETURN_NULLPTR(color) - return gizmo_mesh[size_t(shape)].mesh_data[size_t(color)].cdp; + return gizmo_mesh[size_t(shape)].cdp; } VK_NAMESPACE_END diff --git a/example/Gizmo/GizmoResource.h b/example/Gizmo/GizmoResource.h index d4b518da..1e00a87b 100644 --- a/example/Gizmo/GizmoResource.h +++ b/example/Gizmo/GizmoResource.h @@ -11,8 +11,8 @@ class MeshComponent; constexpr const COLOR gizmo_color[size_t(GizmoColor::RANGE_SIZE)]= { - COLOR::MozillaCharcoal, - COLOR::BlanchedAlmond, + COLOR::MozillaCharcoal, ///<黑色 + COLOR::AntiqueWhite, ///<白色 COLOR::BlenderAxisRed, COLOR::BlenderAxisGreen,