内置内何体增加坐标轴和绑定盒

This commit is contained in:
hyzboy 2019-06-24 20:16:50 +08:00
parent 91d6d20424
commit 8ba37b8a9d
2 changed files with 190 additions and 33 deletions

View File

@ -12,7 +12,7 @@ namespace hgl
class SceneDB; class SceneDB;
/** /**
* * (/)
*/ */
struct RectangleCreateInfo struct RectangleCreateInfo
{ {
@ -22,7 +22,7 @@ namespace hgl
vulkan::Renderable *CreateRenderableRectangle(SceneDB *db,vulkan::Material *mtl,const RectangleCreateInfo *rci); vulkan::Renderable *CreateRenderableRectangle(SceneDB *db,vulkan::Material *mtl,const RectangleCreateInfo *rci);
/** /**
* * ()
*/ */
struct RoundRectangleCreateInfo:public RectangleCreateInfo struct RoundRectangleCreateInfo:public RectangleCreateInfo
{ {
@ -42,6 +42,9 @@ namespace hgl
uint field_count; ///<分段次数 uint field_count; ///<分段次数
};//struct CircleCreateInfo };//struct CircleCreateInfo
/**
* 2D圆形()
*/
vulkan::Renderable *CreateRenderableCircle(SceneDB *db,vulkan::Material *mtl,const CircleCreateInfo *rci); vulkan::Renderable *CreateRenderableCircle(SceneDB *db,vulkan::Material *mtl,const CircleCreateInfo *rci);
/** /**
@ -58,6 +61,9 @@ namespace hgl
Color4f side_color; //边界线条颜色 Color4f side_color; //边界线条颜色
};//struct PlaneGridCreateInfo };//struct PlaneGridCreateInfo
/**
* (线)
*/
vulkan::Renderable *CreateRenderablePlaneGrid(SceneDB *db,vulkan::Material *mtl,const PlaneGridCreateInfo *pgci); vulkan::Renderable *CreateRenderablePlaneGrid(SceneDB *db,vulkan::Material *mtl,const PlaneGridCreateInfo *pgci);
struct PlaneCreateInfo struct PlaneCreateInfo
@ -65,20 +71,39 @@ namespace hgl
Vector2f tile; Vector2f tile;
};//struct PlaneCreateInfo };//struct PlaneCreateInfo
/**
* ()
*/
vulkan::Renderable *CreateRenderablePlane(SceneDB *db,vulkan::Material *mtl,const PlaneCreateInfo *pci); vulkan::Renderable *CreateRenderablePlane(SceneDB *db,vulkan::Material *mtl,const PlaneCreateInfo *pci);
struct CubeCreateInfo struct CubeCreateInfo
{ {
Vector3f center;
Vector3f size;
Vector2f tile; Vector2f tile;
public:
CubeCreateInfo()
{
center.Set(0,0,0);
center.Set(1,1,1);
tile.Set(1,1);
}
};//struct CubeCreateInfo };//struct CubeCreateInfo
/** /**
* 0,0,01 * ()
*/ */
vulkan::Renderable *CreateRenderableCube(SceneDB *db,vulkan::Material *mtl,const CubeCreateInfo *cci); vulkan::Renderable *CreateRenderableCube(SceneDB *db,vulkan::Material *mtl,const CubeCreateInfo *cci);
/** /**
* 0,0,01 * (线)
*/
vulkan::Renderable *CreateRenderableBoundingBox(SceneDB *db,vulkan::Material *mtl,const CubeCreateInfo *cci);
/**
* 0,0,01()
*/ */
vulkan::Renderable *CreateRenderableSphere(SceneDB *db,vulkan::Material *mtl,const uint numberSlices); vulkan::Renderable *CreateRenderableSphere(SceneDB *db,vulkan::Material *mtl,const uint numberSlices);
@ -89,7 +114,7 @@ namespace hgl
};//struct DomeCreateInfo };//struct DomeCreateInfo
/** /**
* * ()
*/ */
vulkan::Renderable *CreateRenderableDome(SceneDB *db,vulkan::Material *mtl, const DomeCreateInfo *); vulkan::Renderable *CreateRenderableDome(SceneDB *db,vulkan::Material *mtl, const DomeCreateInfo *);
@ -103,9 +128,9 @@ namespace hgl
};//struct TorusCreateInfo };//struct TorusCreateInfo
/** /**
* * ()
*/ */
vulkan::Renderable *CreateRenderableTorus(SceneDB *db,vulkan::Material *mtl,TorusCreateInfo *tci); vulkan::Renderable *CreateRenderableTorus(SceneDB *db,vulkan::Material *mtl,const TorusCreateInfo *tci);
struct CylinderCreateInfo struct CylinderCreateInfo
{ {
@ -114,7 +139,10 @@ namespace hgl
uint numberSlices; uint numberSlices;
};//struct CylinderCreateInfo };//struct CylinderCreateInfo
vulkan::Renderable *CreateRenderableCylinder(SceneDB *db,vulkan::Material *mtl,CylinderCreateInfo *cci); /**
* ()
*/
vulkan::Renderable *CreateRenderableCylinder(SceneDB *db,vulkan::Material *mtl,const CylinderCreateInfo *cci);
struct ConeCreateInfo struct ConeCreateInfo
{ {
@ -124,7 +152,33 @@ namespace hgl
numberStacks; //柱高层数 numberStacks; //柱高层数
};//struct ConeCreateInfo };//struct ConeCreateInfo
vulkan::Renderable *CreateRenderableCone(SceneDB *db,vulkan::Material *mtl,ConeCreateInfo *cci); /**
* ()
*/
vulkan::Renderable *CreateRenderableCone(SceneDB *db,vulkan::Material *mtl,const ConeCreateInfo *cci);
struct AxisCreateInfo
{
Vector3f root;
Vector3f size;
Color4f color[3];
public:
AxisCreateInfo()
{
root.Set(0,0,0);
size.Set(1,1,1);
color[0].Set(1,0,0,1);
color[1].Set(0,1,0,1);
color[2].Set(0,0,1,1);
}
};//struct AxisCreateInfo
/**
* 线(线)
*/
vulkan::Renderable *CreateRenderableAxis(SceneDB *db,vulkan::Material *mtl,const AxisCreateInfo *aci);
}//namespace graph }//namespace graph
};//namespace hgl };//namespace hgl
#endif//HGL_GRAPH_INLINE_GEOMETRY_INCLUDE #endif//HGL_GRAPH_INLINE_GEOMETRY_INCLUDE

View File

@ -74,11 +74,11 @@ namespace hgl
void WriteTangent (const float *v){if(tangent )tangent ->BufferData(v);} void WriteTangent (const float *v){if(tangent )tangent ->BufferData(v);}
void WriteTexCoord (const float *v){if(tex_coord )tex_coord ->BufferData(v);} void WriteTexCoord (const float *v){if(tex_coord )tex_coord ->BufferData(v);}
VERTEX_VB_FORMAT *GetVertex (){if(vertex )vertex ->Begin();return vertex;} VERTEX_VB_FORMAT * GetVertex (){return vertex; }
VB4f *GetColor (){if(color )color ->Begin();return color;} VB4f * GetColor (){return color; }
VB3f *GetNormal (){if(normal )normal ->Begin();return normal;} VB3f * GetNormal (){return normal; }
VB3f *GetTangent (){if(tangent )tangent ->Begin();return tangent;} VB3f * GetTangent (){return tangent; }
VB2f *GetTexCoord (){if(tex_coord )tex_coord ->Begin();return tex_coord;} VB2f * GetTexCoord (){return tex_coord; }
float *GetVertexPointer (){return vertex ?(float *)vertex ->Begin():nullptr;} float *GetVertexPointer (){return vertex ?(float *)vertex ->Begin():nullptr;}
float *GetColorPointer (){return color ?(float *)color ->Begin():nullptr;} float *GetColorPointer (){return color ?(float *)color ->Begin():nullptr;}
@ -116,10 +116,10 @@ namespace hgl
Finish(vertex_binding,vertex); Finish(vertex_binding,vertex);
} }
if(color)Finish(color_binding,color); if(color )Finish(color_binding, color);
if(normal)Finish(normal_binding,normal); if(normal )Finish(normal_binding, normal);
if(tangent)Finish(tangent_binding,tangent); if(tangent )Finish(tangent_binding, tangent);
if(tex_coord)Finish(texcoord_binding,tex_coord); if(tex_coord)Finish(texcoord_binding, tex_coord);
if(ibo) if(ibo)
{ {
@ -358,7 +358,7 @@ namespace hgl
+1.0f, 0.0f, 0.0f, +1.0f, 0.0f, 0.0f, +1.0f, 0.0f, 0.0f, +1.0f, 0.0f, 0.0f, 0.0f, 0.0f,+1.0f, 0.0f, 0.0f,+1.0f, +1.0f, 0.0f, 0.0f, +1.0f, 0.0f, 0.0f, +1.0f, 0.0f, 0.0f, +1.0f, 0.0f, 0.0f, 0.0f, 0.0f,+1.0f, 0.0f, 0.0f,+1.0f,
0.0f, 0.0f,+1.0f, 0.0f, 0.0f,+1.0f, 0.0f, 0.0f,-1.0f, 0.0f, 0.0f,-1.0f, 0.0f, 0.0f,-1.0f, 0.0f, 0.0f,-1.0f }; 0.0f, 0.0f,+1.0f, 0.0f, 0.0f,+1.0f, 0.0f, 0.0f,-1.0f, 0.0f, 0.0f,-1.0f, 0.0f, 0.0f,-1.0f, 0.0f, 0.0f,-1.0f };
float tex_coords[] ={ 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, const float tex_coords[] ={ 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f,
1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f }; 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f };
@ -367,21 +367,45 @@ namespace hgl
if(!gc.Init(24)) if(!gc.Init(24))
return(nullptr); return(nullptr);
gc.WriteVertex(points); if(cci->center ==Vector3f(0,0,0)
&&cci->size ==Vector3f(1,1,1))
{
gc.WriteVertex(points);
}
else
{
const float *sp=points;
float *vp=gc.GetVertexPointer();
for(uint i=0;i<24;i++)
{
*vp=cci->center.x+(*sp)*cci->size.x; ++vp;++sp;
*vp=cci->center.y+(*sp)*cci->size.y; ++vp;++sp;
*vp=cci->center.z+(*sp)*cci->size.z; ++vp;++sp;
}
}
gc.WriteNormal(normals); gc.WriteNormal(normals);
gc.WriteTangent(tangents); gc.WriteTangent(tangents);
VB2f *tc_vb=gc.GetTexCoord(); float *tcp=gc.GetTexCoordPointer();
if(tc_vb)
{
float *tc=tex_coords;
for(uint i=0;i<24;i++)
{
(*tc)*=cci->tile.x;++tc;
(*tc)*=cci->tile.y;++tc;
}
tc_vb->BufferData(tex_coords); if(tcp)
{
if(cci->tile.x==1&&cci->tile.y==1)
{
gc.WriteTexCoord(tex_coords);
}
else
{
const float *tc=tex_coords;
for(uint i=0;i<24;i++)
{
*tcp=(*tc)*cci->tile.x;++tc;++tcp;
*tcp=(*tc)*cci->tile.y;++tc;++tcp;
}
}
} }
gc.CreateIBO16(6*2*3,indices); gc.CreateIBO16(6*2*3,indices);
@ -668,7 +692,7 @@ namespace hgl
} }
}//namespace }//namespace
vulkan::Renderable *CreateRenderableTorus(SceneDB *db,vulkan::Material *mtl,TorusCreateInfo *tci) vulkan::Renderable *CreateRenderableTorus(SceneDB *db,vulkan::Material *mtl,const TorusCreateInfo *tci)
{ {
GeometryCreater3D gc(db,mtl); GeometryCreater3D gc(db,mtl);
@ -819,7 +843,7 @@ namespace hgl
} }
}//namespace }//namespace
vulkan::Renderable *CreateRenderableCylinder(SceneDB *db,vulkan::Material *mtl,CylinderCreateInfo *cci) vulkan::Renderable *CreateRenderableCylinder(SceneDB *db,vulkan::Material *mtl,const CylinderCreateInfo *cci)
{ {
uint numberIndices = cci->numberSlices * 3 * 2 + cci->numberSlices * 6; uint numberIndices = cci->numberSlices * 3 * 2 + cci->numberSlices * 6;
@ -1033,7 +1057,7 @@ namespace hgl
} }
}//namespace }//namespace
vulkan::Renderable *CreateRenderableCone(SceneDB *db,vulkan::Material *mtl,ConeCreateInfo *cci) vulkan::Renderable *CreateRenderableCone(SceneDB *db,vulkan::Material *mtl,const ConeCreateInfo *cci)
{ {
GeometryCreater3D gc(db,mtl); GeometryCreater3D gc(db,mtl);
@ -1154,5 +1178,84 @@ namespace hgl
return gc.Finish(); return gc.Finish();
} }
vulkan::Renderable *CreateRenderableAxis(SceneDB *db,vulkan::Material *mtl,const AxisCreateInfo *aci)
{
GeometryCreater3D gc(db,mtl);
if(!gc.Init(6))
return(false);
VB3f *vertex=gc.GetVertex();
VB4f *color=gc.GetColor();
if(!vertex||!color)
return(nullptr);
vertex->Write(aci->root);color->Write(aci->color[0]);
vertex->Write(aci->root.x+aci->size[0],aci->root.y,aci->root.z);color->Write(aci->color[0]);
vertex->Write(aci->root);color->Write(aci->color[1]);
vertex->Write(aci->root.x,aci->root.y+aci->size[1],aci->root.z);color->Write(aci->color[1]);
vertex->Write(aci->root);color->Write(aci->color[2]);
vertex->Write(aci->root.x,aci->root.y,aci->root.z+aci->size[2]);color->Write(aci->color[2]);
return gc.Finish();
}
vulkan::Renderable *CreateRenderableBoundingBox(SceneDB *db,vulkan::Material *mtl,const CubeCreateInfo *cci)
{
// Points of a cube.
/* 4 5 */ const float points[]={ -0.5,-0.5, 0.5, 0.5,-0.5,0.5, 0.5,-0.5,-0.5, -0.5,-0.5,-0.5,
/* *------------* */ -0.5, 0.5, 0.5, 0.5, 0.5,0.5, 0.5, 0.5,-0.5, -0.5, 0.5,-0.5};
/* /| /| */
/* 0/ | 1/ | */
/* *--+---------* | */
/* | | | | */
/* | 7| | 6| */
/* | *---------+--* */
/* | / | / */
/* |/ 2|/ */
/* 3*------------* */
const uint16 indices[]=
{
0,1, 1,2, 2,3, 3,0,
4,5, 5,6, 6,7, 7,4,
0,4, 1,5, 2,6, 3,7
};
GeometryCreater3D gc(db,mtl);
if(!gc.Init(8))
return(false);
VB3f *vertex=gc.GetVertex();
if(!vertex)return(nullptr);
if(cci->center ==Vector3f(0,0,0)
&&cci->size ==Vector3f(1,1,1))
{
gc.WriteVertex(points);
}
else
{
const float *sp=points;
float *vp=gc.GetVertexPointer();
for(uint i=0;i<8;i++)
{
*vp=cci->center.x+(*sp)*cci->size.x; ++vp;++sp;
*vp=cci->center.y+(*sp)*cci->size.y; ++vp;++sp;
*vp=cci->center.z+(*sp)*cci->size.z; ++vp;++sp;
}
}
gc.CreateIBO16(24,indices);
return gc.Finish();
}
}//namespace graph }//namespace graph
}//namespace hgl }//namespace hgl