debugdraw: Cone & cylinder fill.

This commit is contained in:
Branimir Karadžić
2016-06-14 22:33:37 -07:00
parent 00a2a9c964
commit 6e1d39b92a
6 changed files with 548 additions and 395 deletions

View File

@@ -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