190 lines
7.2 KiB
C++
190 lines
7.2 KiB
C++
//========= Copyright Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose:
|
|
//
|
|
// $NoKeywords: $
|
|
//
|
|
//===========================================================================//
|
|
|
|
#ifndef IVMODELRENDER_H
|
|
#define IVMODELRENDER_H
|
|
|
|
#if defined(_WIN32) && !defined(__GNUG__)
|
|
#pragma once
|
|
#endif
|
|
|
|
#include "../istudiorender.h"
|
|
#include "../mathlib/mathlib.h"
|
|
#include "../tier1/interface.h"
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// forward declarations
|
|
//-----------------------------------------------------------------------------
|
|
struct mstudioanimdesc_t;
|
|
struct mstudioseqdesc_t;
|
|
struct model_t;
|
|
class IClientRenderable;
|
|
class Vector;
|
|
struct studiohdr_t;
|
|
class IMaterial;
|
|
class CStudioHdr;
|
|
|
|
FORWARD_DECLARE_HANDLE(LightCacheHandle_t);
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Model rendering state
|
|
//-----------------------------------------------------------------------------
|
|
struct DrawModelState_t {
|
|
studiohdr_t *m_pStudioHdr;
|
|
studiohwdata_t *m_pStudioHWData;
|
|
IClientRenderable *m_pRenderable;
|
|
const matrix3x4_t *m_pModelToWorld;
|
|
StudioDecalHandle_t m_decals;
|
|
int m_drawFlags;
|
|
int m_lod;
|
|
};
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Model Rendering + instance data
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// change this when the new version is incompatable with the old
|
|
#define VENGINE_HUDMODEL_INTERFACE_VERSION "VEngineModel016"
|
|
|
|
typedef unsigned short ModelInstanceHandle_t;
|
|
|
|
enum { MODEL_INSTANCE_INVALID = (ModelInstanceHandle_t)~0 };
|
|
|
|
struct ModelRenderInfo_t {
|
|
Vector origin;
|
|
QAngle angles;
|
|
IClientRenderable *pRenderable;
|
|
const model_t *pModel;
|
|
const matrix3x4_t *pModelToWorld;
|
|
const matrix3x4_t *pLightingOffset;
|
|
const Vector *pLightingOrigin;
|
|
int flags;
|
|
int entity_index;
|
|
int skin;
|
|
int body;
|
|
int hitboxset;
|
|
ModelInstanceHandle_t instance;
|
|
|
|
ModelRenderInfo_t() {
|
|
pModelToWorld = NULL;
|
|
pLightingOffset = NULL;
|
|
pLightingOrigin = NULL;
|
|
}
|
|
};
|
|
|
|
struct StaticPropRenderInfo_t {
|
|
const matrix3x4_t *pModelToWorld;
|
|
const model_t *pModel;
|
|
IClientRenderable *pRenderable;
|
|
Vector *pLightingOrigin;
|
|
short skin;
|
|
ModelInstanceHandle_t instance;
|
|
};
|
|
|
|
// UNDONE: Move this to hud export code, subsume previous functions
|
|
abstract_class IVModelRender {
|
|
public:
|
|
virtual int DrawModel(int flags, IClientRenderable *pRenderable,
|
|
ModelInstanceHandle_t instance, int entity_index,
|
|
const model_t *model, Vector const &origin,
|
|
QAngle const &angles, int skin, int body,
|
|
int hitboxset, const matrix3x4_t *modelToWorld = NULL,
|
|
const matrix3x4_t *pLightingOffset = NULL) = 0;
|
|
|
|
// This causes a material to be used when rendering the model instead
|
|
// of the materials the model was compiled with
|
|
virtual void ForcedMaterialOverride(
|
|
IMaterial * newMaterial,
|
|
OverrideType_t nOverrideType = OVERRIDE_NORMAL) = 0;
|
|
|
|
virtual void SetViewTarget(const CStudioHdr *pStudioHdr, int nBodyIndex,
|
|
const Vector &target) = 0;
|
|
|
|
// Creates, destroys instance data to be associated with the model
|
|
virtual ModelInstanceHandle_t CreateInstance(
|
|
IClientRenderable * pRenderable, LightCacheHandle_t *pCache = NULL) = 0;
|
|
virtual void DestroyInstance(ModelInstanceHandle_t handle) = 0;
|
|
|
|
// Associates a particular lighting condition with a model instance handle.
|
|
// FIXME: This feature currently only works for static props. To make it
|
|
// work for entities, etc., we must clean up the lightcache handles as the
|
|
// model instances are removed. At the moment, since only the static prop
|
|
// manager uses this, it cleans up all LightCacheHandles at level shutdown.
|
|
virtual void SetStaticLighting(ModelInstanceHandle_t handle,
|
|
LightCacheHandle_t * pHandle) = 0;
|
|
virtual LightCacheHandle_t GetStaticLighting(
|
|
ModelInstanceHandle_t handle) = 0;
|
|
|
|
// moves an existing InstanceHandle to a nex Renderable to keep decals etc.
|
|
// Models must be the same
|
|
virtual bool ChangeInstance(ModelInstanceHandle_t handle,
|
|
IClientRenderable * pRenderable) = 0;
|
|
|
|
// Creates a decal on a model instance by doing a planar projection
|
|
// along the ray. The material is the decal material, the radius is the
|
|
// radius of the decal to create.
|
|
virtual void AddDecal(ModelInstanceHandle_t handle, Ray_t const &ray,
|
|
Vector const &decalUp, int decalIndex, int body,
|
|
bool noPokeThru = false,
|
|
int maxLODToDecal = ADDDECAL_TO_ALL_LODS) = 0;
|
|
|
|
// Removes all the decals on a model instance
|
|
virtual void RemoveAllDecals(ModelInstanceHandle_t handle) = 0;
|
|
|
|
// Remove all decals from all models
|
|
virtual void RemoveAllDecalsFromAllModels() = 0;
|
|
|
|
// Shadow rendering, DrawModelShadowSetup returns the address of the
|
|
// bone-to-world array, NULL in case of error
|
|
virtual matrix3x4_t *DrawModelShadowSetup(
|
|
IClientRenderable * pRenderable, int body, int skin,
|
|
DrawModelInfo_t *pInfo, matrix3x4_t *pCustomBoneToWorld = NULL) = 0;
|
|
virtual void DrawModelShadow(IClientRenderable * pRenderable,
|
|
const DrawModelInfo_t &info,
|
|
matrix3x4_t *pCustomBoneToWorld = NULL) = 0;
|
|
|
|
// This gets called when overbright, etc gets changed to recompute static
|
|
// prop lighting.
|
|
virtual bool RecomputeStaticLighting(ModelInstanceHandle_t handle) = 0;
|
|
|
|
virtual void ReleaseAllStaticPropColorData(void) = 0;
|
|
virtual void RestoreAllStaticPropColorData(void) = 0;
|
|
|
|
// Extended version of drawmodel
|
|
virtual int DrawModelEx(ModelRenderInfo_t & pInfo) = 0;
|
|
|
|
virtual int DrawModelExStaticProp(ModelRenderInfo_t & pInfo) = 0;
|
|
|
|
virtual bool DrawModelSetup(
|
|
ModelRenderInfo_t & pInfo, DrawModelState_t * pState,
|
|
matrix3x4_t * pCustomBoneToWorld, matrix3x4_t * *ppBoneToWorldOut) = 0;
|
|
virtual void DrawModelExecute(const DrawModelState_t &state,
|
|
const ModelRenderInfo_t &pInfo,
|
|
matrix3x4_t *pCustomBoneToWorld = NULL) = 0;
|
|
|
|
// Sets up lighting context for a point in space
|
|
virtual void SetupLighting(const Vector &vecCenter) = 0;
|
|
|
|
// doesn't support any debug visualization modes or other model options, but
|
|
// draws static props in the fastest way possible
|
|
virtual int DrawStaticPropArrayFast(StaticPropRenderInfo_t * pProps,
|
|
int count, bool bShadowDepth) = 0;
|
|
|
|
// Allow client to override lighting state
|
|
virtual void SuppressEngineLighting(bool bSuppress) = 0;
|
|
|
|
virtual void SetupColorMeshes(int nTotalVerts) = 0;
|
|
|
|
virtual void AddColoredDecal(
|
|
ModelInstanceHandle_t handle, Ray_t const &ray, Vector const &decalUp,
|
|
int decalIndex, int body, Color cColor, bool noPokeThru = false,
|
|
int maxLODToDecal = ADDDECAL_TO_ALL_LODS) = 0;
|
|
};
|
|
|
|
#endif // IVMODELRENDER_H
|