Setting colors is the HVD is actually really simple, Havok provides a macro that does the work for you, you only have to pass a byte-packed unsigned 32-bit integer representing the color you want, and the pointer to the hkpCollidable. The format of your integer is 1 byte per channel, first byte is the alpha-channel, then red, blue, and green.
Here's a simple function that does the dirty work for you:
// Needed for calling color change macro #include <common\visualize\hkdebugdisplay.h> // You'll of course need any other headers for any other physics stuff // you're doing in your file void SetColorForPhysicsDebugger( unsigned int Red, unsigned int Green, unsigned int Blue, unsigned int Alpha, const hkpCollidable* pCollidable ) { // Havok takes an unsigned int (32-bit), allowing 8-bits for // each channel (alpha, red, green, and blue, in that // order). // Because we only need 8-bits from each of the 32-bit ints // passed into this function, we'll mask the first 24-bits. Red &= 0x000000FF; Green &= 0x000000FF; Blue &= 0x000000FF; Alpha &= 0x000000FF; // Now we pack the four channels into a single int const uint32_t color = (Alpha << 24) | (Red << 16) | (Green << 8) | Blue; // We use the macro provided by Havok HK_SET_OBJECT_COLOR( reinterpret_cast<hkulong>( pCollidable ), color ); }
In the image below you can see this in action. I have a running sample in which rigid bodies are red and opaque by default, whereas phantoms/triggers are blue and translucent.
Using colors for different categories of objects in your game can be extremely powerful. On one project I was on I created an entire custom interface and tool around filtering physics to show developers only what they were looking for, for example NPCs could collide with certain triggers that human players could not, so there was a filter for looking at the physics world from an NPCs point of view, while in the filter you could only see physics that the NPC could collide with.
This is part 1 of 2 of this series, part 2 shows you how to know when somebody connects to the HVD, because you'll need to resend all color information anytime someone connects.
No comments:
Post a Comment