📄 matsyswin.cpp
字号:
glEnd ();
*/
}
void DrawBackground()
{
if (!g_viewerSettings.showBackground)
return;
float mTempModel[4][4];
float mTempView[4][4];
g_pMaterialSystem->Bind(g_materialBackground);
g_pMaterialSystem->MatrixMode(MATERIAL_MODEL);
g_pMaterialSystem->GetMatrix(MATERIAL_MODEL, (float*)mTempModel);
g_pMaterialSystem->LoadIdentity();
g_pMaterialSystem->MatrixMode(MATERIAL_VIEW);
g_pMaterialSystem->GetMatrix(MATERIAL_VIEW, (float*)mTempView);
g_pMaterialSystem->LoadIdentity();
{
IMesh* pMesh = g_pMaterialSystem->GetDynamicMesh();
CMeshBuilder meshBuilder;
meshBuilder.Begin( pMesh, MATERIAL_QUADS, 1 );
float dist=-15000.0f;
float tMin=0, tMax=1;
meshBuilder.Position3f(-dist, dist, dist);
meshBuilder.TexCoord2f( 0, tMin,tMax );
meshBuilder.Color4ub( 255, 255, 255, 255 );
meshBuilder.AdvanceVertex();
meshBuilder.Position3f( dist, dist, dist);
meshBuilder.TexCoord2f( 0, tMax,tMax );
meshBuilder.Color4ub( 255, 255, 255, 255 );
meshBuilder.AdvanceVertex();
meshBuilder.Position3f( dist,-dist, dist);
meshBuilder.TexCoord2f( 0, tMax,tMin );
meshBuilder.Color4ub( 255, 255, 255, 255 );
meshBuilder.AdvanceVertex();
meshBuilder.Position3f(-dist,-dist, dist);
meshBuilder.TexCoord2f( 0, tMin,tMin );
meshBuilder.Color4ub( 255, 255, 255, 255 );
meshBuilder.AdvanceVertex();
meshBuilder.End();
pMesh->Draw();
}
}
void DrawHelpers()
{
if (g_viewerSettings.mousedown)
{
g_pMaterialSystem->Bind( g_materialBones );
g_pMaterialSystem->MatrixMode(MATERIAL_MODEL);
g_pMaterialSystem->LoadIdentity();
g_pMaterialSystem->MatrixMode(MATERIAL_VIEW);
g_pMaterialSystem->LoadIdentity();
IMesh* pMesh = g_pMaterialSystem->GetDynamicMesh();
CMeshBuilder meshBuilder;
meshBuilder.Begin( pMesh, MATERIAL_LINES, 1 );
if (g_viewerSettings.rotating)
meshBuilder.Color3ub( 255, 255, 0 );
else
meshBuilder.Color3ub( 0, 255, 0 );
for (int i = 0; i < 360; i += 5)
{
float a = i * (3.151492653/180.0f);
if (g_viewerSettings.rotating)
meshBuilder.Color3ub( 255, 255, 0 );
else
meshBuilder.Color3ub( 0, 255, 0 );
meshBuilder.Position3f( sin( a ), cos( a ), -3.0f );
meshBuilder.AdvanceVertex();
}
meshBuilder.End();
pMesh->Draw();
}
}
void DrawGroundPlane()
{
if (!g_viewerSettings.showGround)
return;
float mTempModel[4][4];
float mTempView[4][4];
g_pMaterialSystem->Bind(g_materialFloor);
g_pMaterialSystem->MatrixMode(MATERIAL_MODEL);
g_pMaterialSystem->GetMatrix(MATERIAL_MODEL, (float*)mTempModel);
g_pMaterialSystem->LoadIdentity();
g_pMaterialSystem->MatrixMode(MATERIAL_VIEW);
g_pMaterialSystem->GetMatrix(MATERIAL_VIEW, (float*)mTempView);
g_pMaterialSystem->LoadIdentity();
g_pMaterialSystem->MatrixMode( MATERIAL_VIEW );
g_pMaterialSystem->LoadIdentity( );
g_pMaterialSystem->Rotate( -90, 1, 0, 0 ); // put Z going up
g_pMaterialSystem->Rotate( -90, 0, 0, 1 );
g_pMaterialSystem->Translate( -g_viewerSettings.trans[0], -g_viewerSettings.trans[1], -g_viewerSettings.trans[2] );
g_pMaterialSystem->Rotate( g_viewerSettings.rot[1], 0, 0, 1 );
g_pMaterialSystem->Rotate( g_viewerSettings.rot[0], 0, 1, 0 );
g_pMaterialSystem->Rotate( g_viewerSettings.rot[2], 1, 0, 0 );
static Vector tMap( 0, 0, 0 );
static Vector dxMap( 1, 0, 0 );
static Vector dyMap( 0, 1, 0 );
static float prevframe = 0.0f;
float currframe = g_pStudioModel->GetCycle( );
Vector deltaPos;
QAngle deltaAngles;
// assume that changes < -0.5 are loops....
if (currframe - prevframe < -0.5)
{
prevframe = prevframe - 1.0;
// assumes a max of one loop, in any case prevframe gets reset below
}
g_pStudioModel->GetMovement( prevframe, currframe, deltaPos, deltaAngles );
prevframe = currframe;
IMesh* pMesh = g_pMaterialSystem->GetDynamicMesh();
CMeshBuilder meshBuilder;
meshBuilder.Begin( pMesh, MATERIAL_QUADS, 1 );
float scale = 10.0;
float dist=-100.0f;
float dpdd = scale / dist;
tMap.x = tMap.x + dxMap.x * deltaPos.x * dpdd + dxMap.y * deltaPos.y * dpdd;
tMap.y = tMap.y + dyMap.x * deltaPos.x * dpdd + dyMap.y * deltaPos.y * dpdd;
while (tMap.x < 0.0) tMap.x += 1.0;
while (tMap.x > 1.0) tMap.x += -1.0;
while (tMap.y < 0.0) tMap.y += 1.0;
while (tMap.y > 1.0) tMap.y += -1.0;
VectorYawRotate( dxMap, -deltaAngles.y, dxMap );
VectorYawRotate( dyMap, -deltaAngles.y, dyMap );
// ARRGHHH, this is right but I don't know what I've done
meshBuilder.Position3f( -dist, dist, 0 );
meshBuilder.TexCoord2f( 0, tMap.x + (-dxMap.x - dyMap.x) * scale, tMap.y + (dxMap.y + dyMap.y) * scale );
meshBuilder.Color4ub( 128, 128, 128, 255 );
meshBuilder.AdvanceVertex();
meshBuilder.Position3f( dist, dist, 0 );
meshBuilder.TexCoord2f( 0, tMap.x + (dxMap.x - dyMap.x) * scale, tMap.y + (-dxMap.y + dyMap.y) * scale );
meshBuilder.Color4ub( 128, 128, 128, 255 );
meshBuilder.AdvanceVertex();
meshBuilder.Position3f( dist, -dist, 0 );
meshBuilder.TexCoord2f( 0, tMap.x + (dxMap.x + dyMap.x) * scale, tMap.y + (-dxMap.y - dyMap.y) * scale );
meshBuilder.Color4ub( 128, 128, 128, 255 );
meshBuilder.AdvanceVertex();
meshBuilder.Position3f( -dist, -dist, 0 );
meshBuilder.TexCoord2f( 0, tMap.x - (dxMap.x - dyMap.x) * scale, tMap.y - (-dxMap.y + dyMap.y) * scale );
meshBuilder.Color4ub( 128, 128, 128, 255 );
meshBuilder.AdvanceVertex();
meshBuilder.End();
pMesh->Draw();
g_pMaterialSystem->MatrixMode(MATERIAL_MODEL);
g_pMaterialSystem->LoadMatrix((float*)mTempModel);
g_pMaterialSystem->MatrixMode(MATERIAL_VIEW);
g_pMaterialSystem->LoadMatrix((float*)mTempView);
}
void DrawMovementBoxes()
{
if (!g_viewerSettings.showMovement)
return;
float mTempModel[4][4];
float mTempView[4][4];
g_pMaterialSystem->Bind(g_materialFloor);
g_pMaterialSystem->MatrixMode(MATERIAL_MODEL);
g_pMaterialSystem->GetMatrix(MATERIAL_MODEL, (float*)mTempModel);
g_pMaterialSystem->LoadIdentity();
g_pMaterialSystem->MatrixMode(MATERIAL_VIEW);
g_pMaterialSystem->GetMatrix(MATERIAL_VIEW, (float*)mTempView);
g_pMaterialSystem->LoadIdentity();
g_pMaterialSystem->MatrixMode( MATERIAL_VIEW );
g_pMaterialSystem->LoadIdentity( );
g_pMaterialSystem->Rotate( -90, 1, 0, 0 ); // put Z going up
g_pMaterialSystem->Rotate( -90, 0, 0, 1 );
g_pMaterialSystem->Translate( -g_viewerSettings.trans[0], -g_viewerSettings.trans[1], -g_viewerSettings.trans[2] );
g_pMaterialSystem->Rotate( g_viewerSettings.rot[1], 0, 0, 1 );
g_pMaterialSystem->Rotate( g_viewerSettings.rot[0], 0, 1, 0 );
g_pMaterialSystem->Rotate( g_viewerSettings.rot[2], 1, 0, 0 );
static matrix3x4_t mStart( 1, 0, 0, 0 , 0, 1, 0, 0 , 0, 0, 1, 0 );
matrix3x4_t mTemp;
static float prevframe = 0.0f;
float currframe = g_pStudioModel->GetCycle( );
Vector deltaPos;
QAngle deltaAngles;
// assume that changes < -0.5 are loops....
if (currframe - prevframe < -0.5)
{
prevframe = 0;
// assumes a max of one loop, in any case prevframe gets reset below
SetIdentityMatrix( mStart );
}
g_pStudioModel->GetMovement( prevframe, currframe, deltaPos, deltaAngles );
prevframe = currframe;
AngleMatrix( deltaAngles, deltaPos, mTemp );
MatrixInvert( mTemp, mTemp );
ConcatTransforms( mTemp, mStart, mStart );
Vector bboxMin, bboxMax;
g_pStudioModel->ExtractBbox( bboxMin, bboxMax );
// starting position
{
float color[] = { 0.7, 1, 0, 0.5 };
float wirecolor[] = { 1, 1, 0, 1.0 };
g_pStudioModel->drawTransparentBox( bboxMin, bboxMax, mStart, color, wirecolor );
}
// current position
{
float color[] = { 1, 0.7, 0, 0.5 };
float wirecolor[] = { 1, 0, 0, 1.0 };
SetIdentityMatrix( mTemp );
g_pStudioModel->drawTransparentBox( bboxMin, bboxMax, mTemp, color, wirecolor );
}
g_pMaterialSystem->MatrixMode(MATERIAL_MODEL);
g_pMaterialSystem->LoadMatrix((float*)mTempModel);
g_pMaterialSystem->MatrixMode(MATERIAL_VIEW);
g_pMaterialSystem->LoadMatrix((float*)mTempView);
}
void
MatSysWindow::draw ()
{
g_pMaterialSystem->BeginFrame();
g_pStudioModel->GetStudioRender()->BeginFrame();
g_pMaterialSystem->ClearColor3ub(g_viewerSettings.bgColor[0] * 255, g_viewerSettings.bgColor[1] * 255, g_viewerSettings.bgColor[2] * 255);
g_pMaterialSystem->ClearBuffers(true, true);
g_pMaterialSystem->Viewport( 0, 0, w(), h() );
g_pMaterialSystem->MatrixMode( MATERIAL_PROJECTION );
g_pMaterialSystem->LoadIdentity( );
g_pMaterialSystem->PerspectiveX(g_viewerSettings.fov, (float)w() / (float)h(), 1.0f, 20000.0f);
DrawBackground();
DrawGroundPlane();
DrawMovementBoxes();
DrawHelpers();
g_pMaterialSystem->MatrixMode( MATERIAL_VIEW );
g_pMaterialSystem->LoadIdentity( );
// FIXME: why is this needed? Doesn't SetView() override this?
g_pMaterialSystem->Rotate( -90, 1, 0, 0 ); // put Z going up
g_pMaterialSystem->Rotate( -90, 0, 0, 1 );
int polycount = g_pStudioModel->DrawModel ();
int lod;
float metric;
metric = g_pStudioModel->GetLodMetric();
lod = g_pStudioModel->GetLodUsed();
g_ControlPanel->setLOD( lod, true, false );
g_ControlPanel->setLODMetric( metric );
g_ControlPanel->setPolycount( polycount );
g_ControlPanel->updatePoseParameters( );
// g_vright[0] = g_vright[1] = g_viewerSettings.trans[2];
/*
if (g_viewerSettings.mirror)
{
glPushMatrix ();
glScalef (1, 1, -1);
glCullFace (GL_BACK);
setupRenderMode ();
g_pStudioModel->DrawModel ();
glPopMatrix ();
}
*/
/*
//
// draw ground
//
if (g_viewerSettings.showGround)
{
glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
glEnable (GL_DEPTH_TEST);
glEnable (GL_CULL_FACE);
if (g_viewerSettings.useStencil)
glFrontFace (GL_CW);
else
glDisable (GL_CULL_FACE);
glEnable (GL_BLEND);
if (!d_textureNames[1])
{
glDisable (GL_TEXTURE_2D);
glColor4f (g_viewerSettings.gColor[0], g_viewerSettings.gColor[1], g_viewerSettings.gColor[2], 0.7f);
glBindTexture (GL_TEXTURE_2D, 0);
}
else
{
glEnable (GL_TEXTURE_2D);
glColor4f (1.0f, 1.0f, 1.0f, 0.6f);
glBindTexture (GL_TEXTURE_2D, d_textureNames[1]);
}
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
drawFloor ();
glDisable (GL_BLEND);
if (g_viewerSettings.useStencil)
{
glCullFace (GL_BACK);
glColor4f (0.1f, 0.1f, 0.1f, 1.0f);
glBindTexture (GL_TEXTURE_2D, 0);
drawFloor ();
glFrontFace (GL_CCW);
}
else
glEnable (GL_CULL_FACE);
}
glPopMatrix ();
*/
g_pMaterialSystem->SwapBuffers();
g_pStudioModel->GetStudioRender()->EndFrame();
g_pMaterialSystem->EndFrame();
}
/*
int
MatSysWindow::loadTexture (const char *filename, int name)
{
if (!filename || !strlen (filename))
{
if (d_textureNames[name])
{
glDeleteTextures (1, (const GLuint *) &d_textureNames[name]);
d_textureNames[name] = 0;
if (name == 0)
strcpy (g_viewerSettings.backgroundTexFile, "");
else
strcpy (g_viewerSettings.groundTexFile, "");
}
return 0;
}
mxImage *image = 0;
char ext[16];
strcpy (ext, mx_getextension (filename));
if (!mx_strcasecmp (ext, ".tga"))
image = mxTgaRead (filename);
else if (!mx_strcasecmp (ext, ".pcx"))
image = mxPcxRead (filename);
else if (!mx_strcasecmp (ext, ".bmp"))
image = mxBmpRead (filename);
if (image)
{
if (name == 0)
strcpy (g_viewerSettings.backgroundTexFile, filename);
else
strcpy (g_viewerSettings.groundTexFile, filename);
d_textureNames[name] = name + 1;
if (image->bpp == 8)
{
mstudiotexture_t texture;
texture.width = image->width;
texture.height = image->height;
g_pStudioModel->UploadTexture (&texture, (byte *) image->data, (byte *) image->palette, name + 1);
}
else
{
glBindTexture (GL_TEXTURE_2D, d_textureNames[name]);
glTexImage2D (GL_TEXTURE_2D, 0, 3, image->width, image->height, 0, GL_RGB, GL_UNSIGNED_BYTE, image->data);
glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
}
delete image;
return name + 1;
}
return 0;
}
*/
void
MatSysWindow::dumpViewport (const char *filename)
{
redraw ();
int w = w2 ();
int h = h2 ();
mxImage *image = new mxImage ();
if (image->create (w, h, 24))
{
#if 0
glReadBuffer (GL_FRONT);
glReadPixels (0, 0, w, h, GL_RGB, GL_UNSIGNED_BYTE, image->data);
#else
HDC hdc = GetDC ((HWND) getHandle ());
byte *data = (byte *) image->data;
int i = 0;
for (int y = 0; y < h; y++)
{
for (int x = 0; x < w; x++)
{
COLORREF cref = GetPixel (hdc, x, y);
data[i++] = (byte) ((cref >> 0)& 0xff);
data[i++] = (byte) ((cref >> 8) & 0xff);
data[i++] = (byte) ((cref >> 16) & 0xff);
}
}
ReleaseDC ((HWND) getHandle (), hdc);
#endif
if (!mxTgaWrite (filename, image))
mxMessageBox (this, "Error writing screenshot.", g_appTitle, MX_MB_OK | MX_MB_ERROR);
delete image;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -