Game Development Community

Add wheel shadows

by Kage · 12/18/2005 (6:51 pm) · 9 comments

Several changes:

Header Files
[b]ShapeBase.h[/b]
virtual void addShadowDetail(F32 dist, F32 fogAmount, Shadow *shadow);

[b]Vehicle.h[/b]
void addShadowDetail(F32 dist, F32 fogAmount, Shadow *shadow);

[b]WheeledVehcile.h[/b]
void addShadowDetail(F32 dist, F32 fogAmount, Shadow *shadow);

Source Files
List of changes.

[b]ShapeBase.cc[/b]
void ShapeBase::addShadowDetail(F32 dist, F32 fogAmount, Shadow *shadow)
{
   // empty stuff
}

and importantly, in 
void ShapeBase::renderShadow(F32 dist, F32 fogAmount)
{
.
.
.
[i]after this line, and before the end of this condition code, add a call to addShadowDetail [/i]
   if (mShadow->needBitmap())
   {
[b]      addShadowDetail(dist, fogAmount, mShadow);[/b]
   }
.
.
.
}


[b][vehicle.cc][/b]
void Vehicle::addShadowDetail(F32 dist, F32 fogAmount, Shadow *shadow)
{
   //empty for now
}

[b][wheeledvehicle.cc][/b]
void WheeledVehicle::addShadowDetail(F32 dist, F32 fogAmount, Shadow *shadow)
{
   Parent::addShadowDetail(dist, fogAmount, shadow);

   if ( shadow )
   {
      Wheel* wend = &mWheel[mDataBlock->wheelCount];
      for (Wheel* wheel = mWheel; wheel < wend; wheel++)
      {
         if (wheel->shapeInstance)
         {
            MatrixF mat = getRenderTransform();
            Point3F rdpos = mat.getPosition();

            // Steering & spring extension
            MatrixF hub(EulerF(0,0,mSteering.x * wheel->steering));
            Point3F pos = wheel->data->pos;
            pos.z -= wheel->spring->length * wheel->extension;
            hub.setColumn(3,pos);
            mat.mul(hub);

            // Rotation the tire to face the right direction
            // (could pre-calculate this)
            MatrixF wrot(EulerF(0,0,(wheel->data->pos.x > 0)? M_PI/2: -M_PI/2));
            mat.mul(wrot);

            // shadow details
            #ifdef LOD_WHEEL_SHADOW
            shadow->selectShapeDetail(wheel->shapeInstance, dist, 1.0f);
            #else
            wheel->shapeInstance->setCurrentDetail(0);
            #endif
            // render shadow 
            shadow->renderToBitmap(wheel->shapeInstance, mat, rdpos, Point3F(1,1,1));
         }
      }
   }
}


You can define the LOD_WHEEL_SHADOW to enable LOD wheel shadows.

About the author

Professional gameplay programmer worked in the industry for about five years, specialized in combat system, player control, animation system, weapon system, camera system, physics: ODE/Havok, networking and AI.


#1
12/18/2005 (7:09 pm)
Nice! Awesome Job!
#2
12/22/2005 (10:29 am)
Exactly where in the header files should those lines go?
#3
12/22/2005 (6:23 pm)
@BigPapa - anywhere in the function definition section. From the looks of the function I'm guessing they belong after a "protected:" keyword. If that causes a compiler error, try after "public:"
#4
12/27/2005 (12:12 pm)
Can't get it to compile. I get this error:

Compiling...
wheeledVehicle.cc
..\engine\game\vehicles\wheeledVehicle.cc(1465) : error C2027: use of undefined type 'Shadow'
        ../engine\game/shapeBase.h(38) : see declaration of 'Shadow'
..\engine\game\vehicles\wheeledVehicle.cc(1465) : error C2227: left of '->renderToBitmap' must point to class/struct/union/generic type

I think i placed the code in the correct locations but i'm baffled.
#5
12/27/2005 (12:16 pm)
At top of wheeledVehicle.cc, add:
#include "game/shadow.h"
#6
01/04/2006 (11:42 am)
I noticed this, but it was really far down on my todo list. Added it with no problems


Thanks :)
#7
01/09/2006 (4:14 am)
#8
03/13/2006 (7:52 am)
#9
01/04/2008 (4:52 am)
having problems adding this in... everything seems fine but when i look in the direction of the vehicle the engine crashes