The-Simpsons-Hit-and-Run/game/code/render/DSG/TriStripDSG.h

147 lines
4.0 KiB
C++

//===========================================================================
// Copyright (C) 2002 Radical Entertainment Ltd. All rights reserved.
//
// Component: tristripdsg
//
// Description: A triangle strip that can be inserted into the DSG,
// rendered using the (slow) pddiPrimStream, but
// able to get modified after it is created and inserted
// Intended for skid marks
//
// Authors: Michael Riegger
//
//===========================================================================
// Recompilation protection flag.
#ifndef TRISTRIPDSG_H
#define TRISTRIPDSG_H
//===========================================================================
// Nested Includes
//===========================================================================
#include <render/dsg/staticentitydsg.h>
#include <p3d/shader.hpp>
#include <memory/srrmemory.h>
//===========================================================================
//
// Description:
// Encapsulates a vertex buffer (non-indexed, size allocated once on creation)
// Derived from StaticEntityDSG and intended for insertion into the DSG
//
// Constraints:
// tShader is a hack. Need to be able to set the shader in a function somewhere
// pddi definitions may be inappropriate, use tColour and equivalents instead?
//
//===========================================================================
class TriStripDSG : public StaticEntityDSG
{
public:
// Ctor, input the number of vertices to preallocate
TriStripDSG( int maxVertices );
virtual ~TriStripDSG();
virtual void SetShader(tShader* pShader, int i)
{
}
// Format of the vertices stored in the buffer, 24 bytes per vertex (assuming no padding)
struct Vertex
{
pddiVector vertex;
pddiColour colour;
pddiVector2 uv;
};
virtual void GetBoundingBox( rmt::Box3D* box )
{
*box = mBoundingBox;
}
virtual void GetBoundingSphere( rmt::Sphere* sphere )
{
*sphere = mBoundingBox.GetBoundingSphere();
}
virtual void GetPosition(rmt::Vector *ipPosn)
{
*ipPosn = mPosition;
}
virtual rmt::Vector* pPosition()
{
return &mPosition;
}
virtual const rmt::Vector& rPosition()
{
return mPosition;
}
// Obsolete function?
virtual void RenderUpdate()
{
rAssert( false );
}
// Draw the strip using a pddiPrimStream
virtual void Display();
// Draw the strips bounding box
virtual void DisplayBoundingBox( tColour colour = tColour( 255, 0, 0 ) );
// Eliminate all vertices (well, really just sets the current vertex back to zero
// no deallocations take place
void Clear();
// Add a new vertex, seperate component format
void AddVertex( const pddiVector& vertex, pddiColour colour, const pddiVector2& uv );
// Add a new vertex, TriStripDSG::Vertex format
void AddVertex( const Vertex& vertex );
void SetVertex( int index, const pddiVector& vertex, pddiColour colour, const pddiVector2& uv );
void SetShader( tShader* pShader );
tShader* GetShader() const { return mpShader; }
void SetColour( int index, tColour colour )
{
rAssert( index >= 0 && index < mNumVertices );
mpVertices[ index ].colour = colour;
}
// Retrieve the vertex at the specified index
const Vertex& GetVertex( int index ) const;
// Number of vertices in the vertex buffer
inline int Size()const { return mNumVertices; }
// Can we insert more vertices in the list
inline bool IsSpaceLeft() const
{
return mNumVertices < mMaxVertices;
}
private:
// Disable default constructor
TriStripDSG();
tShader* mpShader;
// Vertex buffer
Vertex* mpVertices;
// Encloses all vertices in the strip, extended when new vertices added
rmt::Box3D mBoundingBox;
// Center of the bounding box
rmt::Vector mPosition;
// Size of vertex buffer, all or none of these may actually hold valid vertices
int mMaxVertices;
// Number of vertices that are valid, number to render on Display()
int mNumVertices;
};
#endif