void EmitterGeomSphereShellImpl::visualize(const PxTransform& pose, RenderDebugInterface& renderDebug) { using RENDER_DEBUG::DebugColors; RENDER_DEBUG_IFACE(&renderDebug)->pushRenderState(); RENDER_DEBUG_IFACE(&renderDebug)->setCurrentColor(RENDER_DEBUG_IFACE(&renderDebug)->getDebugColor(DebugColors::DarkGreen)); // outer sphere RENDER_DEBUG_IFACE(&renderDebug)->setPose(pose); RENDER_DEBUG_IFACE(&renderDebug)->debugSphere(PxVec3(0.0f), *mRadius); // intter sphere RENDER_DEBUG_IFACE(&renderDebug)->debugSphere(PxVec3(0.0f), *mRadius + *mShellThickness); const float radius = *mRadius + *mShellThickness; const float radiusSquared = radius * radius; const float hemisphere = *mHemisphere; const float sphereCapBaseHeight = -radius + 2 * radius * hemisphere; const float sphereCapBaseRadius = PxSqrt(radiusSquared - sphereCapBaseHeight * sphereCapBaseHeight); // cone depicting the hemisphere if(hemisphere > 0.0f) { RENDER_DEBUG_IFACE(&renderDebug)->setCurrentColor(RENDER_DEBUG_IFACE(&renderDebug)->getDebugColor(DebugColors::DarkPurple)); PxMat44 circlePose = PxMat44(PxIdentity); circlePose.setPosition(PxVec3(0.0f, sphereCapBaseHeight, 0.0f)); RENDER_DEBUG_IFACE(&renderDebug)->setPose(circlePose); RENDER_DEBUG_IFACE(&renderDebug)->debugCircle(PxVec3(0.0f), sphereCapBaseRadius, 3); RENDER_DEBUG_IFACE(&renderDebug)->debugLine(circlePose.getPosition(), circlePose.getPosition() + PxVec3(0.0f, radius - sphereCapBaseHeight, 0.0f)); for(float t = 0.0f; t < 2 * PxPi; t += PxPi / 3) { PxVec3 offset(PxSin(t) * sphereCapBaseRadius, 0.0f, PxCos(t) * sphereCapBaseRadius); RENDER_DEBUG_IFACE(&renderDebug)->debugLine(circlePose.getPosition() + offset, circlePose.getPosition() + PxVec3(0.0f, radius - sphereCapBaseHeight, 0.0f)); } RENDER_DEBUG_IFACE(&renderDebug)->setPose(PxIdentity); } RENDER_DEBUG_IFACE(&renderDebug)->popRenderState(); }
void EmitterGeomSphereShellImpl::drawPreview(float scale, RenderDebugInterface* renderDebug) const { using RENDER_DEBUG::DebugColors; RENDER_DEBUG_IFACE(renderDebug)->pushRenderState(); RENDER_DEBUG_IFACE(renderDebug)->setCurrentColor(RENDER_DEBUG_IFACE(renderDebug)->getDebugColor(DebugColors::Yellow), RENDER_DEBUG_IFACE(renderDebug)->getDebugColor(DebugColors::Yellow)); RENDER_DEBUG_IFACE(renderDebug)->debugSphere(PxVec3(0.0f), *mRadius * scale); RENDER_DEBUG_IFACE(renderDebug)->setCurrentColor(RENDER_DEBUG_IFACE(renderDebug)->getDebugColor(DebugColors::DarkGreen), RENDER_DEBUG_IFACE(renderDebug)->getDebugColor(DebugColors::DarkGreen)); RENDER_DEBUG_IFACE(renderDebug)->debugSphere(PxVec3(0.0f), (*mRadius + *mShellThickness) * scale); const float radius = *mRadius + *mShellThickness; const float radiusSquared = radius * radius; const float hemisphere = *mHemisphere; const float sphereCapBaseHeight = -radius + 2 * radius * hemisphere; const float sphereCapBaseRadius = PxSqrt(radiusSquared - sphereCapBaseHeight * sphereCapBaseHeight); if(hemisphere > 0.0f) { RENDER_DEBUG_IFACE(renderDebug)->setCurrentColor(RENDER_DEBUG_IFACE(renderDebug)->getDebugColor(DebugColors::DarkPurple)); PxMat44 circlePose = PxMat44(PxIdentity); circlePose.setPosition(PxVec3(0.0f, sphereCapBaseHeight, 0.0f)); RENDER_DEBUG_IFACE(renderDebug)->setPose(circlePose); RENDER_DEBUG_IFACE(renderDebug)->debugCircle(PxVec3(0.0f), sphereCapBaseRadius, 3); RENDER_DEBUG_IFACE(renderDebug)->debugLine(PxVec3(0.0f), PxVec3(0.0f, radius - sphereCapBaseHeight, 0.0f)); for(float t = 0.0f; t < 2 * PxPi; t += PxPi / 3) { PxVec3 offset(PxSin(t) * sphereCapBaseRadius, 0.0f, PxCos(t) * sphereCapBaseRadius); RENDER_DEBUG_IFACE(renderDebug)->debugLine(offset, PxVec3(0.0f, radius - sphereCapBaseHeight, 0.0f)); } RENDER_DEBUG_IFACE(renderDebug)->setPose(PxIdentity); } RENDER_DEBUG_IFACE(renderDebug)->popRenderState(); }