#if !defined(IGHOUL_INC) #define IGHOUL_INC #include "matrix4.h" #include "packet.h" typedef unsigned short int GhoulID; const GhoulID NULL_GhoulID(0); const GhoulID MAX_GhoulID(0xffff); struct RenderInfo { float Time; Vect3 Ambient; Vect3 AmbientPos; Vect3 LightPos; bool UseCamera; bool UseAmbientPos; bool UseMapLights; bool UseSpecular; bool UseFastLights; bool UseGlLighting; bool UseDirectional; bool UseAttenuation; bool ForceShadow; bool ShadowOnly; bool NoTextureStack; float ShadowDark; float ShadowTilt; float ShadowDist; float (*ShadowTrace)(float *start,float *end); int MaxShadows; int MaxMapLights; Matrix4 ToWorld; Vect3 WorldViewPoint; Vect3 WorldViewDir; bool UseNoLights; virtual bool CullBoundBox(const float *box) const {return false;} RenderInfo() {UseNoLights=false;UseGlLighting=false;ShadowTrace=0;MaxShadows=0;} }; struct QuakeLight { Vect3 Origin; float Radius; Vect3 Color; }; typedef short int GhoulUUID; class IGhoulCallBack; class IGhoulInst; struct HitRecord { IGhoulInst *Inst; GhoulID Mesh; float Distance; Vect3 Normal; Vect3 ContactPoint; }; enum TexChannel { Diffuse=0, Specular }; enum PartType { ptDummy, ptMesh, ptCamera, ptLight }; enum GhoulSpeed { gs4Over8=0, gs5Over8, gs6Over8, gs7Over8, gsOne, gs9Over8, gs10Over8, gs11Over8, gs12Over8, gs13Over8, gs14Over8, gs15Over8, gs16Over8, gsEND }; class IGhoul; class IGhoulObj { public: virtual GhoulID RegisterSequence(const char *Filename,bool Subsequences=false)=0; virtual void RegisterEverything(bool Skins=true)=0; virtual void PreCache(bool Specular)=0; virtual GhoulID FindSequence(const char *Filename)=0; virtual GhoulID NumSequences() const=0; virtual void GetSequenceName(GhoulID who,char *dest) const=0; virtual GhoulID RegisterPart(const char *PartName)=0; virtual GhoulID FindPart(const char *PartName)=0; virtual GhoulID NumParts() const=0; virtual PartType GetPartType(GhoulID who) const=0; virtual void GetPartName(GhoulID who,char *dest) const=0; virtual GhoulID RegisterNoteToken(const char *Token)=0; virtual GhoulID FindNoteToken(const char *Token)=0; virtual GhoulID NumNoteTokens() const=0; virtual void FireAllNoteCallBacks(IGhoulCallBack *c,GhoulID Token=0)=0; virtual GhoulID RegisterMaterial(const char *Mat)=0; virtual GhoulID FindMaterial(const char *Mat)=0; virtual GhoulID NumMaterials() const=0; virtual void GetMaterialName(GhoulID who,char *dest) const=0; virtual GhoulID RegisterSkin(GhoulID Mat,const char *Skin,TexChannel Channel=Diffuse)=0; virtual GhoulID FindSkin(GhoulID Mat,const char *Skin,TexChannel Channel=Diffuse)=0; virtual GhoulID NumSkins() const=0; virtual void GetSkinName(GhoulID who,char *dest) const=0; virtual GhoulID GetSkinMaterial(GhoulID who) const=0; virtual IGhoulInst *NewInst()=0; virtual GhoulUUID MyUUID() const=0; virtual IGhoul *GetMyGhoul() const=0; virtual void Destroy()=0; }; class IGhoulCallBack { public: virtual bool Execute(IGhoulInst *me,void *user,float now,const void *data)=0; }; class IGhoulInst { public: enum EndCondition { Loop, Hold, // hold at end of seq BackAndForth, HoldFrame, // hold at PlayPos EndMarker //do not use }; enum MatrixType { JacobianLocal, JacobianEntity, JacobianLocalInv, JacobianEntityInv, Local, Entity, LocalInv, EntityInv }; virtual void SetXForm(const float *m)=0; virtual void GetXForm(float *m)=0; virtual void SetXForm(const Matrix4 &m)=0; virtual void GetXForm(Matrix4 &m)=0; virtual void SetOnOff(bool OnOff,float Now)=0; virtual bool GetOnOff()=0; virtual void SetSpeed(GhoulSpeed speed)=0; virtual GhoulSpeed GetSpeed()=0; virtual void SetPartOnOff(GhoulID Part,bool OnOff)=0; virtual bool GetPartOnOff(GhoulID Part)=0; virtual void SetAllPartsOnOff(bool OnOff)=0; virtual void SetFrameOverride(GhoulID Mat,GhoulID Skin,GhoulID Part=0)=0; virtual GhoulID GetFrameOverride(GhoulID Mat,GhoulID Part=0,TexChannel Channel=Diffuse)=0; virtual void ClearFrameOverride(GhoulID Mat,GhoulID Part=0,TexChannel Channel=Diffuse)=0; virtual void SetTint(float r,float g,float b,float a)=0; virtual void GetTint(float *r,float *g,float *b,float *a)=0; virtual void SetTintOnAll(float r,float g,float b,float a)=0; virtual void Play(GhoulID Seq,float Now,float PlayPos=0.0f,bool Restart=true,EndCondition ec=Loop, bool MatchCurrentPos=false, bool reverseAnim=false)=0; virtual GhoulID GetPlayingSequence()=0; virtual void Pause(float Now)=0; virtual void Resume(float Now)=0; virtual void SetUserData(void *user)=0; virtual void *GetUserData()=0; virtual void AddNoteCallBack(IGhoulCallBack *c,GhoulID Token=0)=0; virtual void RemoveNoteCallBack(IGhoulCallBack *c,GhoulID Token=0)=0; virtual void AddMatrixCallBack(IGhoulCallBack *c,GhoulID Part=0,MatrixType kind=JacobianLocal)=0; virtual void RemoveMatrixCallBack(IGhoulCallBack *c,GhoulID Part=0,MatrixType kind=JacobianLocal)=0; virtual float GetSequenceLength(GhoulID Seq,EndCondition ec=Loop,float *SecsPerFrame=0)=0; virtual void Bolt(GhoulID Bolt,IGhoulInst *Bolted,GhoulID BoltedBolt=0)=0; virtual void SetMyBolt(GhoulID Bolt=0)=0; virtual GhoulID GetMyBolt() const=0; virtual void UnBolt(IGhoulInst *Bolted)=0; virtual int GetNumChildren() const=0; virtual IGhoulInst *GetChild(int Child,GhoulID &bolt) const=0; virtual IGhoulObj *GetGhoulObject() const=0; virtual IGhoulInst *GetParent() const=0; virtual IGhoulInst *Clone(bool CloneChildren=true) const=0; virtual int SaveState(unsigned char *buffer,int size,IGhoulCallBack **CallBacks,int NumCallBacks, const char *name) const=0; virtual GhoulUUID RestoreState(unsigned char *buffer,int size,IGhoulCallBack **CallBacks,int NumCallBacks, const char *name)=0; virtual GhoulUUID MyUUID() const =0; virtual GhoulUUID MyObjUUID() const =0; virtual void Render(RenderInfo &r)=0; virtual void PreCache(bool Specular,bool Textures,bool Verts)=0; virtual int RayTrace(float Time,const Vect3 &start,const Vect3 &dir,HitRecord *Hits,int MaxHits)=0; virtual int BoxTrace(float Time,const Matrix4 &ToWorld,const Vect3 &start,const Vect3 &end,const Vect3 &mins,const Vect3 &maxs,HitRecord *Hits,int MaxHits)=0; virtual void ServerUpdate(float Time)=0; virtual void TurnCallBacksOff()=0; virtual void TurnMatrixCallBacksOff()=0; virtual void TurnCallBacksOn(float Now)=0; virtual void TurnMatrixCallBacksOn(float Now)=0; virtual void GetBoltMatrix(float Time,Matrix4 &m,GhoulID Part=0,MatrixType kind=JacobianLocal,bool ToRoot=true)=0; virtual void GetBoundBox(float Time,const Matrix4 &ToWorld,Vect3 &mins,Vect3 &maxs,GhoulID Part=0,bool Accurate=false)=0; virtual int QueueForClient(float dist)=0; virtual void Destroy()=0; virtual GhoulID GetStateSequence()=0; // string based interface bool IsLive() {return (GetPlayingSequence()!=0)&&GetOnOff();} bool SetPartOnOff(const char *Part,bool OnOff) { GhoulID t=GetGhoulObject()->FindPart(Part); if (!t) return false; SetPartOnOff(t,OnOff); return true; } bool GetPartOnOff(const char *Part) { GhoulID t=GetGhoulObject()->FindPart(Part); if (!t) return false; return GetPartOnOff(t); } bool SetFrameOverride(const char *Mat,const char *Skin,const char *Part) { GhoulID t=GetGhoulObject()->FindPart(Part); GhoulID m=GetGhoulObject()->FindMaterial(Mat); if (!m) return false; GhoulID s=GetGhoulObject()->FindSkin(m,Skin); if (!s) return false; SetFrameOverride(m,s,t); return true; } bool SetFrameOverride(const char *Mat,const char *Skin,GhoulID Part=0) { GhoulID m=GetGhoulObject()->FindMaterial(Mat); if (!m) return false; GhoulID s=GetGhoulObject()->FindSkin(m,Skin); if (!s) return false; SetFrameOverride(m,s,Part); return true; } bool SetFrameOverride(GhoulID Mat,const char *Skin,GhoulID Part=0) { if (!Mat) return false; GhoulID s=GetGhoulObject()->FindSkin(Mat,Skin); if (!s) return false; SetFrameOverride(Mat,s,Part); return true; } bool SetFrameOverride(const char *Mat,GhoulID Skin,GhoulID Part=0) { GhoulID m=GetGhoulObject()->FindMaterial(Mat); if (!m) return false; if (!Skin) return false; SetFrameOverride(m,Skin,Part); return true; } GhoulID GetFrameOverride(const char *Mat,const char *Part,TexChannel Channel=Diffuse) { GhoulID m=GetGhoulObject()->FindMaterial(Mat); GhoulID p=GetGhoulObject()->FindPart(Part); if (!m) return 0; return GetFrameOverride(m,p,Channel); } GhoulID GetFrameOverride(const char *Mat,GhoulID Part=0,TexChannel Channel=Diffuse) { GhoulID m=GetGhoulObject()->FindMaterial(Mat); if (!m) return 0; return GetFrameOverride(m,Part,Channel); } bool ClearFrameOverride(const char *Mat,const char *Part,TexChannel Channel) { GhoulID m=GetGhoulObject()->FindMaterial(Mat); GhoulID p=GetGhoulObject()->FindPart(Part); if (!m) return false; ClearFrameOverride(m,p,Channel); return true; } bool Play(const char *Seq,float Now,float PlayPos,bool Restart,EndCondition ec, bool MatchCurrentPos, bool reverseAnim) { GhoulID s=GetGhoulObject()->FindSequence(Seq); if (!s) return false; Play(s,Now,PlayPos,Restart,ec,MatchCurrentPos,reverseAnim); return true; } bool AddNoteCallBack(IGhoulCallBack *c,const char *Token) { GhoulID t=GetGhoulObject()->FindNoteToken(Token); AddNoteCallBack(c,t); return true; } bool RemoveNoteCallBack(IGhoulCallBack *c,const char *Token) { GhoulID t=GetGhoulObject()->FindNoteToken(Token); RemoveNoteCallBack(c,t); return true; } bool AddMatrixCallBack(IGhoulCallBack *c,const char *Part,MatrixType kind) { GhoulID t=GetGhoulObject()->FindPart(Part); AddMatrixCallBack(c,t,kind); return true; } bool RemoveMatrixCallBack(IGhoulCallBack *c,const char *Part,MatrixType kind) { GhoulID t=GetGhoulObject()->FindPart(Part); RemoveMatrixCallBack(c,t,kind); return true; } float GetSequenceLength(const char *Seq,EndCondition ec) { GhoulID s=GetGhoulObject()->FindSequence(Seq); if (!s) return 0.0f; return GetSequenceLength(s,ec); } bool Bolt(const char *bolt, IGhoulInst *Bolted, const char *BoltedBolt) { GhoulID b = GetGhoulObject()->FindPart(bolt); GhoulID bb = Bolted->GetGhoulObject()->FindPart(BoltedBolt); Bolt(b, Bolted, bb); return true; } bool SetMyBolt(const char *Bolt) { GhoulID b=GetGhoulObject()->FindPart(Bolt); SetMyBolt(b); return true; } bool GetBoltMatrix(float Time,Matrix4 &m,const char *Part,MatrixType kind,bool ToRoot) { GhoulID t=GetGhoulObject()->FindPart(Part); GetBoltMatrix(Time,m,t,kind,ToRoot); return true; } bool GetBoundBox(float Time,const Matrix4 &ToWorld,Vect3 &mins,Vect3 &maxs,const char *Part) { GhoulID t=GetGhoulObject()->FindPart(Part); GetBoundBox(Time,ToWorld,mins,maxs,t); return true; } }; class IGhoul { public: virtual IGhoulObj *NewObj()=0; virtual void GlPrep(void *gl=0)=0; //gl is assumed to be an GhoulOpenGL * virtual void PreCache(bool Specular)=0; virtual void GlUnprep()=0; virtual void BeginServerFrame()=0; virtual void EndServerFrame()=0; virtual void DestroyAllObjects()=0; virtual void FlushUnusedFiles()=0; virtual void Destroy()=0; virtual IGhoulInst *FindClientInst(GhoulUUID key)=0; virtual IGhoulObj *FindClientObj(GhoulUUID key)=0; virtual void SetFilenameMapper(void (*Map)(char *dest,const char *src))=0; //server virtual void AddClient(int client)=0; virtual void RemoveClient(int client)=0; virtual void FlushClients()=0; virtual void RemoveAllClients()=0; virtual bool PackReliable(int client,int packetID,OutPacket &op)=0; virtual bool NeedReliable(int client)=0; virtual bool Pack(int client,int packetID,OutPacket &op,float baseTime)=0; virtual void AckPack(int client,int packetID)=0; virtual void ReliableHitWire(int client,int packetID)=0; virtual void GhoulClearClientQueue(int client,int packetID)=0; virtual void AddFileForDownLoad(const char *name)=0; //client virtual void Precache()=0; virtual void UnPackReliable(int packetID,InPacket &ip,bool specular)=0; virtual void UnPack(int packetID,InPacket &ip,float now)=0; virtual int GetSavedReliableSize() const=0; virtual const unsigned char *GetSavedReliable()=0; virtual int GetNumExportLights()=0; virtual void GetExportLight(int i,QuakeLight &ql)=0; virtual void BeginRenderFrame()=0; virtual void AddImportLight(const QuakeLight &ql)=0; virtual void EndRenderFrame()=0; virtual void FlushMeshCache()=0; virtual void AddMapLight(const QuakeLight &ql)=0; virtual void FinishMapLights()=0; virtual void ClearMapLights()=0; virtual void SetGammaTable(unsigned char * table)=0; virtual void SetMip(int mip)=0; virtual void SetPolyOffset(float factor,float unit)=0; virtual int GetNumTexturesBound()=0; virtual int GetNumTexturesBoundBytes()=0; virtual int GetNumMeshesRendered()=0; virtual int GetNumTrianglesRendered()=0; virtual int GetNumTrianglesRenderedSpec()=0; virtual int GetNumVertsRendered()=0; virtual int GetNumCornersRendered()=0; virtual int GetNumLightRaysRendered()=0; virtual void ClearStats()=0; }; IGhoul *GetGhoul(bool Client=false,bool Menu=false); #endif