mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-07-15 16:44:36 +00:00
Merge pull request #2232 from Azaezel/phyzZonePhun
PhysicalZone editing-display tools.
This commit is contained in:
commit
9920766a6a
3 changed files with 79 additions and 20 deletions
|
|
@ -212,8 +212,10 @@ void PhysicalZone::onRemove()
|
||||||
|
|
||||||
void PhysicalZone::inspectPostApply()
|
void PhysicalZone::inspectPostApply()
|
||||||
{
|
{
|
||||||
setPolyhedron(mPolyhedron);
|
|
||||||
Parent::inspectPostApply();
|
Parent::inspectPostApply();
|
||||||
|
|
||||||
|
setPolyhedron(mPolyhedron);
|
||||||
|
setMaskBits(PolyhedronMask | MoveMask | SettingsMask | FadeMask);
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
|
@ -248,30 +250,87 @@ void PhysicalZone::prepRenderImage( SceneRenderState *state )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void PhysicalZone::renderObject( ObjectRenderInst *ri,
|
void PhysicalZone::renderObject(ObjectRenderInst *ri,
|
||||||
SceneRenderState *state,
|
SceneRenderState *state,
|
||||||
BaseMatInstance *overrideMat )
|
BaseMatInstance *overrideMat)
|
||||||
{
|
{
|
||||||
if (overrideMat)
|
if (overrideMat)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
GFXStateBlockDesc desc;
|
GFXStateBlockDesc desc;
|
||||||
desc.setZReadWrite( true, false );
|
desc.setZReadWrite(true, false);
|
||||||
desc.setBlend( true );
|
desc.setBlend(true);
|
||||||
desc.setCullMode( GFXCullNone );
|
desc.setCullMode(GFXCullNone);
|
||||||
|
|
||||||
GFXTransformSaver saver;
|
GFXTransformSaver saver;
|
||||||
|
|
||||||
|
GFXDrawUtil *drawer = GFX->getDrawUtil();
|
||||||
|
|
||||||
|
Point3F start = getBoxCenter();
|
||||||
|
Box3F obb = mObjBox; //object bounding box
|
||||||
|
|
||||||
|
F32 baseForce = 10000; //roughly the ammount of force needed to push a player back as it walks into a zone. (used for visual scaling)
|
||||||
|
|
||||||
|
Point3F forceDir = getForce(&start);
|
||||||
|
F32 forceLen = forceDir.len()/ baseForce;
|
||||||
|
forceDir.normalizeSafe();
|
||||||
|
ColorI guideCol = LinearColorF(mFabs(forceDir.x), mFabs(forceDir.y), mFabs(forceDir.z), 0.125).toColorI();
|
||||||
|
|
||||||
|
if (force_type == VECTOR)
|
||||||
|
{
|
||||||
|
Point3F endPos = start + (forceDir * mMax(forceLen,0.75f));
|
||||||
|
drawer->drawArrow(desc, start, endPos, guideCol, 0.05f);
|
||||||
|
}
|
||||||
|
|
||||||
MatrixF mat = getRenderTransform();
|
MatrixF mat = getRenderTransform();
|
||||||
mat.scale( getScale() );
|
mat.scale(getScale());
|
||||||
|
|
||||||
|
GFX->multWorld(mat);
|
||||||
|
start = obb.getCenter();
|
||||||
|
|
||||||
|
if (force_type == VECTOR)
|
||||||
|
{
|
||||||
|
drawer->drawPolyhedron(desc, mPolyhedron, ColorI(0, 255, 0, 45));
|
||||||
|
}
|
||||||
|
else if (force_type == SPHERICAL)
|
||||||
|
{
|
||||||
|
F32 rad = obb.getBoundingSphere().radius/ 2;
|
||||||
|
drawer->drawSphere(desc, rad, start, ColorI(0, 255, 0, 45));
|
||||||
|
|
||||||
GFX->multWorld( mat );
|
rad = (rad + (mAppliedForce.most() / baseForce))/2;
|
||||||
|
desc.setFillModeWireframe();
|
||||||
|
drawer->drawSphere(desc, rad, start, ColorI(0, 0, 255, 255));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Point3F bottomPos = start;
|
||||||
|
bottomPos.z -= obb.len_z() / 2;
|
||||||
|
|
||||||
|
Point3F topPos = start;
|
||||||
|
topPos.z += obb.len_z() / 2;
|
||||||
|
F32 rad = obb.len_x() / 2;
|
||||||
|
drawer->drawCylinder(desc, bottomPos, topPos, rad, ColorI(0, 255, 0, 45));
|
||||||
|
|
||||||
GFXDrawUtil *drawer = GFX->getDrawUtil();
|
Point3F force_vec = mAppliedForce; //raw relative-applied force here as oposed to derived
|
||||||
drawer->drawPolyhedron( desc, mPolyhedron, ColorI( 0, 255, 0, 45 ) );
|
F32 hieght = (force_vec.z / baseForce);
|
||||||
|
|
||||||
|
if (force_vec.z<0)
|
||||||
|
bottomPos.z = (bottomPos.z + hieght)/2;
|
||||||
|
else
|
||||||
|
topPos.z = (topPos.z + hieght) / 2;
|
||||||
|
|
||||||
|
if (force_vec.x > force_vec.y)
|
||||||
|
rad = (rad + (force_vec.x / baseForce)) / 2;
|
||||||
|
else
|
||||||
|
rad = (rad + (force_vec.y / baseForce)) / 2;
|
||||||
|
|
||||||
|
|
||||||
|
desc.setFillModeWireframe();
|
||||||
|
drawer->drawCylinder(desc, bottomPos, topPos, rad, guideCol);
|
||||||
|
}
|
||||||
|
|
||||||
desc.setFillModeWireframe();
|
desc.setFillModeWireframe();
|
||||||
drawer->drawPolyhedron( desc, mPolyhedron, ColorI::BLACK );
|
drawer->drawPolyhedron(desc, mPolyhedron, ColorI::BLACK);
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------
|
//--------------------------------------------------------------------------
|
||||||
|
|
@ -325,7 +384,7 @@ U32 PhysicalZone::packUpdate(NetConnection* con, U32 mask, BitStream* stream)
|
||||||
|
|
||||||
stream->writeFlag(mActive);
|
stream->writeFlag(mActive);
|
||||||
|
|
||||||
return retMask;
|
return retMask;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PhysicalZone::unpackUpdate(NetConnection* con, BitStream* stream)
|
void PhysicalZone::unpackUpdate(NetConnection* con, BitStream* stream)
|
||||||
|
|
|
||||||
|
|
@ -1382,7 +1382,7 @@ void GFXDrawUtil::drawCylinder( const GFXStateBlockDesc &desc, const Point3F &ba
|
||||||
mDevice->popWorldMatrix();
|
mDevice->popWorldMatrix();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GFXDrawUtil::drawArrow( const GFXStateBlockDesc &desc, const Point3F &start, const Point3F &end, const ColorI &color )
|
void GFXDrawUtil::drawArrow( const GFXStateBlockDesc &desc, const Point3F &start, const Point3F &end, const ColorI &color, F32 baseRad )
|
||||||
{
|
{
|
||||||
GFXTransformSaver saver;
|
GFXTransformSaver saver;
|
||||||
|
|
||||||
|
|
@ -1398,8 +1398,8 @@ void GFXDrawUtil::drawArrow( const GFXStateBlockDesc &desc, const Point3F &start
|
||||||
|
|
||||||
// Calculate the radius of the cone given that we want the cone to have
|
// Calculate the radius of the cone given that we want the cone to have
|
||||||
// an angle of 25 degrees (just because it looks good).
|
// an angle of 25 degrees (just because it looks good).
|
||||||
F32 coneLen = ( end - coneBase ).len();
|
F32 coneLen = (baseRad != 0.0f) ? baseRad * 4.0 :( end - coneBase ).len();
|
||||||
F32 coneDiameter = mTan( mDegToRad(25.0f) ) * coneLen;
|
F32 coneDiameter = (baseRad != 0.0f) ? baseRad*4.0f : mTan( mDegToRad(25.0f) ) * coneLen;
|
||||||
|
|
||||||
// Draw the cone on at the arrow's tip.
|
// Draw the cone on at the arrow's tip.
|
||||||
drawCone( desc, coneBase, end, coneDiameter / 2.0f, color );
|
drawCone( desc, coneBase, end, coneDiameter / 2.0f, color );
|
||||||
|
|
@ -1412,7 +1412,7 @@ void GFXDrawUtil::drawArrow( const GFXStateBlockDesc &desc, const Point3F &start
|
||||||
Point3F coneDiff = end - coneBase;
|
Point3F coneDiff = end - coneBase;
|
||||||
|
|
||||||
// Draw the cylinder.
|
// Draw the cylinder.
|
||||||
F32 stickRadius = len * 0.025f;
|
F32 stickRadius = (baseRad != 0.0f) ? baseRad : len * 0.025f;
|
||||||
drawCylinder( desc, start, end - coneDiff, stickRadius, color );
|
drawCylinder( desc, start, end - coneDiff, stickRadius, color );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -115,7 +115,7 @@ public:
|
||||||
void drawCapsule( const GFXStateBlockDesc &desc, const Point3F ¢er, F32 radius, F32 height, const ColorI &color, const MatrixF *xfm = NULL );
|
void drawCapsule( const GFXStateBlockDesc &desc, const Point3F ¢er, F32 radius, F32 height, const ColorI &color, const MatrixF *xfm = NULL );
|
||||||
void drawCone( const GFXStateBlockDesc &desc, const Point3F &basePnt, const Point3F &tipPnt, F32 baseRadius, const ColorI &color );
|
void drawCone( const GFXStateBlockDesc &desc, const Point3F &basePnt, const Point3F &tipPnt, F32 baseRadius, const ColorI &color );
|
||||||
void drawCylinder( const GFXStateBlockDesc &desc, const Point3F &basePnt, const Point3F &tipPnt, F32 baseRadius, const ColorI &color );
|
void drawCylinder( const GFXStateBlockDesc &desc, const Point3F &basePnt, const Point3F &tipPnt, F32 baseRadius, const ColorI &color );
|
||||||
void drawArrow( const GFXStateBlockDesc &desc, const Point3F &start, const Point3F &end, const ColorI &color );
|
void drawArrow( const GFXStateBlockDesc &desc, const Point3F &start, const Point3F &end, const ColorI &color, F32 baseRad = 0.0f);
|
||||||
void drawFrustum( const Frustum& f, const ColorI &color );
|
void drawFrustum( const Frustum& f, const ColorI &color );
|
||||||
|
|
||||||
/// Draw a solid or wireframe (depending on fill mode of @a desc) polyhedron with the given color.
|
/// Draw a solid or wireframe (depending on fill mode of @a desc) polyhedron with the given color.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue