#ifndef _TRACK_H_ #define _TRACK_H_ #include "DEFINES.H" #include #include #include #include "CC_alloc.h" #include "fileIO.h" #include #include #include #ifndef __DEFINE_NUMS__ #define __DEFINE_NUMS__ #define f32 float #define u32 unsigned int #define s32 int #define u16 unsigned short #define s16 signed short #define u8 unsigned char #define s8 char #endif #include "TOOLS.h" inline void *ZeroAlloc(u32 Size) { void *Ret; Ret = CC_malloc(Size); memset(Ret,0,Size); return Ret; } inline void *ZeroRealloc(void* ptr, u32 Size) { void *Ret; Ret = CC_realloc(ptr, Size); memset(Ret,0,Size); return Ret; } /* Draw functions */ typedef struct DrwTEXT_UI_ { s32 X,Y; s32 XEnd,YEnd; s32 CursorPosX,CursorPosY; u32 CursorPos,CursorPosUP,CursorPosDown; u32 CurrentCursorPos; u32 SelStart,SelEnd; u32 ColorFront,ColorBack; s32 MouseX,MouseY,MouseToCursor; u32 Birth; u32 Age; u32 InsertMode; u32 DontDraw; u32 HCenter; u32 ModePassword; SIZE *FONT_CharBounds; SIZE *FONT_CharPos; MAP *FONT_Image; u32 FONT_AlphaMode; TEXTMETRIC *FONT_Metrix; } DrwTEXT_UI; void DRawTEXT_UserInterface(unsigned char *pTEXT,u32 *pBase,s32 Pitch , u32 Height , DrwTEXT_UI *DUI); void DRawTEXT_Soft_B(unsigned char *pTEXT,u32 *pBase,u32 X, u32 Y, s32 Pitch , u32 Height , u32 Color); void DRawTEXT_Soft_B(unsigned char *pTEXT,u32 *pBase,u32 X, u32 Y, s32 Pitch , u32 Height , u32 Color); void DRawTEXT_Soft_B2x(unsigned char *pTEXT,u32 *pBase,u32 X, u32 Y, s32 Pitch , u32 Height , u32 Color); void DRawTEXT_Soft_B_Centered(u8 *pTEXT,u32 *pBase,s32 Pitch , u32 Height , u32 Color); #define ARGB2ABGR(color) ((color & 0xFF000000) | ((color & 0xFF0000)>>16) | (color & 0xFF00) | ((color & 0xFF)<<16)) class Color4 { public: union { float m_tab[4]; struct { float m_a; float m_r; float m_g; float m_b; }; }; Color4() { m_a = 1.f; m_r = 1.f; m_g = 1.f; m_b = 1.f; } Color4(u32 _color) { fromU32(_color); } Color4(float _a, float _r, float _g, float _b) { m_a = _a; m_r = _r; m_g = _g; m_b = _b; } void fromU32(u32 _color) { m_a = (float)((_color >> 24) & 0xff) / 255.f; m_r = (float)((_color >> 16) & 0xff) / 255.f; m_g = (float)((_color >> 8) & 0xff) / 255.f; m_b = (float)((_color ) & 0xff) / 255.f; } u32 toU32Color() { u32 finalColor = 0; f32 tmpColor; tmpColor = m_a * 255.f; if (tmpColor > 255.f) tmpColor = 255.f; if (tmpColor < 0.f) tmpColor = 0.f; finalColor = finalColor << 8 | (u32)tmpColor; tmpColor = m_r * 255.f; if (tmpColor > 255.f) tmpColor = 255.f; if (tmpColor < 0.f) tmpColor = 0.f; finalColor = finalColor << 8 | (u32)tmpColor; tmpColor = m_g * 255.f; if (tmpColor > 255.f) tmpColor = 255.f; if (tmpColor < 0.f) tmpColor = 0.f; finalColor = finalColor << 8 | (u32)tmpColor; tmpColor = m_b * 255.f; if (tmpColor > 255.f) tmpColor = 255.f; if (tmpColor < 0.f) tmpColor = 0.f; finalColor = finalColor << 8 | (u32)tmpColor; return finalColor; } float & operator[] (u32 _index) { return m_tab[_index]; } Color4 operator+ (Color4 _color) { return Color4(m_a + _color.m_a, m_r + _color.m_r,m_g + _color.m_g,m_b + _color.m_b); } Color4 operator+= (Color4 _color) { m_a+=_color.m_a; m_r+=_color.m_r; m_g+=_color.m_g; m_b+=_color.m_b; return *this; } Color4 operator- (Color4 _color) { return Color4(m_a - _color.m_a, m_r - _color.m_r,m_g - _color.m_g,m_b - _color.m_b); } Color4 operator-= (Color4 _color) { m_a-=_color.m_a; m_r-=_color.m_r; m_g-=_color.m_g; m_b-=_color.m_b; return *this; } Color4 operator* (f32 val) { return Color4(m_a*val,m_r*val,m_g*val,m_b*val); } }; typedef struct RS_ { u8 LIGHTED:1; u8 WIRED:1; u8 BACKFACE:1; u8 BACKFACE_INVERT:1; u8 NOZWRITE:1; u8 NOZTEST:1; u8 TEXTURED:1; u8 HIDECOLOR:1; u8 HIDEALPHA:1; u8 SECONDPASS:1; u8 INVERTALPHA:1; u8 PICKABLE:1; u8 SKIPLAYER:1; u8 TEXTUREREPEAT_U:1; u8 TEXTUREREPEAT_V:1; u8 PICKABLE_NO_TRANSPARENCY:1; u8 ZEQUAL:1; u8 ZPASS:1; u8 USEVERTEXCOLORS:1; u8 TEXTUREBILINEAR:1; /* UV MATRIX | 0 1 | | 2 3 | translation [ 4 5 ] */ float UVMATRIX[6]; #define BLENDING_MODES "BLENDING MODES: 0=COPY;1=ALPHA;2=ADD;3=ALPHA PREMULT;4=PREVIOUS ALPHA;5=Multiply;6=Multiply Invert;7=Multiply x 2" #define MAPPING_MODES "MAPPING MODES: 0=OBJECT;1=CHROME;2=PLANAR Z;3=PLANAR SCRENN;4=OBJECT UV2" u8 BlendingMode; u8 MappingMode; u8 AlphaThreshold; float NormalExtraction; /// animation on textures u16 AnimNbX; u16 AnimNbY; float AnimFPS; DWORD AnimTime; } RS; _inline void GLOB_SetDefaultRS(RS *RenderMode) { RenderMode->WIRED = 0; RenderMode->LIGHTED = 0; RenderMode->BACKFACE = 1; RenderMode->BACKFACE_INVERT = 0; RenderMode->NOZWRITE = 0; RenderMode->ZEQUAL = 0; RenderMode->ZPASS = 0; RenderMode->NOZTEST = 0; RenderMode->TEXTURED = 1; RenderMode->HIDECOLOR = 0; RenderMode->HIDEALPHA = 0; RenderMode->SECONDPASS = 0; RenderMode->INVERTALPHA = 0; RenderMode->PICKABLE = 1; RenderMode->PICKABLE_NO_TRANSPARENCY = 0; RenderMode->SKIPLAYER = 0; RenderMode->TEXTUREREPEAT_U = 1; RenderMode->TEXTUREREPEAT_V = 1; RenderMode->UVMATRIX[0] = RenderMode->UVMATRIX[3] = 1; RenderMode->UVMATRIX[1] = RenderMode->UVMATRIX[2] = RenderMode->UVMATRIX[4] = RenderMode->UVMATRIX[5] = 0; RenderMode->BlendingMode = 0 /* Copy */; RenderMode->MappingMode = 0 /* Copy */; RenderMode->AlphaThreshold = 0; RenderMode->NormalExtraction = 0.0f; RenderMode->USEVERTEXCOLORS = 0; RenderMode->TEXTUREBILINEAR = 1; RenderMode->AnimNbX = 1; RenderMode->AnimNbY = 1; RenderMode->AnimFPS = 0.0f; RenderMode->AnimTime= 0; }; #define MAX_LIGHT 20 #define MAX_BROCH 20 typedef struct Light_ { struct _3D_Light_ *LightDesc; Vector Position; Vector Direction; } Light; typedef struct OPENGL_TEXTURE_ { MAP *pExtRef; u32 OGLRef; // -1 mean notexture u32 ColorMode; // 0 = RGBA ; 1 = BW u32 ClampMode; // 1 = clamp U , 2 = clamp V , 3 clamp UV u32 CacheCounter; u32 LayerIndex; // -1 mean not a layered texture u32 LastHash; u32 IsMipMapped; } OPENGL_TEXTURE; #define MaxOglTexture 2048 //#define MaxOglTexture 4096 #define NUMBER_OF_WORKING_REF 12 class DrawInterface { public: u32 FORCE_RENDER_FLAG; u32 PickingEnable; Vector MousePicking; Vector MousePickingXYZ; Vector MousePickingUVW; u32 MousePickingTri; float MousePickingCurrentZ; MAP *pPickedTexture; class WORLD *MotherClass; Light AllLight[MAX_LIGHT]; u32 AllLightNumber;//*/ void *pComputingBuffer; u32 ComputingBufferSize; float ComputeMaskAlpha; u32 OptimiseQuadRender; u32 FB_SX,FB_SY; u32 CurrentColor; u32 QuadRotation_ON; MATRIX QuadRotationMatrix; float QuadRotation_Focale; float QuadUVMatrix[4]; // X,Y,W,H Vector QuadDisplace; u32 QuadHideColor; float CurrentViewport[4]; float SavedCurrentViewport[4]; float ZBIas; float ZQuad; s32 RenderTargetBaseX; s32 RenderTargetBaseY; u32 RenderTargetState; u32 OGLTextureSizeX; u32 OGLTextureSizeY; u32 RectifyTextOrigin; RECT ActivRect; RECT ScissorRect; HWND OpenglDisplayer; // Local Window OPENGL_TEXTURE AllRef[MaxOglTexture]; RS CurrentRS; RS LastRS; u32 ulNumberOfTexture; u32 ulCurrentTexture; HDC hDC; HGLRC hRC; HWND CurrenthWnd; RECT CurrentRect; RECT hDCRect; float fFocUsed; #define NUMBER_OF_OGL_WORKING_REF NUMBER_OF_WORKING_REF u32 OGLWorkingRef[NUMBER_OF_OGL_WORKING_REF]; u32 IsVisible; void AddALight(struct _3D_Light_ *pLight,Vector *Position,Vector *Direction) { if (AllLightNumber < MAX_LIGHT) { AllLight[AllLightNumber].LightDesc = pLight; AllLight[AllLightNumber].Position = *Position; AllLight[AllLightNumber].Direction = *Direction; AllLightNumber++; }; }; void ClearLight() { AllLightNumber = 0; }; virtual void Begin(RECT *HdcRect) = 0; virtual void End() = 0; virtual void Flush() = 0; virtual void Perspective(float FocaleLenght) = 0; virtual void Holographic(Vector *pUserpos,float WindowWith) = 0; virtual void Ortho() = 0; virtual void Flip(s32 ShowMe) = 0; virtual void Clear(u32 Color) = 0; virtual void ClearZ() = 0; virtual void Matrix(MATRIX *MatrixToSet) = 0; virtual void RenderMesh(Mesh *pMyMesh,u32 Num, u32 Base) = 0; void RenderMesh(Mesh *pMyMesh) {RenderMesh(pMyMesh,pMyMesh->NumberOfFaces,0);}; virtual void ReverseRenderMesh(Mesh *pMyMesh,u32 TextureSource,u32 Num, u32 Base) = 0; void ReverseRenderMesh(Mesh *pMyMesh,u32 TextureSource) {ReverseRenderMesh(pMyMesh,TextureSource,pMyMesh->NumberOfFaces,0);}; virtual void SetRS(RS *RenderMode,u32 TextureIndex) = 0; virtual void DrawQuad(u32 Color,float X, float Y,float Xsize, float Ysize,float TX,float TY,float TW,float TH) = 0; void DrawCircle(u32 TextureIndex,Vector *Center, float InnerRadius, float OuterRadius, float ClockDegreeStart,float ClockDegreeEnd,RS *RenderState); void DrawPatch32(u32 TextureIndex,Vector *Point, Color4*Colors, u32 drawHalf,u32 NumberOfCurves,u32 HDIV, u32 VDIV,RS *RenderState); virtual void SetCurrentColor(u32 Color) = 0; virtual u32 GetCurrentColor() {return 0xffffffff;}; virtual void ReadFrameBuffer(s32 X,s32 Y,s32 SX,s32 SY, MAP *dest) = 0; /* Texture management */ virtual u32 CreateTexture(MAP *pExternalReferenceRGBA,u32 Colormode, bool forceCreation = false) {return (u32)-1;}; virtual u32 CreateLayerTexture(MAP *pExternalReferenceRGBA,u32 LayerIndex) = 0; virtual void DestroyLayerTexture(u32 TextureIndex) = 0; virtual void SetTextureColorMode(u32 Index,u32 ColorMode) = 0; virtual void UpdateTexture_BM_2_HW(u32 TextureIndex, bool isDynmaic = true) = 0; virtual void UpdateTexture_HW_2_BM(u32 TextureIndex,u32 UpdateSoftBuffer) = 0; virtual void UpdateTexture_HW_2_BM(u32 TextureIndex,u32 UpdateSoftBuffer,s32 SourceX,s32 SourceY) = 0; virtual void DestroyTexture(u32 TextureIndex) = 0; void SetBackGround(u32 TextureIndex,u32 Blend = 0); void DrawQuad(u32 TextureIndex,s32 XMin,s32 XMax,s32 YMin,s32 YMax,RS *RenderMode = NULL); void DrawQuadDistord(u32 TextureIndex,s32 XMin,s32 XMax,s32 YMin,s32 YMax,RS *RenderMode = NULL); void DrawCenteredQuad(u32 Color,float Xsize, float Ysize, float FX,float FY); void Process2DProjection(); void Process2DRotation(u8 begin, s32 bnd0X = 0, s32 bnd1X = 0, s32 bnd0Y = 0, s32 bnd1Y = 0); void DrawMultipleQuads(u32 TextureIndex,u32 Number,s32 *Bounds,float *BoundsUV,RS *RenderState = NULL); void Draw2DLine(u32 TextureIndex, Vector *A, Vector *B, int Lenght, RS *RenderState = NULL); virtual void DrawLine(u32 Color,Vector *A,Vector *B, int Lenght = 0) = 0; void SetQuadHideColorAlpha(int C,int A); void SetQuadRot(float Focale , Vector *pAxisAngle , Vector *pCenter); void SetQuadDisplace(Vector *pDisplace); void SetQuadUVSource(float BasU,float BasV,float WU,float WV); void SetQuadDefault(); virtual void Setexture(u32 TextureIndex,float *UVMatrix = NULL) = 0; virtual void SetFog(u32 OnOff,float Near , float far , u32 Color) = 0; virtual void BeginTextureTarget(u32 TextureIndex,u32 SaveFrontBuffer = 0) = 0; virtual void EndTextureTarget(u32 TextureIndex,u32 bUpdateSoftBuffer) = 0; virtual void ChangeMode(HWND Mother, bool UseGDI) = 0; virtual void SetResolution(u32 X,u32 SY) = 0; virtual void SetViewport(s32 X,s32 Y,s32 SX,s32 SY) = 0; void GetViewport(s32 *X,s32 *Y,s32 *SX,s32 *SY) { *X = s32(CurrentViewport[0]) ; *Y = s32(CurrentViewport[1]) ; *SX = s32(CurrentViewport[2]) ; *SY = s32(CurrentViewport[3]) ; } virtual void SetClipping(s32 X,s32 Y,s32 SX,s32 SY) = 0; virtual void AfterEffect(u32 ulType,u32 Color,float Factor1,float Factor2,float Factor3 = 0.0f,float Factor4 = 0.0f,float Factor5 = 0.0f) = 0; virtual void LayerOperation(u32 ulType,u32 SlotIndex,u32 Color,float Factor1,float Factor2) = 0; /* Picking */ void Mul4x4Matrix(float *M1,float *M2,float *MR); void PickMesh(Mesh *pMyMesh,u32 Num, u32 Base); void PickQuad(u32 Color,float X, float Y,float Xsize, float Ysize,float TX,float TY,float TW,float TH); void PickQuadGone(u32 Color,Vector *XYZ, Vector *UV); /* Text */ u32 FontTextureIndex; MAP FontMap; void init_font(void); void DrawText(unsigned char *Txt,float X, float Y, float FX, float FY , u32 ColorRGBA , u32 DrawModeShadow = 1); void DrawTextCentered(unsigned char *pTEXT,u32 Color); void RenderText(unsigned char *Txt,float X, float Y, float FX, float FY , u32 ColorRGBA, MAP *fontMap, int TextureIdx, SIZE *CharPos, SIZE *CharBounds, u32 optionMask, int blendingMode = -1); void GetTextSize(unsigned char *Txt,s32 *DX,s32 *DY, SIZE *CharBounds = NULL); /* Win32 */ virtual void Destroy() = 0; // Destroy virtual void AdaptTOWindow(HWND hWnd) = 0; virtual void DrawParticules(void *particuleList, int nbParticules, u32 TextureIndex, SIZE grid,RS *RenderState, MATRIX Orientation) = 0; virtual void DrawFur(void *fur, u32 TextureIndex,RS *RenderState, MATRIX Orientation, u32 debug) = 0; /* Matrix Overloadd */ /* 0 = Projection , 1 = Model , 2 = Texture */ virtual void GetMatrix(u32 Mode,float *pDest) = 0; virtual void SetMatrix(u32 Mode,float *pDest) = 0; virtual u32 GetDriverType() = 0; // "opengl" = 0 , 'D3D' = 1 }; DrawInterface *CreateOglObject(HWND Mother,u32 FrameBuffSizeX,u32 FrameBuffSizeY); DrawInterface *CreateD3DObject(HWND Mother,u32 FrameBuffSizeX,u32 FrameBuffSizeY); DrawInterface *CreateNulObject(HWND Mother,u32 FrameBuffSizeX,u32 FrameBuffSizeY); /* TOOLS */ u32 GetFileLenght(char *Filename); u32 IsExist(char *Filename); class INPUT_IO *CreateIO(class WORLD *,char *MediaName, bool dummy = false); class INPUT_IO *ERROR_CREATE(char *Error); u32 GetBitReverse(u32 Value); // Transform 0x80000000 into 0x00000001 u32 GetBitExpand(u32 Value); // Transform 0xFFFF into 0x55555555 u32 GetBitContract(u32 Value); // Transform 0x55555555 into 0xFFFF int GetLogUpperPO2(float Value); int GetUpperPO2(float Value); int GetFirstBit(u32 Mask); #define SAVE_MATRIXES()\ float _4x4_Persp[16];\ float _4x4_Model[16];\ float _4x4_Texture[16];\ float FocalSave;\ GetMatrix(0, _4x4_Persp);\ GetMatrix(1, _4x4_Model);\ GetMatrix(2, _4x4_Texture);\ FocalSave = fFocUsed; #define RESTORE_MATRIXES()\ fFocUsed = FocalSave;\ SetMatrix(0, _4x4_Persp);\ SetMatrix(1, _4x4_Model);\ SetMatrix(2, _4x4_Texture); #define TYPE_Of_PREC float typedef struct FFT_Complex_ { TYPE_Of_PREC re,im; } FFT_Complex; void FFT2Image(int *Picture,void *FFT,int Pitch); void *Image2FFT(int *Picture,int SizePo2,int Pitch); void PatchPointsToNormals(Vector *pCurves, Color4 *dstColors, u32 *srColors, int invert); Vector PatchGetXYZFromUV(Vector *pCurves, Vector UV); Vector PatchGetUVFromXYZ(Vector *pCurves, Vector Point, Vector vMin, Vector vMax); #endif