/******************************Module*Header*******************************\ * Module Name: state.h * * STATE * * Copyright (c) 1995 Microsoft Corporation * \**************************************************************************/ #ifndef __state_h__ #define __state_h__ #include "sscommon.hxx" #include "pipe.h" #include "node.h" #include "view.h" #include "nstate.h" #include "fstate.h" #define MAX_DRAW_THREADS 4 #define TEAPOT 66 #define MAX_TESS 3 // type(s) of pipes that are drawn enum { DRAW_NORMAL, DRAW_FLEX, DRAW_BOTH // not currently used }; // Reset status #define RESET_STARTUP_BIT (1L << 0) #define RESET_NORMAL_BIT (1L << 1) #define RESET_RESIZE_BIT (1L << 2) #define RESET_REPAINT_BIT (1L << 3) // Frame draw schemes enum { FRAME_SCHEME_RANDOM, // pipes draw randomly FRAME_SCHEME_CHASE, // pipes chase a lead pipe }; class DRAW_THREAD { private: HDC hdc; HTEXTURE htex; public: HGLRC hglrc; // rc to draw with (public so STATE can delete) int priority; DRAW_THREAD(); ~DRAW_THREAD(); PIPE *pPipe; // generic pipe ptr void SetRCDC( HGLRC rc, HDC hdc ); BOOL HasRC(); HGLRC GetRC(); void MakeRCCurrent(); void SetTexture( HTEXTURE htex ); void SetPipe( PIPE *pipe ); BOOL StartPipe(); void DrawPipe(); void KillPipe(); }; // Program existence instance class NORMAL_STATE; class FLEX_STATE; class STATE { public: HGLRC shareRC; // RC that objects are shared from PIPE *pLeadPipe; // lead pipe for chase scenarios int nSlices; // reference # of slices around a pipe BOOL bTexture; // global texture enable int nTextures; TEXTURE texture[MAX_TEXTURES]; IPOINT2D texRep[MAX_TEXTURES]; VIEW view; // viewing parameters float radius; // 'reference' pipe radius value NODE_ARRAY *nodes; // for keeping track of draw space NORMAL_STATE *pNState; FLEX_STATE *pFState; STATE( BOOL bFlexMode, BOOL bMultiPipes ); ~STATE(); void Reshape( int width, int height, void *data ); void Repaint( LPRECT pRect, void *data ); void Draw( void *data ); void Finish( void *data ); private: int drawMode; // drawing mode (flex or normal for now) int drawScheme; // random or chase int maxPipesPerFrame; // max number of separate pipes/frame int nPipesDrawn; // number of pipes drawn or drawing in frame int maxDrawThreads; // max number of concurrently drawing pipes int nDrawThreads; // number of live threads DRAW_THREAD drawThreads[MAX_DRAW_THREADS]; int resetStatus; SS_DIGITAL_DISSOLVE_CLEAR ddClear; int bCalibrateClear; void GLInit(); void DrawValidate(); // validation to do before each Draw void ResetView(); void FrameReset(); void Clear(); void ChooseNewLeadPipe(); void CompactThreadList(); BOOL LoadTextureFiles(); BOOL LoadTextureFiles( TEXFILE *pTexFile, int nTexFiles, TEX_RES *pTexRes ); void CalcTexRepFactors(); int CalcMaxPipesPerFrame(); }; #endif // __state_h__