| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179 |
- /*
- ** Command & Conquer Renegade(tm)
- ** Copyright 2025 Electronic Arts Inc.
- **
- ** This program is free software: you can redistribute it and/or modify
- ** it under the terms of the GNU General Public License as published by
- ** the Free Software Foundation, either version 3 of the License, or
- ** (at your option) any later version.
- **
- ** This program is distributed in the hope that it will be useful,
- ** but WITHOUT ANY WARRANTY; without even the implied warranty of
- ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ** GNU General Public License for more details.
- **
- ** You should have received a copy of the GNU General Public License
- ** along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
- //
- // skeleton.cpp : Defines the entry point for the application.
- //
- // Skeleton WW3D code, Hector Yee, 8/31/00
- #include "resource.h"
- #include "wwmath.h"
- #include "ww3d.h"
- #include "scene.h"
- #include "rendobj.h"
- #include "camera.h"
- #include "AssetMgr.H"
- #include "msgloop.h"
- #include "part_ldr.h"
- #include "rendobj.h"
- #include "hanim.h"
- #include "dx8wrapper.h"
- #include "dx8indexbuffer.h"
- #include "dx8vertexbuffer.h"
- #include "dx8fvf.h"
- #include "vertmaterial.h"
- #include "font3d.h"
- #include "render2d.h"
- #include "textdraw.h"
- #include "rect.h"
- #include "mesh.h"
- #include "meshmdl.h"
- #include "line3d.h"
- #include "dynamesh.h"
- #include "sphereobj.h"
- #include "ringobj.h"
- #include "surfaceclass.h"
- #include "vector2i.h"
- #include "bmp2d.h"
- #include "decalsys.h"
- #include "shattersystem.h"
- #include "light.h"
- #include "texproject.h"
- #include "keyboard.h"
- #include "wwmouse.h"
- #include "predlod.h"
- #include "segline.h"
- #include <stdio.h>
- #include "dx8renderer.h"
- #include "textureloader.h"
- #define MAX_LOADSTRING 100
- const int RESOLUTION_X = 640;
- const int RESOLUTION_Y = 480;
- const int BIT_DEPTH = 16;
- const Vector3 CAMERA_POSITION(3.0f,0.0f,1.0f);
- const Vector3 CAMERA_TARGET(0.0f,0.0f,0.90f);
- const Vector3 OBJECT_POSITION(0.0f,0.0f,0.0f);
- const char * OBJECT_NAME = "area1-LM";
- const char * ANIM_NAME = NULL;
- static void Log_Statistics();
- static void Init_Assets();
- static void Init_3D_Scene();
- static void Init_2D_Scene();
- class SkeletonSceneClass;
- // Global Variables:
- HINSTANCE hInst; // current instance
- TCHAR szTitle[MAX_LOADSTRING]; // The title bar text
- TCHAR szWindowClass[MAX_LOADSTRING]; // The title bar text
- WW3DAssetManager * AssetManager=NULL;
- SkeletonSceneClass * my_scene = NULL;
- SimpleSceneClass * my_2d_scene = NULL;
- CameraClass * my_camera = NULL;
- CameraClass * my_2d_camera = NULL;
- Render2DTextClass * mytext = NULL;
- RenderObjClass * my_object = NULL;
- HAnimClass * my_anim = NULL;
- TexProjectClass * my_texture_projector = NULL;
- MaterialPassClass * my_material_pass = NULL;
- LightClass * my_lights[3];
- Font3DInstanceClass *my_font_a=NULL;
- Font3DInstanceClass *my_font_b=NULL;
- DecalSystemClass TheDecalSystem;
- bool running=true;
- bool rotate=true;
- bool randmat=false;
- bool randtex=false;
- bool staticsort=true;
- bool using_mat_pass=false;
- int shatter=0;
- // Foward declarations of functions included in this code module:
- ATOM MyRegisterClass(HINSTANCE hInstance);
- LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
- LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);
- void Enable_Alternate_Materials(RenderObjClass * model,bool onoff);
- void Render();
- void Render2();
- RenderObjClass * Create_Dynamesh(void);
- RenderObjClass * Create_Sphere(void);
- RenderObjClass * Create_Ring(void);
- RenderObjClass * Create_bitmap2d(void);
- RenderObjClass * Create_segline(void);
- void WWDebug_Message_Callback(DebugType type, const char * message);
- void WWAssert_Callback(const char * message);
- void Debug_Refs(void);
- void Create_Decal(RenderObjClass * obj,Matrix3D & tm,float radius,char * texture);
- MaterialPassClass * Create_Material_Pass(void);
- TexProjectClass * Create_Texture_Projector(void);
- // ----------------------------------------------------------------------------
- //
- // FPS counter class counts how many times Update() has been called during the
- // last second. The fps counter caps at MAX_FPS which is the maximum fps count
- // that can be measured.
- //
- // ----------------------------------------------------------------------------
- const unsigned MAX_FPS=2000;
- class FPSCounterClass
- {
- unsigned frame_times[MAX_FPS];
- unsigned frame_time_count;
- public:
- FPSCounterClass();
- void Update();
- unsigned Get_FPS();
- };
- static FPSCounterClass fps_counter;
- // ----------------------------------------------------------------------------
- FPSCounterClass::FPSCounterClass()
- :
- frame_time_count(0)
- {
- }
- // ----------------------------------------------------------------------------
- void FPSCounterClass::Update()
- {
- unsigned frame_time=timeGetTime();
- unsigned limit=frame_time-1000;
- for (unsigned i=0;i<frame_time_count;++i) {
- if (frame_times[i]<limit) {
- frame_times[i]=frame_times[frame_time_count-1];
- frame_time_count--;
- }
- }
- if (frame_time_count<MAX_FPS) {
- frame_times[frame_time_count++]=frame_time;
- }
- }
- // ----------------------------------------------------------------------------
- unsigned FPSCounterClass::Get_FPS()
- {
- return frame_time_count;
- }
- // ----------------------------------------------------------------------------
- //
- // Cusomized scene for testing material passes.
- //
- // ----------------------------------------------------------------------------
- class SkeletonSceneClass : public SimpleSceneClass
- {
- public:
- SkeletonSceneClass(void) : TestPass(NULL) { }
- ~SkeletonSceneClass(void) { REF_PTR_RELEASE(TestPass); }
- virtual void Customized_Render(RenderInfoClass & rinfo);
- void Set_Material_Pass(MaterialPassClass * pass) { REF_PTR_SET(TestPass,pass); }
- protected:
- MaterialPassClass * TestPass;
- };
- // ----------------------------------------------------------------------------
- void SkeletonSceneClass::Customized_Render(RenderInfoClass & rinfo)
- {
- if (TestPass) {
- rinfo.Push_Material_Pass(TestPass);
- }
- SimpleSceneClass::Customized_Render(rinfo);
- if (TestPass) {
- rinfo.Pop_Material_Pass();
- }
- }
- // ----------------------------------------------------------------------------
- //
- //
- //
- // ----------------------------------------------------------------------------
- int APIENTRY WinMain(HINSTANCE hInstance,
- HINSTANCE hPrevInstance,
- LPSTR lpCmdLine,
- int nCmdShow)
- {
- HACCEL hAccelTable;
- hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_SKELETON);
-
- // install debug callbacks
- WWDebug_Install_Message_Handler(WWDebug_Message_Callback);
- WWDebug_Install_Assert_Handler(WWAssert_Callback);
- // Initialize global strings
- LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
- LoadString(hInstance, IDC_SKELETON, szWindowClass, MAX_LOADSTRING);
- MyRegisterClass(hInstance);
- // Perform application initialization:
- hInst = hInstance; // Store instance handle in our global variable
- HWND hWnd = CreateWindow(
- szWindowClass,
- szTitle,
- WS_OVERLAPPEDWINDOW,
- CW_USEDEFAULT,
- 0,
- CW_USEDEFAULT,
- 0,
- NULL,
- NULL,
- hInstance,
- NULL);
- ShowWindow(hWnd, nCmdShow);
- UpdateWindow(hWnd);
- // WW Inits
- WWMath::Init ();
- AssetManager=new WW3DAssetManager;
- AssetManager->Register_Prototype_Loader(&_ParticleEmitterLoader);
- AssetManager->Load_3D_Assets("ShatterPlanes0.w3d"); // Shatter planes
- WW3D::Init(hWnd);
- // WW3D::Set_Prelit_Mode(WW3D::PRELIT_MODE_VERTEX);
- WW3D::Set_Prelit_Mode(WW3D::PRELIT_MODE_LIGHTMAP_MULTI_PASS);
- // WW3D::Set_Prelit_Mode(WW3D::PRELIT_MODE_LIGHTMAP_MULTI_TEXTURE);
- // WW3D::Set_Collision_Box_Display_Mask(0xFF);
-
- if (WW3D::Set_Render_Device(-1,RESOLUTION_X,RESOLUTION_Y,BIT_DEPTH,1,true)!=WW3D_ERROR_OK) {
- if (WW3D::Set_Any_Render_Device()!=WW3D_ERROR_OK) {
- WW3D::Shutdown();
- WWMath::Shutdown ();
- Debug_Refs();
- return 0;
- }
- }
- Init_Assets();
- Init_2D_Scene();
- Init_3D_Scene();
- // main loop
- int time=timeGetTime();
- float theta = 0.0f;
- while (running)
- {
- if (my_object && rotate) {
- theta += DEG_TO_RADF(0.1f);
- Matrix3D tm(1);
- tm.Rotate_Z(theta);
- //tm.Rotate_X(theta*1.37f);
- //tm.Rotate_Y(theta*1.09f);
- tm.Set_Translation(OBJECT_POSITION);
- my_object->Set_Transform(tm);
- }
- if (my_object && my_texture_projector) {
- my_texture_projector->Set_Transform(my_object->Get_Bone_Transform("ProjectorBone"));
- }
- if (shatter==1)
- {
- if (my_object->Class_ID()==RenderObjClass::CLASSID_MESH)
- {
- my_scene->Remove_Render_Object(my_object);
- ShatterSystem::Shatter_Mesh((MeshClass*)my_object,Vector3(0,0,0),Vector3(1,0,0));
- REF_PTR_RELEASE(my_object);
- int count=ShatterSystem::Get_Fragment_Count();
- int i;
- for (i=0; i<count; i++)
- {
- my_object=ShatterSystem::Get_Fragment(i);
- my_object->Set_Position(my_object->Get_Position()+Vector3(rand()%15,rand()%15,rand()%15));
- my_scene->Add_Render_Object(my_object);
- REF_PTR_RELEASE(my_object);
- }
- }
- shatter++;
- }
- if (randmat)
- {
- if (my_object->Class_ID()==RenderObjClass::CLASSID_MESH)
- {
- MeshClass *mesh=(MeshClass*) my_object;
- MaterialInfoClass *mi=mesh->Get_Material_Info();
- VertexMaterialClass *vm=mi->Get_Vertex_Material(0);
- VertexMaterialClass *newvm=NEW_REF(VertexMaterialClass,(*vm));
- newvm->Set_Emissive(rand()%256/256.0,rand()%256/256.0,rand()%256/256.0);
- mesh->Replace_VertexMaterial(vm,newvm);
- mi->Replace_Material(0,newvm);
- REF_PTR_RELEASE(vm);
- REF_PTR_RELEASE(newvm);
- }
- randmat=!randmat;
- }
- if (randtex)
- {
- if (my_object->Class_ID()==RenderObjClass::CLASSID_MESH)
- {
- MeshClass *mesh=(MeshClass*) my_object;
- MaterialInfoClass *mi=mesh->Get_Material_Info();
- TextureClass *tex=mi->Peek_Texture(0);
- int ran=rand() % 3;
- char name[100];
- switch (ran)
- {
- case 0: sprintf(name,"catwalk.tga");
- break;
- case 1: sprintf(name,"chickonmap.tga");
- break;
- case 2: sprintf(name,"fullmoon.tga");
- break;
- }
- TextureClass *newtex=AssetManager->Get_Texture(name);
- mesh->Replace_Texture(tex,newtex);
- mi->Replace_Texture(0,newtex);
- REF_PTR_RELEASE(newtex);
- }
- randtex=!randtex;
- }
- if (my_texture_projector != NULL) {
- my_texture_projector->Pre_Render_Update(my_camera->Get_Transform());
- }
- WW3D::Enable_Static_Sort_Lists(staticsort);
- Render();
- Windows_Message_Handler();
- WW3D::Sync(timeGetTime()-time);
- Log_Statistics();
- }
- REF_PTR_RELEASE(my_scene);
- REF_PTR_RELEASE(my_camera);
- REF_PTR_RELEASE(my_2d_scene);
- REF_PTR_RELEASE(my_2d_camera);
- REF_PTR_RELEASE(my_lights[0]);
- REF_PTR_RELEASE(my_lights[1]);
- REF_PTR_RELEASE(my_lights[2]);
- delete mytext;
- REF_PTR_RELEASE(my_font_a);
- REF_PTR_RELEASE(my_font_b);
- REF_PTR_RELEASE(my_object);
- REF_PTR_RELEASE(my_anim);
- REF_PTR_RELEASE(my_material_pass);
- REF_PTR_RELEASE(my_texture_projector);
- PredictiveLODOptimizerClass::Free();
- // shutdown
- AssetManager->Free_Assets ();
- delete AssetManager;
- WW3D::Shutdown ();
- WWMath::Shutdown ();
- Debug_Refs();
- return 0;
- }
- // ----------------------------------------------------------------------------
- //
- // Render everything. Rendering stars with Begin_Scene() and ends to End_Scene().
- //
- // ----------------------------------------------------------------------------
- void Render()
- {
- // Predictive LOD optimizer optimizes the mesh LOD levels to match the given polygon budget
- PredictiveLODOptimizerClass::Optimize_LODs(5000);
- WW3D::Begin_Render(true,true,Vector3(0.0f,0.0f,0.0f));
- // Render 3D scene
- WW3D::Render(my_scene,my_camera);
- // Render 2D scene
- WW3D::Render(my_2d_scene,my_2d_camera);
- if (mytext) mytext->Render();
- WW3D::End_Render();
- fps_counter.Update();
- }
- // ----------------------------------------------------------------------------
- //
- // FUNCTION: MyRegisterClass()
- //
- // PURPOSE: Registers the window class.
- //
- // COMMENTS:
- //
- // This function and its usage is only necessary if you want this code
- // to be compatible with Win32 systems prior to the 'RegisterClassEx'
- // function that was added to Windows 95. It is important to call this function
- // so that the application will get 'well formed' small icons associated
- // with it.
- //
- // ----------------------------------------------------------------------------
- ATOM MyRegisterClass(HINSTANCE hInstance)
- {
- WNDCLASSEX wcex;
- wcex.cbSize = sizeof(WNDCLASSEX);
- wcex.style = CS_HREDRAW | CS_VREDRAW;
- wcex.lpfnWndProc = (WNDPROC)WndProc;
- wcex.cbClsExtra = 0;
- wcex.cbWndExtra = 0;
- wcex.hInstance = hInstance;
- wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_SKELETON);
- wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
- wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
- wcex.lpszMenuName = (LPCSTR)IDC_SKELETON;
- wcex.lpszClassName = szWindowClass;
- wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
- return RegisterClassEx(&wcex);
- }
- // ----------------------------------------------------------------------------
- //
- // FUNCTION: WndProc(HWND, unsigned, WORD, LONG)
- //
- // PURPOSE: Processes messages for the main window.
- //
- // WM_COMMAND - process the application menu
- // WM_PAINT - Paint the main window
- // WM_DESTROY - post a quit message and return
- //
- //
- // ----------------------------------------------------------------------------
- LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
- {
- int wmId, wmEvent;
- PAINTSTRUCT ps;
- HDC hdc;
- switch (message)
- {
- case WM_COMMAND:
- wmId = LOWORD(wParam);
- wmEvent = HIWORD(wParam);
- // Parse the menu selections:
- switch (wmId)
- {
- case IDM_ABOUT:
- DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
- break;
- case IDM_EXIT:
- DestroyWindow(hWnd);
- break;
- default:
- return DefWindowProc(hWnd, message, wParam, lParam);
- }
- break;
- case WM_ACTIVATEAPP:
- if (wParam) WW3D::On_Activate_App();
- else WW3D::On_Deactivate_App();
- return DefWindowProc(hWnd, message, wParam, lParam);
- case WM_PAINT:
- hdc = BeginPaint(hWnd, &ps);
- // TODO: Add any drawing code here...
- EndPaint(hWnd, &ps);
- break;
- case WM_DESTROY:
- running=false;
- PostQuitMessage(0);
- break;
- case WM_KEYUP:
- if ((wParam&0xff)==VK_ESCAPE) {
- DestroyWindow(hWnd);
- return 0;
- }
- return DefWindowProc(hWnd, message, wParam, lParam);
- case WM_CHAR:
- {
- char key=LOWORD(wParam);
- switch (key)
- {
- case ' ':
- shatter++;
- break;
- case '-':
- WW3D::Make_Screen_Shot("screen");
- break;
- case '+':
- WW3D::Toggle_Movie_Capture();
- break;
- case 'r':
- rotate=!rotate;
- break;
- case '1':
- WW3D::Set_NPatches_Level(1);
- break;
- case '2':
- WW3D::Set_NPatches_Level(2);
- break;
- case '3':
- WW3D::Set_NPatches_Level(3);
- break;
- case '4':
- WW3D::Set_NPatches_Level(4);
- break;
- case '5':
- WW3D::Set_NPatches_Level(5);
- break;
- case '6':
- WW3D::Set_NPatches_Level(6);
- break;
- case '7':
- WW3D::Set_NPatches_Level(7);
- break;
- case '8':
- WW3D::Set_NPatches_Level(8);
- break;
- case 'q':
- randmat=!randmat;
- break;
- case 'w':
- randtex=!randtex;
- break;
- case 's':
- staticsort=!staticsort;
- break;
- case 'b':
- {
- using_mat_pass=!using_mat_pass;
- if (!using_mat_pass) {
- my_scene->Set_Material_Pass(0);
- }
- else {
- my_scene->Set_Material_Pass(my_material_pass);
- }
- }
- break;
- case 'g':
- {
- if (WW3D::Get_NPatches_Gap_Filling_Mode()==WW3D::NPATCHES_GAP_FILLING_DISABLED) {
- WW3D::Set_NPatches_Gap_Filling_Mode(WW3D::NPATCHES_GAP_FILLING_ENABLED);
- }
- else {
- WW3D::Set_NPatches_Gap_Filling_Mode(WW3D::NPATCHES_GAP_FILLING_DISABLED);
- }
- }
- break;
- case 'm':
- {
- SceneClass::PolyRenderType type = my_scene->Get_Polygon_Mode();
- type = (type == SceneClass::POINT) ? SceneClass::LINE : ((type == SceneClass::LINE) ? SceneClass::FILL : SceneClass::POINT);
- my_scene->Set_Polygon_Mode(type);
- }
- break;
- }
- }
- default:
- return DefWindowProc(hWnd, message, wParam, lParam);
- }
- return 0;
- }
- // Mesage handler for about box.
- LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
- {
- switch (message)
- {
- case WM_INITDIALOG:
- return TRUE;
- case WM_COMMAND:
- if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
- {
- EndDialog(hDlg, LOWORD(wParam));
- return TRUE;
- }
- break;
- }
- return FALSE;
- }
- void Enable_Alternate_Materials(RenderObjClass * model,bool onoff)
- {
- if (model == NULL) return;
- for (int i=0; i<model->Get_Num_Sub_Objects(); i++) {
- RenderObjClass * subobj = model->Get_Sub_Object(i);
- Enable_Alternate_Materials(subobj,onoff);
- REF_PTR_RELEASE(subobj);
- }
- if (model->Class_ID() == RenderObjClass::CLASSID_MESH) {
- MeshModelClass * mesh_model = ((MeshClass *)model)->Get_Model();
- mesh_model->Enable_Alternate_Material_Description(onoff);
- REF_PTR_RELEASE(mesh_model);
- }
- }
- // ----------------------------------------------------------------------------
- //
- // WWDebug message callback defines the behavior of WWDEBUG_SAY().
- //
- // ----------------------------------------------------------------------------
- void WWDebug_Message_Callback(DebugType type, const char * message)
- {
- OutputDebugString(message);
- }
- // ----------------------------------------------------------------------------
- //
- // WWAssert callback defines the behavior of WWASSERT().
- //
- // ----------------------------------------------------------------------------
- void WWAssert_Callback(const char * message)
- {
- OutputDebugString(message);
- _asm int 0x03
- }
- // ----------------------------------------------------------------------------
- RenderObjClass * Create_Dynamesh(void)
- {
- // Create a tetrahedron
- DynamicMeshClass *dynamesh = NEW_REF(DynamicMeshClass, (4, 6));
- dynamesh->Set_Shader(ShaderClass::_PresetOpaqueShader);
- VertexMaterialClass *vm = VertexMaterialClass::Get_Preset(VertexMaterialClass::PRELIT_NODIFFUSE);
- dynamesh->Set_Vertex_Material(vm);
- vm->Release_Ref();
- TextureClass *texture = AssetManager->Get_Texture("chickonmap.tga");
- dynamesh->Set_Texture(texture);
- texture->Release_Ref();
- dynamesh->Vertex(0.0f, 100.0f, 0.0f, 1.0f, 0.0f);
- dynamesh->Vertex(100.0f, -100.0f, 0.0f ,1.0f, -1.0f);
- dynamesh->Vertex(-100.0f, -100.0f, 0.0f, -1.0f, -1.0f);
- dynamesh->Vertex(0.0f, -100.0f, -100.0f, 0.0f, 0.0f);
- dynamesh->Vertex(0.0f, 100.0f, 0.0f, 1.0f, 0.0f);
- dynamesh->Vertex(100.0f, -100.0f, 0.0f ,1.0f, -1.0f);
- return dynamesh;
- }
- RenderObjClass *Create_segline(void)
- {
- SegmentedLineClass *segline = NEW_REF(SegmentedLineClass,());
-
- Vector3 locations[4];
- locations[0].Set(0,0,0);
- locations[1].Set(50,50,50);
- locations[2].Set(50,-50,10);
- locations[3].Set(-50,50,10);
- segline->Set_Points(4, locations);
- //segline->Set_Shader(ShaderClass::_PresetOpaqueShader);
- segline->Set_Shader(ShaderClass::_PresetAlphaShader);
- segline->Set_Color(Vector3(1,0,1));
- segline->Set_Opacity(0.5);
- segline->Set_Freeze_Random(1);
- segline->Set_Visible(1);
- segline->Set_Width(10);
- TextureClass *tex=NEW_REF(TextureClass,("cloudlayer.tga"));
- segline->Set_Texture(tex);
- REF_PTR_RELEASE(tex);
- // segline->Set_Texture_Mapping_Mode(SegmentedLineClass::TILED_TEXTURE_MAP);
- segline->Set_Texture_Tile_Factor(5);
- segline->Set_Noise_Amplitude(5);
- segline->Set_Merge_Intersections(1);
- return segline;
- }
- // ----------------------------------------------------------------------------
- RenderObjClass * Create_Sphere(void)
- {
- SphereRenderObjClass *sph=NEW_REF(SphereRenderObjClass,());
- sph->Set_Color(Vector3(1,0,1));
- sph->Set_Scale(Vector3(100,100,100));
- return sph;
- }
- // ----------------------------------------------------------------------------
- RenderObjClass * Create_bitmap2d(void)
- {
- Bitmap2DObjClass *bmp=NEW_REF(Bitmap2DObjClass,("chickonmap.tga",0.0,0.0,false,false,false));
- return bmp;
- }
- // ----------------------------------------------------------------------------
- RenderObjClass * Create_Ring(void)
- {
- RingRenderObjClass *rng=NEW_REF(RingRenderObjClass,());
- rng->Set_Color(Vector3(1,0,1));
- rng->Set_Inner_Scale(Vector2(10,10));
- rng->Set_Outer_Scale(Vector2(50,50));
- return rng;
- }
- // ----------------------------------------------------------------------------
- void Create_Decal(RenderObjClass * robj,Matrix3D & tm,float radius,char * texture_name)
- {
- /*
- ** Allocate the decal generator
- */
- DecalGeneratorClass * gen = TheDecalSystem.Lock_Decal_Generator();
- WWASSERT(gen != NULL);
- /*
- ** Set up the transform, projection, and bounding volume parameters
- */
- const float DECAL_HALF_SLAB_THICKNESS = 50.0f;
- const float DECAL_BACKFACE_THRESHHOLD = 0.0f;
- float backup_dist = DECAL_HALF_SLAB_THICKNESS + 0.01f;
- Matrix3D transform = tm;
- transform.Translate_Z(backup_dist);
- gen->Set_Transform(transform);
- gen->Set_Ortho_Projection(-radius,radius,-radius,radius,0.01f,backup_dist + 2.0f * DECAL_HALF_SLAB_THICKNESS);
- gen->Set_Backface_Threshhold(DECAL_BACKFACE_THRESHHOLD);
- /*
- ** Set up the material settings. Just plug in the standard alpha shader and the
- ** vertex material which all decals use. Then grab the texture which the user
- ** specified...
- */
- MaterialPassClass * material = gen->Get_Material();
- VertexMaterialClass * decal_mtl = NEW_REF(VertexMaterialClass,());
- decal_mtl->Set_Ambient(0,0,0);
- decal_mtl->Set_Diffuse(0,0,0);
- decal_mtl->Set_Specular(0,0,0);
- decal_mtl->Set_Emissive(1,1,1);
- decal_mtl->Set_Opacity(1.0f);
- decal_mtl->Set_Shininess(0.0f);
- TextureClass * tex = WW3DAssetManager::Get_Instance()->Get_Texture(texture_name);
- tex->Set_U_Addr_Mode(TextureClass::TEXTURE_ADDRESS_CLAMP);
- tex->Set_V_Addr_Mode(TextureClass::TEXTURE_ADDRESS_CLAMP);
- material->Set_Shader(ShaderClass::_PresetAlphaShader);
- material->Set_Material(decal_mtl);
- material->Set_Texture(tex);
- REF_PTR_RELEASE(decal_mtl);
- REF_PTR_RELEASE(tex);
- REF_PTR_RELEASE(material);
- /*
- ** Apply!
- */
- robj->Create_Decal(gen);
- TheDecalSystem.Unlock_Decal_Generator(gen);
- }
- // ----------------------------------------------------------------------------
- MaterialPassClass * Create_Material_Pass(void)
- {
- TextureClass * texture = WW3DAssetManager::Get_Instance()->Get_Texture("decal.tga");
- VertexMaterialClass * mtl = NEW_REF(VertexMaterialClass,());
- mtl->Set_Diffuse(0.5f,0.5f,0.5f);
- mtl->Set_Specular(0,0,0);
- mtl->Set_Ambient(0,0,0);
- mtl->Set_Emissive(0.5f,0.5f,0.5f);
- mtl->Set_Lighting(false);
- EnvironmentMapperClass * mapper = NEW_REF(EnvironmentMapperClass,(0));
- mtl->Set_Mapper(mapper,0);
- MaterialPassClass * test_pass = NEW_REF(MaterialPassClass,());
- test_pass->Set_Shader(ShaderClass::_PresetAdditiveShader);
- test_pass->Set_Material(mtl);
- test_pass->Set_Texture(texture);
- REF_PTR_RELEASE(mtl);
- REF_PTR_RELEASE(texture);
- REF_PTR_RELEASE(mapper);
- return test_pass;
- }
- // ----------------------------------------------------------------------------
- TexProjectClass * Create_Texture_Projector(void)
- {
- const float SIZE = 10.0f;
- const float ZNEAR = 0.1f;
- const float ZFAR = 300.0f;
- TexProjectClass * new_projector = NEW_REF(TexProjectClass,());
- new_projector->Init_Additive();
- new_projector->Set_Intensity(1.0,true);
- new_projector->Set_Ortho_Projection(-SIZE,SIZE,-SIZE,SIZE,ZNEAR,ZFAR);
-
- Matrix3D tm;
- tm.Look_At(Vector3(200,200,200),Vector3(0,0,0),0.0f);
- new_projector->Set_Transform(tm);
- TextureClass * texture = WW3DAssetManager::Get_Instance()->Get_Texture("GreenSpot.tga");
- new_projector->Set_Texture(texture);
- REF_PTR_RELEASE(texture);
- return new_projector;
- }
- // ----------------------------------------------------------------------------
- void Debug_Refs(void)
- {
- #ifdef _DEBUG
- WWDEBUG_SAY(("Dumping Un-Released Ref-Counted objects...\r\n"));
- RefCountNodeClass * first = RefCountClass::ActiveRefList.First();
- RefCountNodeClass * node = first;
- while (node->Is_Valid())
- {
- RefCountClass * obj = node->Get();
- ActiveRefStruct * ref = &(obj->ActiveRefInfo);
- bool display = true;
- int count = 0;
- RefCountNodeClass * search = first;
- while (search->Is_Valid()) {
- if (search == node) { // if this is not the first one
- if (count != 0) {
- display = false;
- break;
- }
- }
- RefCountClass * search_obj = search->Get();
- ActiveRefStruct * search_ref = &(search_obj->ActiveRefInfo);
- if ( ref->File && search_ref->File &&
- !strcmp(search_ref->File, ref->File) &&
- (search_ref->Line == ref->Line) ) {
- count++;
- } else if ( (ref->File == NULL) && (search_ref->File == NULL) ) {
- count++;
- }
- search = search->Next();
- }
- if ( display ) {
- WWDEBUG_SAY(( "%d Active Ref: %s %d %p\n", count, ref->File,ref->Line,obj));
- static int num_printed = 0;
- if (++num_printed > 20) {
- WWDEBUG_SAY(( "And Many More......\n"));
- break;
- }
- }
- node = node->Next();
- }
- WWDEBUG_SAY(("Done.\r\n"));
- #endif
- }
- // ----------------------------------------------------------------------
- //
- // Ugly statistics block!!!
- //
- // ----------------------------------------------------------------------
- void Log_Statistics()
- {
- StringClass format(255,true);
- StringClass status_text(500,true);
- // static unsigned last_frame_time=0;
- // unsigned frame_time=timeGetTime();
- // unsigned time=frame_time-last_frame_time;
- // last_frame_time=frame_time;
- // if (time>1000) time=1000;
- // float fps=1000.0f/float(time);
- // static float time_fps;
- // static float current_fps;
- // static unsigned fps_count;
- // time_fps+=fps;
- // fps_count++;
- // if (fps_count==20) {
- // fps_count=0;
- // current_fps=time_fps/20.0f;
- // time_fps=0.0f;
- // }
- unsigned current_fps=fps_counter.Get_FPS();
- static unsigned stats_mode;
- static bool tab_pressed;
- if (GetAsyncKeyState(VK_TAB)) {
- if (!tab_pressed) {
- stats_mode++;
- stats_mode%=3;
- }
- tab_pressed=true;
- }
- else {
- tab_pressed=false;
- }
- switch (stats_mode) {
- case 0:
- Debug_Statistics::Record_Texture_Mode(Debug_Statistics::RECORD_TEXTURE_NONE);
- break;
- case 1:
- Debug_Statistics::Record_Texture_Mode(Debug_Statistics::RECORD_TEXTURE_NONE);
- format.Format("%d FPS\n",current_fps);
- status_text+=format;
- format.Format("%d Polys/frame (%dk pps)\n",Debug_Statistics::Get_DX8_Polygons(),unsigned(Debug_Statistics::Get_DX8_Polygons()*float(current_fps))/1000);
- status_text+=format;
- break;
- case 2:
- Debug_Statistics::Record_Texture_Mode(Debug_Statistics::RECORD_TEXTURE_NONE);
- format.Format("%d FPS\n",current_fps);
- status_text+=format;
- format.Format("%d Polys/frame (%dk pps)\n",Debug_Statistics::Get_DX8_Polygons(),unsigned(Debug_Statistics::Get_DX8_Polygons()*float(current_fps))/1000);
- status_text+=format;
- format.Format("%d Verts/frame (%dk vps)\n",Debug_Statistics::Get_DX8_Vertices(),unsigned(Debug_Statistics::Get_DX8_Vertices()*float(current_fps))/1000);
- status_text+=format;
- format.Format("%d DX8 calls\n",DX8Wrapper::Get_Last_Frame_DX8_Calls());
- status_text+=format;
- format.Format("%d VB changes\n",DX8Wrapper::Get_Last_Frame_Vertex_Buffer_Changes());
- status_text+=format;
- format.Format("%d IB changes\n",DX8Wrapper::Get_Last_Frame_Index_Buffer_Changes());
- status_text+=format;
- format.Format("%d texture changes\n",DX8Wrapper::Get_Last_Frame_Texture_Changes());
- status_text+=format;
- format.Format("%d material changes\n",DX8Wrapper::Get_Last_Frame_Material_Changes());
- status_text+=format;
- format.Format("%d light changes\n",DX8Wrapper::Get_Last_Frame_Light_Changes());
- status_text+=format;
- format.Format("%d RS changes\n",DX8Wrapper::Get_Last_Frame_Render_State_Changes());
- status_text+=format;
- format.Format("%d TSS changes\n",DX8Wrapper::Get_Last_Frame_Texture_Stage_State_Changes());
- status_text+=format;
- format.Format("%d Mtx changes\n",DX8Wrapper::Get_Last_Frame_Matrix_Changes());
- status_text+=format;
- break;
- }
- mytext->Reset();
- mytext->Set_Location(Vector2(0.0,0.0));
- mytext->Draw_Text(status_text,0xffff0000);
- }
- // ----------------------------------------------------------------------------
- void Init_Assets()
- {
- TextureClass *tex=AssetManager->Get_Texture("PPVF0102.TGA");
- REF_PTR_RELEASE(tex);
- // Preload test assets. Note that not all of these will actually be used.
- /* AssetManager->Load_3D_Assets("GreenSphere.w3d"); // Tests regular meshes
- AssetManager->Load_3D_Assets("TexSphere.w3d"); // Tests texture mapping
- AssetManager->Load_3D_Assets("TexScrlSphere.w3d"); // Tests Linear Offset mapper
- AssetManager->Load_3D_Assets("SphereAnim.w3d"); // Tests hierarchical animation (if you install its anim)
- AssetManager->Load_3D_Assets("SkinTest.w3d"); // Tests skinning and environment mapping
- AssetManager->Load_3D_Assets("sorting_test.w3d"); // Tests skinning and environment mapping
- AssetManager->Load_3D_Assets("boxtest.w3d"); // Tests BoxRenderObjClass (turn on the box display mask)
- AssetManager->Load_3D_Assets("Test1.w3d"); // Test yellow particles
- AssetManager->Load_3D_Assets("Test2.w3d"); // Tests alpha particles
- AssetManager->Load_3D_Assets("MPassSphere.w3d"); // Tests more than 2 passes on a mesh
- AssetManager->Load_3D_Assets("MPassTeapot.w3d"); // Tests more that 2 passes
- AssetManager->Load_3D_Assets("DupSphere.w3d"); // Tests 3 passes which all share the same uv coords
- AssetManager->Load_3D_Assets("vcolortest.w3d"); // Tests vertex color
- AssetManager->Load_3D_Assets("valphatest.w3d"); // Tests vertex alpha
- AssetManager->Load_3D_Assets("LightmapTest0.w3d"); // Tests pre-lighting, 3 solves: vertex, multi-pass, multi-stage
- AssetManager->Load_3D_Assets("LightmapTest1.w3d"); // Tests pre-lighting with alternate solves! (not currently runtime switchable)
- AssetManager->Load_3D_Assets("CubeSkin.w3d"); // Tests a simple skin, also can be used to test decals on skin meshes
- AssetManager->Load_3D_Assets("ProjectorTest.w3d"); // This model contains a mesh and an animated "ProjectorBone" for testing texture projections
- AssetManager->Load_3D_Assets("PolyRateTest.w3d"); // This model has lots of polys!
- AssetManager->Load_3D_Assets("PPVF01A.w3d"); // Game asset
- AssetManager->Load_3D_Assets("SPHERE_TEST.w3d"); // Tests multitexturing
- AssetManager->Load_3D_Assets("SCREEN_ALIGN.w3d"); // Tests camera aligned meshes
- AssetManager->Load_3D_Assets("halfsphere.w3d"); // Tests two-sided flag, camera aligned, and camera oriented meshes
- AssetManager->Load_3D_Assets("tsi01a.w3d"); // Tests static sort level
- AssetManager->Load_3D_Assets("tsi08a.w3d"); // Tests static sort level
- */
- AssetManager->Load_3D_Assets("area1-LM.w3d");
- /*
- AssetManager->Load_3D_Assets("S_A_Human.W3D");
- AssetManager->Load_3D_Assets("c_nod_rsold_L0.W3D");
- AssetManager->Load_3D_Assets("h_a_a0a1.W3D");
- */
- }
-
- // ----------------------------------------------------------------------------
- //
- // Create a scene for 2D-display, such as text and rectangles.
- //
- // ----------------------------------------------------------------------------
- void Init_2D_Scene()
- {
- // Create a scene for the 2D stuff -----------------------------------------
- my_2d_scene=NEW_REF(SimpleSceneClass,());
- my_2d_scene->Set_Ambient_Light(Vector3(1,1,1));
- // Create fonts to be used for text rendering ------------------------------
- my_font_a = AssetManager->Get_Font3DInstance("font12x16.tga");
- my_font_b = AssetManager->Get_Font3DInstance("fontnew4.tga");
- mytext=new Render2DTextClass(my_font_b);
- mytext->Set_Coordinate_Range( Render2DClass::Get_Screen_Resolution() );
- // Scene needs camera to be rendered with ----------------------------------
- my_2d_camera = NEW_REF(CameraClass,());
- #ifdef DRAWBITMAP
- my_2d_camera->Set_Position(Vector3(0,0,1));
- my_2d_camera->Set_Clip_Planes(0.995,2);
- #else
- my_2d_camera->Set_Position(Vector3(0,0,320));
- my_2d_camera->Set_Clip_Planes(300,1000);
- #endif
- Vector2 min = Vector2(-1, -0.75f);
- Vector2 max = Vector2(+1, +0.75f);
- my_2d_camera->Set_View_Plane(min, max);
- }
- void Init_3D_Scene()
- {
- WW3D::Enable_Sorting(false);
- WW3D::Set_NPatches_Level(1);
- // build scene
- my_scene=NEW_REF(SkeletonSceneClass,());
- my_scene->Set_Ambient_Light(Vector3(0.5f,0.5f,0.5f));
- // set up a light
- my_lights[0]=my_lights[1]=my_lights[2]=NULL;
- my_lights[0]=NEW_REF(LightClass,(LightClass::DIRECTIONAL));
- my_lights[0]->Set_Ambient(Vector3(0.1f,0.1f,0.1f));
- my_lights[0]->Set_Diffuse(Vector3(1.0f,1.0f,1.0f));
- my_lights[0]->Set_Spot_Direction(Vector3(0,1,0));
- my_scene->Add_Render_Object(my_lights[0]);
- // Scene needs camera to be rendered with ----------------------------------
- my_camera=NEW_REF(CameraClass,());
- Matrix3D camtransform(1);
- camtransform.Look_At(CAMERA_POSITION,CAMERA_TARGET,0);
- my_camera->Set_Transform(camtransform);
- my_object = AssetManager->Create_Render_Obj(OBJECT_NAME);
- if (ANIM_NAME != NULL) {
- my_anim = AssetManager->Get_HAnim(ANIM_NAME);
- }
- if (my_object != NULL) {
-
- my_object->Set_Position(OBJECT_POSITION);
- #if 0
- Enable_Alternate_Materials(my_object,true);
- #endif
- // Decal System
- #if 0
- Matrix3D decal_tm;
- decal_tm.Look_At(Vector3(30,5,10),Vector3(0,0,10),DEG_TO_RADF(65.5f));
- Create_Decal(my_object,decal_tm,13.7f,"decal.tga");
- #endif
- // PredictiveLODOptimizerClass::Add_Object(my_object);
- my_object->Set_Position(Vector3(0,0,0));
- if (my_anim != NULL) {
- my_object->Set_Animation(my_anim,0,RenderObjClass::ANIM_MODE_LOOP);
- }
- my_scene->Add_Render_Object(my_object);
- if (my_object->Class_ID()==RenderObjClass::CLASSID_PARTICLEEMITTER) {
- ((ParticleEmitterClass*) my_object)->Start();
- }
- }
- // 3D line object ----------------------------------------------------------
- #if 0
- Line3DClass *line = NULL;
- line = NEW_REF(Line3DClass,(Vector3(0,0,0),Vector3(100,100,0), 10,1,1,1,1));
- my_scene->Add_Render_Object(line);
- REF_PTR_RELEASE(line); // Obejct can be freed after adding scene so that it gets killed when scene dies
- #endif
- // Create texture projector material pass ----------------------------------
- #if 0
- my_texture_projector = Create_Texture_Projector();
- my_scene->Set_Material_Pass(my_texture_projector->Peek_Material_Pass());
- // REF_PTR_RELEASE(my_texture_projector);
- #endif
- // Create material pass ----------------------------------------------------
- #if 0
- my_material_pass = Create_Material_Pass();
- my_scene->Set_Material_Pass(my_material_pass);
- REF_PTR_RELEASE(my_material_pass);
- #endif
- }
|