mirror of
https://github.com/bkaradzic/bgfx.git
synced 2026-02-18 04:53:06 +01:00
debugdraw: Cone & cylinder fill.
This commit is contained in:
@@ -39,13 +39,14 @@ struct DebugShapeVertex
|
||||
float m_x;
|
||||
float m_y;
|
||||
float m_z;
|
||||
float m_mask;
|
||||
uint8_t m_indices[4];
|
||||
|
||||
static void init()
|
||||
{
|
||||
ms_decl
|
||||
.begin()
|
||||
.add(bgfx::Attrib::Position, 4, bgfx::AttribType::Float)
|
||||
.add(bgfx::Attrib::Position, 3, bgfx::AttribType::Float)
|
||||
.add(bgfx::Attrib::Indices, 4, bgfx::AttribType::Uint8)
|
||||
.end();
|
||||
}
|
||||
|
||||
@@ -56,14 +57,14 @@ bgfx::VertexDecl DebugShapeVertex::ms_decl;
|
||||
|
||||
static DebugShapeVertex s_cubeVertices[8] =
|
||||
{
|
||||
{-1.0f, 1.0f, 1.0f, 0.0f },
|
||||
{ 1.0f, 1.0f, 1.0f, 0.0f },
|
||||
{-1.0f, -1.0f, 1.0f, 0.0f },
|
||||
{ 1.0f, -1.0f, 1.0f, 0.0f },
|
||||
{-1.0f, 1.0f, -1.0f, 0.0f },
|
||||
{ 1.0f, 1.0f, -1.0f, 0.0f },
|
||||
{-1.0f, -1.0f, -1.0f, 0.0f },
|
||||
{ 1.0f, -1.0f, -1.0f, 0.0f },
|
||||
{-1.0f, 1.0f, 1.0f, { 0, 0, 0, 0 } },
|
||||
{ 1.0f, 1.0f, 1.0f, { 0, 0, 0, 0 } },
|
||||
{-1.0f, -1.0f, 1.0f, { 0, 0, 0, 0 } },
|
||||
{ 1.0f, -1.0f, 1.0f, { 0, 0, 0, 0 } },
|
||||
{-1.0f, 1.0f, -1.0f, { 0, 0, 0, 0 } },
|
||||
{ 1.0f, 1.0f, -1.0f, { 0, 0, 0, 0 } },
|
||||
{-1.0f, -1.0f, -1.0f, { 0, 0, 0, 0 } },
|
||||
{ 1.0f, -1.0f, -1.0f, { 0, 0, 0, 0 } },
|
||||
};
|
||||
|
||||
static const uint16_t s_cubeIndices[36] =
|
||||
@@ -389,6 +390,7 @@ struct DebugDraw
|
||||
const uint32_t numIndices = numVertices;
|
||||
|
||||
vertices[id] = BX_ALLOC(m_allocator, numVertices*stride);
|
||||
memset(vertices[id], 0, numVertices*stride);
|
||||
genSphere(tess, vertices[id], stride);
|
||||
|
||||
uint16_t* trilist = (uint16_t*)BX_ALLOC(m_allocator, numIndices*sizeof(uint16_t) );
|
||||
@@ -397,9 +399,6 @@ struct DebugDraw
|
||||
trilist[ii] = uint16_t(ii);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
uint32_t numLineListIndices = bgfx::topologyConvert(bgfx::TopologyConvert::TriListToLineList
|
||||
, NULL
|
||||
, 0
|
||||
@@ -432,6 +431,157 @@ struct DebugDraw
|
||||
BX_FREE(m_allocator, trilist);
|
||||
}
|
||||
|
||||
for (uint32_t mesh = 0; mesh < 4; ++mesh)
|
||||
{
|
||||
Mesh::Enum id = Mesh::Enum(Mesh::Cone0+mesh);
|
||||
|
||||
const uint32_t num = getCircleLod(mesh);
|
||||
const float step = bx::pi * 2.0f / num;
|
||||
|
||||
const uint32_t numVertices = num+1;
|
||||
const uint32_t numIndices = num*6;
|
||||
const uint32_t numLineListIndices = num*4;
|
||||
|
||||
vertices[id] = BX_ALLOC(m_allocator, numVertices*stride);
|
||||
indices[id] = (uint16_t*)BX_ALLOC(m_allocator, (numIndices + numLineListIndices)*sizeof(uint16_t) );
|
||||
memset(indices[id], 0, (numIndices + numLineListIndices)*sizeof(uint16_t) );
|
||||
|
||||
DebugShapeVertex* vertex = (DebugShapeVertex*)vertices[id];
|
||||
uint16_t* index = indices[id];
|
||||
|
||||
vertex[num].m_x = 0.0f;
|
||||
vertex[num].m_y = 0.0f;
|
||||
vertex[num].m_z = 0.0f;
|
||||
vertex[num].m_indices[0] = 1;
|
||||
|
||||
for (uint32_t ii = 0; ii < num; ++ii)
|
||||
{
|
||||
const float angle = step * ii;
|
||||
|
||||
float xy[2];
|
||||
circle(xy, angle);
|
||||
|
||||
vertex[ii].m_x = xy[1];
|
||||
vertex[ii].m_y = 0.0f;
|
||||
vertex[ii].m_z = xy[0];
|
||||
vertex[ii].m_indices[0] = 0;
|
||||
|
||||
index[ii*3+0] = num;
|
||||
index[ii*3+1] = (ii+1)%num;
|
||||
index[ii*3+2] = ii;
|
||||
|
||||
index[num*3+ii*3+0] = 0;
|
||||
index[num*3+ii*3+1] = ii;
|
||||
index[num*3+ii*3+2] = (ii+1)%num;
|
||||
|
||||
index[numIndices+ii*2+0] = ii;
|
||||
index[numIndices+ii*2+1] = num;
|
||||
|
||||
index[numIndices+num*2+ii*2+0] = ii;
|
||||
index[numIndices+num*2+ii*2+1] = (ii+1)%num;
|
||||
}
|
||||
|
||||
m_mesh[id].m_startVertex = startVertex;
|
||||
m_mesh[id].m_numVertices = numVertices;
|
||||
m_mesh[id].m_startIndex[0] = startIndex;
|
||||
m_mesh[id].m_numIndices[0] = numIndices;
|
||||
m_mesh[id].m_startIndex[1] = startIndex+numIndices;
|
||||
m_mesh[id].m_numIndices[1] = numLineListIndices;
|
||||
|
||||
startVertex += numVertices;
|
||||
startIndex += numIndices + numLineListIndices;
|
||||
}
|
||||
|
||||
for (uint32_t mesh = 0; mesh < 4; ++mesh)
|
||||
{
|
||||
Mesh::Enum id = Mesh::Enum(Mesh::Cylinder0+mesh);
|
||||
|
||||
const uint32_t num = getCircleLod(mesh);
|
||||
const float step = bx::pi * 2.0f / num;
|
||||
|
||||
const uint32_t numVertices = num*2;
|
||||
const uint32_t numIndices = num*12;
|
||||
const uint32_t numLineListIndices = num*6;
|
||||
|
||||
vertices[id] = BX_ALLOC(m_allocator, numVertices*stride);
|
||||
indices[id] = (uint16_t*)BX_ALLOC(m_allocator, (numIndices + numLineListIndices)*sizeof(uint16_t) );
|
||||
memset(indices[id], 0, (numIndices + numLineListIndices)*sizeof(uint16_t) );
|
||||
|
||||
DebugShapeVertex* vertex = (DebugShapeVertex*)vertices[id];
|
||||
uint16_t* index = indices[id];
|
||||
|
||||
for (uint32_t ii = 0; ii < num; ++ii)
|
||||
{
|
||||
const float angle = step * ii;
|
||||
|
||||
float xy[2];
|
||||
circle(xy, angle);
|
||||
|
||||
vertex[ii].m_x = xy[1];
|
||||
vertex[ii].m_y = 0.0f;
|
||||
vertex[ii].m_z = xy[0];
|
||||
vertex[ii].m_indices[0] = 0;
|
||||
|
||||
vertex[ii+num].m_x = xy[1];
|
||||
vertex[ii+num].m_y = 0.0f;
|
||||
vertex[ii+num].m_z = xy[0];
|
||||
vertex[ii+num].m_indices[0] = 1;
|
||||
|
||||
index[ii*6+0] = ii+num;
|
||||
index[ii*6+1] = (ii+1)%num;
|
||||
index[ii*6+2] = ii;
|
||||
index[ii*6+3] = ii+num;
|
||||
index[ii*6+4] = (ii+1)%num+num;
|
||||
index[ii*6+5] = (ii+1)%num;
|
||||
|
||||
index[num*6+ii*6+0] = 0;
|
||||
index[num*6+ii*6+1] = ii;
|
||||
index[num*6+ii*6+2] = (ii+1)%num;
|
||||
index[num*6+ii*6+3] = num;
|
||||
index[num*6+ii*6+4] = (ii+1)%num+num;
|
||||
index[num*6+ii*6+5] = ii+num;
|
||||
|
||||
index[numIndices+ii*2+0] = ii;
|
||||
index[numIndices+ii*2+1] = ii+num;
|
||||
|
||||
index[numIndices+num*2+ii*2+0] = ii;
|
||||
index[numIndices+num*2+ii*2+1] = (ii+1)%num;
|
||||
|
||||
index[numIndices+num*4+ii*2+0] = num + ii;
|
||||
index[numIndices+num*4+ii*2+1] = num + (ii+1)%num;
|
||||
}
|
||||
|
||||
m_mesh[id].m_startVertex = startVertex;
|
||||
m_mesh[id].m_numVertices = numVertices;
|
||||
m_mesh[id].m_startIndex[0] = startIndex;
|
||||
m_mesh[id].m_numIndices[0] = numIndices;
|
||||
m_mesh[id].m_startIndex[1] = startIndex+numIndices;
|
||||
m_mesh[id].m_numIndices[1] = numLineListIndices;
|
||||
|
||||
startVertex += numVertices;
|
||||
startIndex += numIndices + numLineListIndices;
|
||||
}
|
||||
|
||||
for (uint32_t mesh = 0; mesh < 4; ++mesh)
|
||||
{
|
||||
Mesh::Enum id = Mesh::Enum(Mesh::Capsule0+mesh);
|
||||
|
||||
// const uint8_t tess = uint8_t(3-mesh);
|
||||
const uint32_t numVertices = 0;
|
||||
const uint32_t numIndices = 0;
|
||||
const uint32_t numLineListIndices = 0;
|
||||
|
||||
m_mesh[id].m_startVertex = startVertex;
|
||||
m_mesh[id].m_numVertices = numVertices;
|
||||
m_mesh[id].m_startIndex[0] = startIndex;
|
||||
m_mesh[id].m_numIndices[0] = numIndices;
|
||||
m_mesh[id].m_startIndex[1] = startIndex+numIndices;
|
||||
m_mesh[id].m_numIndices[1] = numLineListIndices;
|
||||
|
||||
startVertex += numVertices;
|
||||
startIndex += numIndices + numLineListIndices;
|
||||
}
|
||||
|
||||
m_mesh[Mesh::Cube].m_startVertex = startVertex;
|
||||
m_mesh[Mesh::Cube].m_numVertices = BX_COUNTOF(s_cubeVertices);
|
||||
m_mesh[Mesh::Cube].m_startIndex[0] = startIndex;
|
||||
@@ -444,9 +594,9 @@ struct DebugDraw
|
||||
const bgfx::Memory* vb = bgfx::alloc(startVertex*stride);
|
||||
const bgfx::Memory* ib = bgfx::alloc(startIndex*sizeof(uint16_t) );
|
||||
|
||||
for (uint32_t mesh = 0; mesh < 4; ++mesh)
|
||||
for (uint32_t mesh = Mesh::Sphere0; mesh < Mesh::Cube; ++mesh)
|
||||
{
|
||||
Mesh::Enum id = Mesh::Enum(Mesh::Sphere0+mesh);
|
||||
Mesh::Enum id = Mesh::Enum(mesh);
|
||||
memcpy(&vb->data[m_mesh[id].m_startVertex * stride]
|
||||
, vertices[id]
|
||||
, m_mesh[id].m_numVertices*stride
|
||||
@@ -823,7 +973,7 @@ struct DebugDraw
|
||||
}
|
||||
else
|
||||
{
|
||||
draw(Mesh::Cube, _obb.m_mtx, false);
|
||||
draw(Mesh::Cube, _obb.m_mtx, 1, false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -846,7 +996,7 @@ struct DebugDraw
|
||||
? uint8_t(Mesh::SphereMaxLod)
|
||||
: attrib.m_lod
|
||||
;
|
||||
draw(Mesh::Enum(Mesh::Sphere0 + lod), mtx, attrib.m_wireframe);
|
||||
draw(Mesh::Enum(Mesh::Sphere0 + lod), mtx, 1, attrib.m_wireframe);
|
||||
}
|
||||
|
||||
void drawFrustum(const float* _viewProj)
|
||||
@@ -1021,63 +1171,27 @@ struct DebugDraw
|
||||
void drawCone(const float* _from, const float* _to, float _radius, float _weight = 0.0f)
|
||||
{
|
||||
const Attrib& attrib = m_attrib[m_stack];
|
||||
const uint32_t num = getCircleLod(attrib.m_lod);
|
||||
const float step = bx::pi * 2.0f / num;
|
||||
_weight = bx::fclamp(_weight, 0.0f, 2.0f);
|
||||
BX_UNUSED(_weight);
|
||||
|
||||
float pos[3];
|
||||
float tmp0[3];
|
||||
float tmp1[3];
|
||||
|
||||
bx::vec3Sub(tmp0, _from, _to);
|
||||
|
||||
Plane plane;
|
||||
plane.m_dist = 0.0f;
|
||||
bx::vec3Norm(plane.m_normal, tmp0);
|
||||
float normal[3];
|
||||
bx::vec3Norm(normal, tmp0);
|
||||
|
||||
float udir[3];
|
||||
float vdir[3];
|
||||
calcPlaneUv(plane, udir, vdir);
|
||||
float mtx[2][16];
|
||||
bx::mtxFromNormal(mtx[0], normal, _radius, _from);
|
||||
|
||||
float xy0[2];
|
||||
float xy1[2];
|
||||
circle(xy0, 0.0f);
|
||||
squircle(xy1, 0.0f);
|
||||
memcpy(mtx[1], mtx[0], 64);
|
||||
mtx[1][12] = _to[0];
|
||||
mtx[1][13] = _to[1];
|
||||
mtx[1][14] = _to[2];
|
||||
|
||||
bx::vec3Mul(pos, udir, bx::flerp(xy0[0], xy1[0], _weight)*_radius);
|
||||
bx::vec3Mul(tmp0, vdir, bx::flerp(xy0[1], xy1[1], _weight)*_radius);
|
||||
bx::vec3Add(tmp1, pos, tmp0);
|
||||
bx::vec3Add(pos, tmp1, _from);
|
||||
moveTo(pos);
|
||||
|
||||
for (uint32_t ii = 1; ii < num; ++ii)
|
||||
{
|
||||
float angle = step * ii;
|
||||
circle(xy0, angle);
|
||||
squircle(xy1, angle);
|
||||
|
||||
bx::vec3Mul(pos, udir, bx::flerp(xy0[0], xy1[0], _weight)*_radius);
|
||||
bx::vec3Mul(tmp0, vdir, bx::flerp(xy0[1], xy1[1], _weight)*_radius);
|
||||
bx::vec3Add(tmp1, pos, tmp0);
|
||||
bx::vec3Add(pos, tmp1, _from);
|
||||
lineTo(pos);
|
||||
}
|
||||
|
||||
close();
|
||||
|
||||
for (uint32_t ii = 0; ii < num; ++ii)
|
||||
{
|
||||
float angle = step * ii;
|
||||
circle(xy0, angle);
|
||||
squircle(xy1, angle);
|
||||
|
||||
bx::vec3Mul(pos, udir, bx::flerp(xy0[0], xy1[0], _weight)*_radius);
|
||||
bx::vec3Mul(tmp0, vdir, bx::flerp(xy0[1], xy1[1], _weight)*_radius);
|
||||
bx::vec3Add(tmp1, pos, tmp0);
|
||||
bx::vec3Add(pos, tmp1, _from);
|
||||
moveTo(pos);
|
||||
lineTo(_to);
|
||||
}
|
||||
uint8_t lod = attrib.m_lod > Mesh::ConeMaxLod
|
||||
? uint8_t(Mesh::ConeMaxLod)
|
||||
: attrib.m_lod
|
||||
;
|
||||
draw(Mesh::Enum(Mesh::Cone0 + lod), mtx[0], 2, attrib.m_wireframe);
|
||||
}
|
||||
|
||||
void drawCone(const void* _from, const void* _to, float _radius, float _weight = 0.0f)
|
||||
@@ -1088,55 +1202,28 @@ struct DebugDraw
|
||||
void drawCylinder(const float* _from, const float* _to, float _radius, float _weight = 0.0f)
|
||||
{
|
||||
const Attrib& attrib = m_attrib[m_stack];
|
||||
const uint32_t num = getCircleLod(attrib.m_lod);
|
||||
const float step = bx::pi * 2.0f / num;
|
||||
_weight = bx::fclamp(_weight, 0.0f, 2.0f);
|
||||
|
||||
float pos[3];
|
||||
BX_UNUSED(_weight);
|
||||
|
||||
float tmp0[3];
|
||||
float tmp1[3];
|
||||
|
||||
bx::vec3Sub(tmp0, _from, _to);
|
||||
|
||||
Plane plane;
|
||||
plane.m_dist = 0.0f;
|
||||
bx::vec3Norm(plane.m_normal, tmp0);
|
||||
float normal[3];
|
||||
bx::vec3Norm(normal, tmp0);
|
||||
|
||||
float udir[3];
|
||||
float vdir[3];
|
||||
calcPlaneUv(plane, udir, vdir);
|
||||
float mtx[2][16];
|
||||
bx::mtxFromNormal(mtx[0], normal, _radius, _from);
|
||||
|
||||
float xy0[2];
|
||||
float xy1[2];
|
||||
circle(xy0, 0.0f);
|
||||
squircle(xy1, 0.0f);
|
||||
memcpy(mtx[1], mtx[0], 64);
|
||||
mtx[1][12] = _to[0];
|
||||
mtx[1][13] = _to[1];
|
||||
mtx[1][14] = _to[2];
|
||||
|
||||
float pos1[3];
|
||||
bx::vec3Mul(pos, udir, bx::flerp(xy0[0], xy1[0], _weight)*_radius);
|
||||
bx::vec3Mul(tmp0, vdir, bx::flerp(xy0[1], xy1[1], _weight)*_radius);
|
||||
bx::vec3Add(tmp1, pos, tmp0);
|
||||
bx::vec3Add(pos, tmp1, _from);
|
||||
bx::vec3Add(pos1, tmp1, _to);
|
||||
|
||||
for (uint32_t ii = 1; ii < num+1; ++ii)
|
||||
{
|
||||
float angle = step * ii;
|
||||
circle(xy0, angle);
|
||||
squircle(xy1, angle);
|
||||
|
||||
moveTo(pos); lineTo(pos1);
|
||||
|
||||
moveTo(pos);
|
||||
bx::vec3Mul(pos, udir, bx::flerp(xy0[0], xy1[0], _weight)*_radius);
|
||||
bx::vec3Mul(tmp0, vdir, bx::flerp(xy0[1], xy1[1], _weight)*_radius);
|
||||
bx::vec3Add(tmp1, pos, tmp0);
|
||||
bx::vec3Add(pos, tmp1, _from);
|
||||
lineTo(pos);
|
||||
|
||||
moveTo(pos1);
|
||||
bx::vec3Add(pos1, tmp1, _to);
|
||||
lineTo(pos1);
|
||||
}
|
||||
uint8_t lod = attrib.m_lod > Mesh::CylinderMaxLod
|
||||
? uint8_t(Mesh::CylinderMaxLod)
|
||||
: attrib.m_lod
|
||||
;
|
||||
draw(Mesh::Enum(Mesh::Cylinder0 + lod), mtx[0], 2, attrib.m_wireframe);
|
||||
}
|
||||
|
||||
void drawCylinder(const void* _from, const void* _to, float _radius, float _weight = 0.0f)
|
||||
@@ -1294,11 +1381,30 @@ private:
|
||||
Sphere1,
|
||||
Sphere2,
|
||||
Sphere3,
|
||||
|
||||
Cone0,
|
||||
Cone1,
|
||||
Cone2,
|
||||
Cone3,
|
||||
|
||||
Cylinder0,
|
||||
Cylinder1,
|
||||
Cylinder2,
|
||||
Cylinder3,
|
||||
|
||||
Capsule0,
|
||||
Capsule1,
|
||||
Capsule2,
|
||||
Capsule3,
|
||||
|
||||
Cube,
|
||||
|
||||
Count,
|
||||
|
||||
SphereMaxLod = Sphere3 - Sphere0,
|
||||
SphereMaxLod = Sphere3 - Sphere0,
|
||||
ConeMaxLod = Cone3 - Cone0,
|
||||
CylinderMaxLod = Cylinder3 - Cylinder0,
|
||||
CapsuleMaxLod = Capsule3 - Capsule0,
|
||||
};
|
||||
|
||||
uint32_t m_startVertex;
|
||||
@@ -1320,7 +1426,7 @@ private:
|
||||
};
|
||||
};
|
||||
|
||||
void draw(Mesh::Enum _mesh, const float* _mtx, bool _wireframe) const
|
||||
void draw(Mesh::Enum _mesh, const float* _mtx, uint16_t _num, bool _wireframe) const
|
||||
{
|
||||
const Mesh& mesh = m_mesh[_mesh];
|
||||
|
||||
@@ -1366,7 +1472,7 @@ private:
|
||||
|
||||
bgfx::setUniform(u_params, params, 4);
|
||||
|
||||
bgfx::setTransform(_mtx);
|
||||
bgfx::setTransform(_mtx, _num);
|
||||
bgfx::setVertexBuffer(m_vbh, mesh.m_startVertex, mesh.m_numVertices);
|
||||
bgfx::setState(0
|
||||
| attrib.m_state
|
||||
|
||||
Reference in New Issue
Block a user