📄 matsyswin.cpp
字号:
/*
glapp.c - Simple OpenGL shell
There are several options allowed on the command line. They are:
-height : what window/screen height do you want to use?
-width : what window/screen width do you want to use?
-bpp : what color depth do you want to use?
-window : create a rendering window rather than full-screen
-fov : use a field of view other than 90 degrees
*/
//
// Half-Life Model Viewer (c) 1999 by Mete Ciragan
//
// file: MatSysWindow.cpp
// last modified: May 04 1999, Mete Ciragan
// copyright: The programs and associated files contained in this
// distribution were developed by Mete Ciragan. The programs
// are not in the public domain, but they are freely
// distributable without licensing fees. These programs are
// provided without guarantee or warrantee expressed or
// implied.
//
// version: 1.2
//
// email: mete@swissquake.ch
// web: http://www.swissquake.ch/chumbalum-soft/
//
#include <mx/mx.h>
#include <mx/mxMessageBox.h>
#include <mx/mxTga.h>
#include <mx/mxPcx.h>
#include <mx/mxBmp.h>
#include <mx/mxMatSysWindow.h>
// #include "gl.h"
// #include <GL/glu.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include "Vector.h"
#include "MatSysWin.h"
#include "ViewerSettings.h"
#include "cmdlib.h"
#include "imaterialsystem.h"
#include "imaterialproxyfactory.h"
#include "FileSystem.h"
#include "FileSystem_Tools.h"
#include "IMesh.h"
#include "MaterialSystem_Config.h"
extern char g_appTitle[];
// FIXME: move all this to mxMatSysWin
class DummyMaterialProxyFactory : public IMaterialProxyFactory
{
public:
virtual IMaterialProxy *CreateProxy( const char *proxyName ) {return NULL;}
virtual void DeleteProxy( IMaterialProxy *pProxy ) {}
};
DummyMaterialProxyFactory g_DummyMaterialProxyFactory;
bool Sys_Error(const char *pMsg, ...)
{
va_list marker;
char msg[4096];
va_start(marker, pMsg);
vsprintf(msg, pMsg, marker);
va_end(marker);
MessageBox(NULL, msg, "FATAL ERROR", MB_OK);
// g_MaterialSystemApp.Term();
exit(1);
return false;
}
static void MaterialSystem_Error( char *fmt, ... )
{
char str[4096];
va_list marker;
va_start(marker, fmt);
vsprintf(str, fmt, marker);
va_end(marker);
Sys_Error(str);
}
static void MaterialSystem_Warning( char *fmt, ... )
{
}
void InitMaterialSystemConfig(MaterialSystem_Config_t *pConfig, const char *matPath)
{
pConfig->screenGamma = 2.2f;
pConfig->texGamma = 2.2;
pConfig->overbright = 2;
pConfig->bAllowCheats = false;
pConfig->bLinearFrameBuffer = false;
pConfig->polyOffset = 4;
pConfig->skipMipLevels = 0;
pConfig->lightScale = 1.0f;
pConfig->bFilterLightmaps = true;
pConfig->bFilterTextures = true;
pConfig->bMipMapTextures = true;
pConfig->bShowMipLevels = false;
pConfig->bReverseDepth = false;
pConfig->bCompressedTextures = false;
pConfig->bBumpmap = true;
pConfig->bShowSpecular = true;
pConfig->bShowDiffuse = true;
pConfig->maxFrameLatency = 1;
pConfig->bDrawFlat = false;
pConfig->bLightingOnly = false;
pConfig->errorFunc = MaterialSystem_Error;
pConfig->warningFunc = MaterialSystem_Warning;
pConfig->bUseGraphics = true;
pConfig->bEditMode = false; // No, we're not in WorldCraft.
}
MatSysWindow *g_MatSysWindow = 0;
IMaterialSystem *g_pMaterialSystem;
Vector g_vright( 50, 50, 0 ); // needs to be set to viewer's right in order for chrome to work
IMaterial *g_materialBackground = NULL;
IMaterial *g_materialWireframe = NULL;
IMaterial *g_materialFlatshaded = NULL;
IMaterial *g_materialSmoothshaded = NULL;
IMaterial *g_materialBones = NULL;
IMaterial *g_materialFloor = NULL;
MatSysWindow::MatSysWindow (mxWindow *parent, int x, int y, int w, int h, const char *label, int style)
: mxMatSysWindow (parent, x, y, w, h, label, style)
{
m_hWnd = (HWND)getHandle();
const char *pPath = NULL; // FindParameterArg("-game");
if(!pPath)
{
// If they didn't specify -game on the command line, use VPROJECT.
SetQdirFromPath(".");
pPath = basegamedir;
}
// Load the material system DLL and get its interface.
m_hMaterialSystemInst = LoadLibrary( "MaterialSystem.dll" );
if( !m_hMaterialSystemInst )
{
return; // Sys_Error( "Can't load MaterialSystem.dll\n" );
}
CreateInterfaceFn clientFactory = Sys_GetFactory( "MaterialSystem.dll" );
if ( clientFactory )
{
g_pMaterialSystem = (IMaterialSystem *)clientFactory( MATERIAL_SYSTEM_INTERFACE_VERSION, NULL );
if ( !g_pMaterialSystem )
{
return; // Sys_Error( "Could not get the material system interface from materialsystem.dll" );
}
}
else
{
return; // Sys_Error( "Could not find factory interface in library MaterialSystem.dll" );
}
// Figure out the material path.
char szMaterialPath[1024];
sprintf(szMaterialPath, "%s/materials", pPath);
char *pShaderDLL = NULL; // FindParameterArg("-shaderdll");
if(!pShaderDLL)
pShaderDLL = "shaderapidx9.dll";
FileSystem_Init();
if(!g_pMaterialSystem->Init(pShaderDLL, &g_DummyMaterialProxyFactory,FileSystem_GetFactory()))
return; // Sys_Error("IMaterialSystem::Init failed");
MaterialVideoMode_t mode;
mode.m_Width = mode.m_Height = 0;
if (!g_pMaterialSystem->SetMode((void*)m_hWnd, 0, mode,
MATERIAL_VIDEO_MODE_WINDOWED | MATERIAL_VIDEO_MODE_RESIZING))
return; // Sys_Error("IMaterialSystem::Init failed");
MaterialSystem_Config_t config;
memset( &config, 0, sizeof( config ) );
InitMaterialSystemConfig(&config, szMaterialPath);
if(!g_pMaterialSystem->ConfigInit(&config))
return; // Sys_Error("IMaterialSystem::ConfigInit failed. Make sure VPROJECT is set or use -game on the command line.");
g_materialBackground = g_pMaterialSystem->FindMaterial("particle/particleapp_background", NULL, false);
g_materialWireframe = g_pMaterialSystem->FindMaterial("debug/debugmrmwireframe", NULL, false);
g_materialFlatshaded = g_pMaterialSystem->FindMaterial("debug/drawflattriangles", NULL, false);
g_materialSmoothshaded = g_pMaterialSystem->FindMaterial("debug/debugmrmfullbright2", NULL, false);
g_materialBones = g_pMaterialSystem->FindMaterial("debug/debugmrmwireframe", NULL, false);
g_materialFloor = g_pMaterialSystem->FindMaterial("debug/debugmrmwireframe", NULL, false);
if (!parent)
setVisible (true);
else
mx::setIdleWindow (this);
}
MatSysWindow::~MatSysWindow ()
{
mx::setIdleWindow (0);
}
int
MatSysWindow::handleEvent (mxEvent *event)
{
static float oldrx = 0, oldry = 0, oldtz = 50, oldtx = 0, oldty = 0;
static float oldlrx = 0, oldlry = 0;
static int oldx, oldy;
switch (event->event)
{
case mxEvent::Idle:
{
static double prev;
double curr = (double) mx::getTickCount () / 1000.0;
// g_studioModel.AdvanceFrame ( (curr - prev) * g_viewerSettings.speedScale );
prev = curr;
redraw ();
return 1;
}
break;
case mxEvent::MouseDown:
{
oldrx = g_viewerSettings.rot[0];
oldry = g_viewerSettings.rot[1];
oldtx = g_viewerSettings.trans[0];
oldty = g_viewerSettings.trans[1];
oldtz = g_viewerSettings.trans[2];
oldx = event->x;
oldy = event->y;
return 1;
}
break;
case mxEvent::MouseDrag:
{
if (event->buttons & mxEvent::MouseLeftButton)
{
if (event->modifiers & mxEvent::KeyShift)
{
g_viewerSettings.trans[0] = oldtx - (float) (event->x - oldx);
g_viewerSettings.trans[1] = oldty + (float) (event->y - oldy);
}
else
{
g_viewerSettings.rot[0] = oldrx + (float) (event->y - oldy);
g_viewerSettings.rot[1] = oldry + (float) (event->x - oldx);
}
}
else if (event->buttons & mxEvent::MouseRightButton)
{
g_viewerSettings.trans[2] = oldtz + (float) (event->y - oldy);
}
redraw ();
return 1;
}
break;
case mxEvent::KeyDown:
{
switch (event->key)
{
case 116: // F5
{
// g_MDLViewer->Refresh();
break;
}
case 27:
if (!getParent ()) // fullscreen mode ?
mx::quit ();
break;
}
}
break;
} // switch (event->event)
return 1;
}
void
drawFloor ()
{
/*
if (g_viewerSettings.use3dfx)
{
glBegin (GL_TRIANGLE_STRIP);
glTexCoord2f (1.0f, 0.0f);
glVertex3f (100.0f, 100.0f, 0.0f);
glTexCoord2f (1.0f, 1.0f);
glVertex3f (100.0f, -100.0f, 0.0f);
glTexCoord2f (0.0f, 0.0f);
glVertex3f (-100.0f, 100.0f, 0.0f);
glTexCoord2f (0.0f, 1.0f);
glVertex3f (-100.0f, -100.0f, 0.0f);
glEnd ();
}
else
{
glBegin (GL_TRIANGLE_STRIP);
glTexCoord2f (0.0f, 0.0f);
glVertex3f (-100.0f, 100.0f, 0.0f);
glTexCoord2f (0.0f, 1.0f);
glVertex3f (-100.0f, -100.0f, 0.0f);
glTexCoord2f (1.0f, 0.0f);
glVertex3f (100.0f, 100.0f, 0.0f);
glTexCoord2f (1.0f, 1.0f);
glVertex3f (100.0f, -100.0f, 0.0f);
glEnd ();
}
*/
}
void
setupRenderMode ()
{
/*
if (g_viewerSettings.renderMode == RM_WIREFRAME)
{
glPolygonMode (GL_FRONT_AND_BACK, GL_LINE);
glDisable (GL_TEXTURE_2D);
glDisable (GL_CULL_FACE);
glEnable (GL_DEPTH_TEST);
}
else if (g_viewerSettings.renderMode == RM_FLATSHADED ||
g_viewerSettings.renderMode == RM_SMOOTHSHADED)
{
glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
glDisable (GL_TEXTURE_2D);
glEnable (GL_CULL_FACE);
glEnable (GL_DEPTH_TEST);
if (g_viewerSettings.renderMode == RM_FLATSHADED)
glShadeModel (GL_FLAT);
else
glShadeModel (GL_SMOOTH);
}
else if (g_viewerSettings.renderMode == RM_TEXTURED)
{
glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
glEnable (GL_TEXTURE_2D);
glEnable (GL_CULL_FACE);
glEnable (GL_DEPTH_TEST);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -