Gizmo改成使用OverrideMaterial设置颜色

This commit is contained in:
2025-07-06 12:48:02 +08:00
parent 397dffaf50
commit d6afed4e8d
6 changed files with 59 additions and 69 deletions

2
CMCore

Submodule CMCore updated: a38866694c...25060b07d0

View File

@@ -35,7 +35,8 @@ enum class GizmoShape:uint
bool InitGizmoResource(RenderFramework *); bool InitGizmoResource(RenderFramework *);
void FreeGizmoResource(); void FreeGizmoResource();
ComponentDataPtr GetGizmoMeshCDP(const GizmoShape &shape,const GizmoColor &color); MaterialInstance *GetGizmoMI(const GizmoColor &);
ComponentDataPtr GetGizmoMeshCDP(const GizmoShape &shape);
SceneNode *GetGizmoMoveNode(); SceneNode *GetGizmoMoveNode();
//SceneNode *GetGizmoScaleMesh(); //SceneNode *GetGizmoScaleMesh();

View File

@@ -71,40 +71,25 @@ namespace
bool Init(RenderFramework *render_framework) 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]{ \ if(!SpherePtr )return(false);
GetGizmoMeshCDP(GizmoShape::shape,GizmoColor::Red), \ if(!CylinderPtr )return(false);
GetGizmoMeshCDP(GizmoShape::shape,GizmoColor::Green), \ if(!ConePtr )return(false);
GetGizmoMeshCDP(GizmoShape::shape,GizmoColor::Blue) \ if(!SquarePtr )return(false);
};
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);
}
CreateComponentInfo cci(this); CreateComponentInfo cci(this);
sphere=render_framework->CreateComponent<MeshComponent>(&cci,sphere_ptr); sphere=render_framework->CreateComponent<MeshComponent>(&cci,SpherePtr); //中心球
sphere->SetOverrideMaterial(GetGizmoMI(GizmoColor::White)); //白色
{ {
Transform tm; Transform tm;
GizmoMoveAxis *gma; GizmoMoveAxis *gma;
MaterialInstance *mi=nullptr;
const Vector3f one_scale(1); const Vector3f one_scale(1);
const Vector3f square_scale(2); const Vector3f square_scale(2);
@@ -112,61 +97,73 @@ namespace
{ {
gma=axis+size_t(AXIS::Z); gma=axis+size_t(AXIS::Z);
mi=GetGizmoMI(GizmoColor::Blue);
tm.SetScale(cylinder_scale); tm.SetScale(cylinder_scale);
tm.SetTranslation(0,0,GIZMO_CYLINDER_OFFSET); tm.SetTranslation(0,0,GIZMO_CYLINDER_OFFSET);
cci.mat=tm; cci.mat=tm;
gma->cylinder=render_framework->CreateComponent<MeshComponent>(&cci,CylinderPtr[2]); //Z 向上圆柱 gma->cylinder=render_framework->CreateComponent<MeshComponent>(&cci,CylinderPtr); //Z 向上圆柱
gma->cylinder->SetOverrideMaterial(mi);
tm.SetScale(one_scale); tm.SetScale(one_scale);
tm.SetTranslation(0,0,GIZMO_CONE_OFFSET); tm.SetTranslation(0,0,GIZMO_CONE_OFFSET);
cci.mat=tm; cci.mat=tm;
gma->cone=render_framework->CreateComponent<MeshComponent>(&cci,ConePtr[2]); //Z 向上圆锥 gma->cone=render_framework->CreateComponent<MeshComponent>(&cci,ConePtr); //Z 向上圆锥
gma->cone->SetOverrideMaterial(mi);
tm.SetScale(square_scale); tm.SetScale(square_scale);
tm.SetTranslation(GIZMO_TWO_AXIS_OFFSET,GIZMO_TWO_AXIS_OFFSET,0); tm.SetTranslation(GIZMO_TWO_AXIS_OFFSET,GIZMO_TWO_AXIS_OFFSET,0);
cci.mat=tm; cci.mat=tm;
gma->square=render_framework->CreateComponent<MeshComponent>(&cci,SquarePtr[2]); gma->square=render_framework->CreateComponent<MeshComponent>(&cci,SquarePtr);
gma->square->SetOverrideMaterial(mi);
} }
{ {
gma=axis+size_t(AXIS::X); gma=axis+size_t(AXIS::X);
mi=GetGizmoMI(GizmoColor::Red);
tm.SetScale(cylinder_scale); tm.SetScale(cylinder_scale);
tm.SetRotation(AxisVector::Y,90); tm.SetRotation(AxisVector::Y,90);
tm.SetTranslation(GIZMO_CYLINDER_OFFSET,0,0); tm.SetTranslation(GIZMO_CYLINDER_OFFSET,0,0);
cci.mat=tm; cci.mat=tm;
gma->cylinder=render_framework->CreateComponent<MeshComponent>(&cci,CylinderPtr[0]); //X 向右圆柱 gma->cylinder=render_framework->CreateComponent<MeshComponent>(&cci,CylinderPtr); //X 向右圆柱
gma->cylinder->SetOverrideMaterial(mi);
tm.SetScale(one_scale); tm.SetScale(one_scale);
tm.SetTranslation(GIZMO_CONE_OFFSET,0,0); tm.SetTranslation(GIZMO_CONE_OFFSET,0,0);
cci.mat=tm; cci.mat=tm;
gma->cone=render_framework->CreateComponent<MeshComponent>(&cci,ConePtr[0]); //X圆锥 gma->cone=render_framework->CreateComponent<MeshComponent>(&cci,ConePtr); //Z圆锥
gma->cone->SetOverrideMaterial(mi);
tm.SetScale(square_scale); tm.SetScale(square_scale);
tm.SetTranslation(0,GIZMO_TWO_AXIS_OFFSET,GIZMO_TWO_AXIS_OFFSET); tm.SetTranslation(0,GIZMO_TWO_AXIS_OFFSET,GIZMO_TWO_AXIS_OFFSET);
cci.mat=tm; cci.mat=tm;
gma->square=render_framework->CreateComponent<MeshComponent>(&cci,SquarePtr[0]); gma->square=render_framework->CreateComponent<MeshComponent>(&cci,SquarePtr);
gma->square->SetOverrideMaterial(mi);
} }
{ {
gma=axis+size_t(AXIS::Y); gma=axis+size_t(AXIS::Y);
mi=GetGizmoMI(GizmoColor::Green);
tm.SetScale(cylinder_scale); tm.SetScale(cylinder_scale);
tm.SetRotation(AxisVector::X,-90); tm.SetRotation(AxisVector::X,-90);
tm.SetTranslation(0,GIZMO_CYLINDER_OFFSET,0); tm.SetTranslation(0,GIZMO_CYLINDER_OFFSET,0);
cci.mat=tm; cci.mat=tm;
gma->cylinder=render_framework->CreateComponent<MeshComponent>(&cci,CylinderPtr[1]); //Y圆柱 gma->cylinder=render_framework->CreateComponent<MeshComponent>(&cci,CylinderPtr); //X圆柱
gma->cylinder->SetOverrideMaterial(mi);
tm.SetScale(one_scale); tm.SetScale(one_scale);
tm.SetTranslation(0,GIZMO_CONE_OFFSET,0); tm.SetTranslation(0,GIZMO_CONE_OFFSET,0);
cci.mat=tm; cci.mat=tm;
gma->cone=render_framework->CreateComponent<MeshComponent>(&cci,ConePtr[1]); //Y圆锥 gma->cone=render_framework->CreateComponent<MeshComponent>(&cci,ConePtr); //Z圆锥
gma->cone->SetOverrideMaterial(mi);
tm.SetScale(square_scale); tm.SetScale(square_scale);
tm.SetTranslation(GIZMO_TWO_AXIS_OFFSET,0,GIZMO_TWO_AXIS_OFFSET); tm.SetTranslation(GIZMO_TWO_AXIS_OFFSET,0,GIZMO_TWO_AXIS_OFFSET);
cci.mat=tm; cci.mat=tm;
gma->square=render_framework->CreateComponent<MeshComponent>(&cci,SquarePtr[1]); gma->square=render_framework->CreateComponent<MeshComponent>(&cci,SquarePtr);
gma->square->SetOverrideMaterial(mi);
} }
} }

View File

@@ -28,11 +28,11 @@ namespace
{ {
static RenderFramework *render_framework=nullptr; static RenderFramework *render_framework=nullptr;
static RenderResource * gizmo_rr=nullptr; static RenderResource * gizmo_rr=nullptr;
static MaterialInstance *gizmo_mi[size_t(GizmoColor::RANGE_SIZE)]{};
struct GizmoResource struct GizmoResource
{ {
Material * mtl; Material * mtl;
MaterialInstance * mi[size_t(GizmoColor::RANGE_SIZE)];
Pipeline * pipeline; Pipeline * pipeline;
VertexDataManager * vdm; VertexDataManager * vdm;
@@ -46,21 +46,9 @@ namespace
{ {
Primitive *prim; Primitive *prim;
struct Mesh *mesh;
{ MeshComponentData *mcd;
Mesh *mesh; ComponentDataPtr cdp;
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)];
public: public:
@@ -68,19 +56,16 @@ namespace
{ {
prim=p; prim=p;
for(uint i=0;i<uint(GizmoColor::RANGE_SIZE);i++) mesh=CreateMesh(prim,gizmo_mi[0],gizmo_triangle.pipeline);
mesh_data[i].Create(prim,gizmo_triangle.mi[i],gizmo_triangle.pipeline); mcd=new MeshComponentData(mesh);
cdp=mcd;
} }
void Clear() void Clear()
{ {
SAFE_CLEAR(mesh);
cdp.unref();
SAFE_CLEAR(prim) SAFE_CLEAR(prim)
for(auto &md:mesh_data)
{
md.cdp.unref();
SAFE_CLEAR(md.mesh);
}
} }
};//class GizmoMesh };//class GizmoMesh
@@ -105,8 +90,9 @@ namespace
{ {
color=GetColor4f(gizmo_color[i],1.0); color=GetColor4f(gizmo_color[i],1.0);
gr->mi[i]=gizmo_rr->CreateMaterialInstance(gr->mtl,nullptr,&color); gizmo_mi[i]=gizmo_rr->CreateMaterialInstance(gr->mtl,nullptr,&color);
if(!gr->mi[i])
if(!gizmo_mi[i])
return(false); return(false);
} }
@@ -338,15 +324,21 @@ void FreeGizmoResource()
SAFE_CLEAR(gizmo_line.vdm); 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) if(!gizmo_rr)
return(nullptr); return(nullptr);
RANGE_CHECK_RETURN_NULLPTR(shape) 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 VK_NAMESPACE_END

View File

@@ -11,8 +11,8 @@ class MeshComponent;
constexpr const COLOR gizmo_color[size_t(GizmoColor::RANGE_SIZE)]= constexpr const COLOR gizmo_color[size_t(GizmoColor::RANGE_SIZE)]=
{ {
COLOR::MozillaCharcoal, COLOR::MozillaCharcoal, ///<黑色
COLOR::BlanchedAlmond, COLOR::AntiqueWhite, ///<白色
COLOR::BlenderAxisRed, COLOR::BlenderAxisRed,
COLOR::BlenderAxisGreen, COLOR::BlenderAxisGreen,