engine/ts/tsPartInstance.h

108 lines
4 KiB
C
Raw Permalink Normal View History

2024-01-07 04:36:33 +00:00
//-----------------------------------------------------------------------------
// V12 Engine
//
// Copyright (c) 2001 GarageGames.Com
// Portions Copyright (c) 2001 by Sierra Online, Inc.
//-----------------------------------------------------------------------------
#ifndef _TSPARTINSTANCE_H_
#define _TSPARTINSTANCE_H_
#ifndef _TSSHAPEINSTANCE_H_
#include "ts/tsShapeInstance.h"
#endif
class TSPartInstance
{
// TSPartInstance assumes ownership (or shared ownership) of the source shape. This means that the source
// shape cannot be deleted so long as the part instance is still around. This also means that any change
// to source shapes's transforms or other animation properties will affect how the part instance displays.
// It is ok (even expected), however, to have many part instances accessing the same shape.
TSShapeInstance * mSourceShape;
Box3F mBounds;
Point3F mCenter;
F32 mRadius;
// detail selection uses the table pointed to by this member
// if this member is blank, then it uses source shape to determine detail...
// detail 0 draws up until size of shape is less than mSizeCutoffs[0], detail 1 until mSizeCutoffs[1], etc.
F32 * mSizeCutoffs;
S32 * mPolyCount;
S32 mNumDetails;
// detail levels on part instance correspond directly
// to object details on objects -- this is different
// from shape instances where dl corresponds to a
// subtree number and object detail. The reason
// for this is that partinstances are derived from
// a single subtree of a shape instance, so the subtree
// is implied (implied by which objects are in the part instance)...
S32 mCurrentObjectDetail;
F32 mCurrentIntraDL;
Vector<TSShapeInstance::MeshObjectInstance*> mMeshObjects;
Vector<TSShapeInstance::DecalObjectInstance*> mDecalObjects;
static MRandomR250 smRandom;
void addObject(S32 objectIndex);
void updateBounds();
void renderDetailMap(S32 od);
void renderEnvironmentMap(S32 od);
void renderFog(S32 od);
void init(TSShapeInstance *);
static void breakShape(TSShapeInstance *, TSPartInstance *, S32 currentNode,
Vector<TSPartInstance*> & partList, F32 * probShatter,
F32 * probBreak, S32 probDepth);
// private detail selectiong methods
void selectCurrentDetail(F32 * sizeCutoffs, S32 numDetails, bool ignoreScale);
void selectCurrentDetail(F32 pixelSize, F32 * sizeCutoffs, S32 numDetails);
void computePolyCount();
public:
TSPartInstance(TSShapeInstance * source);
TSPartInstance(TSShapeInstance * source, S32 objectIndex);
~TSPartInstance();
const TSShape * getShape() { return mSourceShape->getShape(); }
TSShapeInstance * getSourceShapeInstance(){ return mSourceShape; }
static void breakShape(TSShapeInstance *, S32 subShape, Vector<TSPartInstance*> & partList, F32 * probShatter, F32 * probBreak, S32 probDepth);
Point3F & getCenter() { return mCenter; }
Box3F & getBounds() { return mBounds; }
F32 & getRadius() { return mRadius; }
void render(const Point3F * objectScale = NULL) { render(mCurrentObjectDetail,objectScale); }
void render(S32 dl, const Point3F * objectScale = NULL);
// choose detail method -- pass in NULL for first parameter to just use shapes data
void setDetailData(F32 * sizeCutoffs, S32 numDetails);
// detail selection
void selectCurrentDetail(bool ignoreScale = false);
void selectCurrentDetail(F32 pixelSize);
void selectCurrentDetail2(F32 adjustedDist);
// get information about details...
S32 getDetailSize(S32 dl);
S32 getPolyCount(S32 dl);
S32 getNumDetails() { return mSizeCutoffs ? mNumDetails : mSourceShape->getShape()->mSmallestVisibleDL+1; }
S32 getCurrentObjectDetail() { return mCurrentObjectDetail; }
void setCurrentObjectDetail(S32 od) { mCurrentObjectDetail = od; }
F32 getCurrentIntraDetail() { return mCurrentIntraDL; }
void setCurrentIntraDetail(F32 intra) { mCurrentIntraDL = intra; }
U32 mData; // for use by app
};
#endif