void OBB::Transform(const float4x4 &transform) { assume(transform.IsOrthogonal3()); OBBTransform(*this, transform); }
void OBB::Transform(const float3x4 &transform) { assume(transform.IsColOrthogonal()); OBBTransform(*this, transform); }
void OBB::Transform(const Quat &transform) { OBBTransform(*this, transform.ToFloat3x3()); }
static void ddRenderOBBs(const mat4& projview) { const ShaderInfo* shader = g_dbgdrawShader.get(); GLint posLoc = shader->m_attrs[GEOM_Pos]; GLint colorLoc = shader->m_attrs[GEOM_Color]; GLint mvpLoc = shader->m_uniforms[BIND_Mvp]; glUniformMatrix4fv(mvpLoc, 1, 0, projview.m); static const float s_coords[][3] = { { -1.f, -1.f, -1.f }, { 1.f, -1.f, -1.f }, { 1.f, 1.f, -1.f }, { -1.f, 1.f, -1.f }, { -1.f, -1.f, 1.f }, { 1.f, -1.f, 1.f }, { 1.f, 1.f, 1.f }, { -1.f, 1.f, 1.f }, }; const ddOBB* cur = g_lists.m_obbs; if(cur) { glBegin(GL_LINES); while(cur) { OBB obb = OBBTransform(cur->m_xfm, cur->m_obb); glVertexAttrib3fv(colorLoc, &cur->m_color.r); vec3 pt[8]; for(int i = 0; i < 8; ++i) { pt[i] = obb.m_center + obb.m_b[0] * s_coords[i][0] + obb.m_b[1] * s_coords[i][1] + obb.m_b[2] * s_coords[i][2]; } // Bottom half glVertexAttrib3fv(posLoc, &pt[0].x); glVertexAttrib3fv(posLoc, &pt[1].x); glVertexAttrib3fv(posLoc, &pt[1].x); glVertexAttrib3fv(posLoc, &pt[2].x); glVertexAttrib3fv(posLoc, &pt[2].x); glVertexAttrib3fv(posLoc, &pt[3].x); glVertexAttrib3fv(posLoc, &pt[3].x); glVertexAttrib3fv(posLoc, &pt[0].x); // Top half glVertexAttrib3fv(posLoc, &pt[4].x); glVertexAttrib3fv(posLoc, &pt[5].x); glVertexAttrib3fv(posLoc, &pt[5].x); glVertexAttrib3fv(posLoc, &pt[6].x); glVertexAttrib3fv(posLoc, &pt[6].x); glVertexAttrib3fv(posLoc, &pt[7].x); glVertexAttrib3fv(posLoc, &pt[7].x); glVertexAttrib3fv(posLoc, &pt[4].x); // Connecting lines glVertexAttrib3fv(posLoc, &pt[0].x); glVertexAttrib3fv(posLoc, &pt[4].x); glVertexAttrib3fv(posLoc, &pt[1].x); glVertexAttrib3fv(posLoc, &pt[5].x); glVertexAttrib3fv(posLoc, &pt[2].x); glVertexAttrib3fv(posLoc, &pt[6].x); glVertexAttrib3fv(posLoc, &pt[3].x); glVertexAttrib3fv(posLoc, &pt[7].x); cur = cur->m_next; } glEnd(); } }