Ver Fonte

visualization augmentations for PhysicalZone. colorizes based on force vector, scales based on lengths

Azaezel há 7 anos atrás
pai
commit
e8ac28b463
1 ficheiros alterados com 75 adições e 16 exclusões
  1. 75 16
      Engine/source/T3D/physicalZone.cpp

+ 75 - 16
Engine/source/T3D/physicalZone.cpp

@@ -212,8 +212,10 @@ void PhysicalZone::onRemove()
 
 void PhysicalZone::inspectPostApply()
 {
-   setPolyhedron(mPolyhedron);
    Parent::inspectPostApply();
+
+   setPolyhedron(mPolyhedron);
+   setMaskBits(PolyhedronMask | MoveMask | SettingsMask | FadeMask);
 }
 
 //------------------------------------------------------------------------------
@@ -248,30 +250,87 @@ void PhysicalZone::prepRenderImage( SceneRenderState *state )
 }
 
 
-void PhysicalZone::renderObject( ObjectRenderInst *ri,
-                                 SceneRenderState *state,
-                                 BaseMatInstance *overrideMat )
+void PhysicalZone::renderObject(ObjectRenderInst *ri,
+   SceneRenderState *state,
+   BaseMatInstance *overrideMat)
 {
    if (overrideMat)
       return;
-
+ 
    GFXStateBlockDesc desc;
-   desc.setZReadWrite( true, false );
-   desc.setBlend( true );
-   desc.setCullMode( GFXCullNone );
-
+   desc.setZReadWrite(true, false);
+   desc.setBlend(true);
+   desc.setCullMode(GFXCullNone);
+ 
    GFXTransformSaver saver;
+ 
+   GFXDrawUtil *drawer = GFX->getDrawUtil();
+ 
+   Point3F start = getBoxCenter();
+   Box3F obb = mObjBox; //object bounding box 
 
-   MatrixF mat = getRenderTransform();
-   mat.scale( getScale() );
+   F32 baseForce = 10000; //roughly the ammount of force needed to push a player back as it walks into a zone. (used for visual scaling)
 
-   GFX->multWorld( mat );
+   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();
 
-   GFXDrawUtil *drawer = GFX->getDrawUtil();
-   drawer->drawPolyhedron( desc, mPolyhedron, ColorI( 0, 255, 0, 45 ) );
+   if (force_type == VECTOR)
+   {
+	   Point3F endPos = start + (forceDir * mMax(forceLen,0.75f));
+	   drawer->drawArrow(desc, start, endPos, guideCol, 0.05f);
+   }
 
+   MatrixF mat = getRenderTransform();
+   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));
+
+	  rad = (rad + forceLen / 2)/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));
+
+	  Point3F force_vec = mAppliedForce; //raw relative-applied force here as oposed to derived
+	  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();
-   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);
 
-     return retMask;
+   return retMask;
 }
 
 void PhysicalZone::unpackUpdate(NetConnection* con, BitStream* stream)