瀏覽代碼

Dev forest wind emitter improvement

So the problem is that when your inside the sphere it won't render so it might make someone
think that it's not working right.  So what I did was determine if the camera is inside the sphere.
If the camera is inside the sphere, then I find the distance from the center of the sphere to the camera
Round down and use that as the radius to draw the sphere.
That way if someone zooms in or out, their screen is still showing the sphere.
Vincent Gee 11 年之前
父節點
當前提交
c1203c1cea
共有 2 個文件被更改,包括 37 次插入1 次删除
  1. 21 1
      Engine/source/forest/forestWindEmitter.cpp
  2. 16 0
      Engine/source/math/mPoint3.h

+ 21 - 1
Engine/source/forest/forestWindEmitter.cpp

@@ -39,6 +39,8 @@
 #include "T3D/gameBase/processList.h"
 #include "console/engineAPI.h"
 
+#include "T3D/gameBase/gameConnection.h"
+
 ConsoleDocClass( ForestWindEmitter,
    "@brief Object responsible for simulating wind in a level.\n\n"
 
@@ -513,9 +515,27 @@ void ForestWindEmitter::_renderEmitterInfo( ObjectRenderInst *ri, SceneRenderSta
    drawer->drawArrow( desc, pos, pos + (windVec * mWindStrength), ColorI( 0, 0, 255, 255 ) );//Point3F( -235.214, 219.589, 34.0991 ), Point3F( -218.814, 244.731, 37.5587 ), ColorI( 255, 255, 0, 255 ) );//
    drawer->drawArrow( desc, pos, pos + (mWind->getTarget() * mWindStrength ), ColorI( 255, 0, 0, 85 ) );
 
+   
+   S32 useRadius = mWindRadius;
    // Draw a 2D circle for the wind radius.
    if ( isRadialEmitter() )
-      drawer->drawSphere( desc, mWindRadius, pos, ColorI( 255, 0, 0, 80 ) );
+   {
+	   
+	   //So the problem is that when your inside the sphere it won't render so it might make someone 
+	   //think that it's not working right.  So what I did was determine if the camera is inside the sphere.
+	   //If the camera is inside the sphere, then I find the distance from the center of the sphere to the camera
+	   //Round down and use that as the radius to draw the sphere.
+	   //That way if someone zooms in or out, their screen is still showing the sphere.
+      GameConnection * gc = GameConnection::getConnectionToServer();
+      GameBase* gb = gc->getCameraObject();
+       if (gb)
+	   {
+		  Point3F camPos = gb->getPosition();
+		  if ( getPosition().isInsideSphere( camPos, mWindRadius ) )
+			  useRadius =  getPosition().distanceTo(camPos);
+	   }
+      drawer->drawSphere( desc, useRadius, pos, ColorI( 255, 0, 0, 80 ) );
+   }
 }
 
 F32 ForestWindEmitter::getStrength() const

+ 16 - 0
Engine/source/math/mPoint3.h

@@ -123,6 +123,22 @@ class Point3F
    void interpolate(const Point3F&, const Point3F&, F32);
    void zero();
 
+   F32 distanceTo(Point3F loc)
+   {
+	   F32 xSqr = (this->x - loc.x) * (this->x - loc.x);
+	   F32 ySqr = (this->y - loc.y) * (this->y - loc.y);
+	   F32 zSqr = (this->z - loc.z) * (this->z - loc.z);
+
+	   F32 mySqr = xSqr + ySqr + zSqr;
+
+	   return sqrt(mySqr);
+   }
+
+   bool isInsideSphere(Point3F pt, F32 Radius)
+   {
+	   return (  (( this->x - pt.x) * ( this->x - pt.x) ) + (( this->y - pt.y) * ( this->y - pt.y) ) + (( this->z - pt.z) * ( this->z - pt.z) ) <= (Radius * Radius));
+   }
+
    /// Returns the smallest absolute value.
    F32 least() const;