📄 r_d3d_2009.cpp
字号:
// Emacs style mode select -*- C++ -*-
//-----------------------------------------------------------------------------
//
// $Id: R_d3d_2009.cpp,v 1.1 2000/10/01 15:14:32 hurdler Exp $
//
// Copyright (C) 1998-2000 by DooM Legacy Team.
//
// 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 2
// 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.
//
//
// $Log: R_d3d_2009.cpp,v $
// Revision 1.1 2000/10/01 15:14:32 hurdler
// Completely rewritten d3d driver... absolutely not finished at all
//
//
//
// DESCRIPTION:
// DirectX 7 (and higher) API for Doom Legacy
//
//-----------------------------------------------------------------------------
#include <windows.h>
#include <time.h>
#include <stdarg.h>
#include <math.h>
#define D3D_OVERLOADS
#include <d3dx.h>
#include "r_d3d.h"
#pragma warning (disable : 4244)
// ==========================================================================
// CONSTANTS
// ==========================================================================
#define NOTEXTURE_NUM 1 // small white texture
#define FIRST_TEX_AVAIL (NOTEXTURE_NUM + 1)
#define N_PI_DEMI (1.5707963268f) // PI/2
#define ASPECT_RATIO (1.0f) //(320.0f/200.0f)
#define FAR_CLIPPING_PLANE 6000.0f
float NEAR_CLIPPING_PLANE = 0.9f;
#define MIPMAP_MASK 0x0100
// **************************************************************************
// GLOBALS
// **************************************************************************
LPDIRECT3DDEVICE7 pD3DDev = NULL;
LPDIRECTDRAW7 pDD = NULL;
ID3DXContext* pD3DX = NULL;
unsigned int NextTexAvail = FIRST_TEX_AVAIL;
unsigned int tex_downloaded = 0;
float fov = 90.0;
unsigned int pal_col = 0;
FRGBAFloat const_pal_col;
FBITFIELD CurrentPolyFlags;
FTextureInfo* gr_cachetail = NULL;
FTextureInfo* gr_cachehead = NULL;
RGBA_t myPaletteData[256];
int screen_width; // used by Draw2DLine()
int screen_height;
char screen_depth;
//TODO: use d3d LINEAR constant
#define LINEAR 1
int min_filter = LINEAR;
int mag_filter = LINEAR;
static double modelMatrix[16];
static double projMatrix[16];
static int viewport[4];
static const float int2float[256] = {
0.000000f, 0.003922f, 0.007843f, 0.011765f, 0.015686f, 0.019608f, 0.023529f, 0.027451f,
0.031373f, 0.035294f, 0.039216f, 0.043137f, 0.047059f, 0.050980f, 0.054902f, 0.058824f,
0.062745f, 0.066667f, 0.070588f, 0.074510f, 0.078431f, 0.082353f, 0.086275f, 0.090196f,
0.094118f, 0.098039f, 0.101961f, 0.105882f, 0.109804f, 0.113725f, 0.117647f, 0.121569f,
0.125490f, 0.129412f, 0.133333f, 0.137255f, 0.141176f, 0.145098f, 0.149020f, 0.152941f,
0.156863f, 0.160784f, 0.164706f, 0.168627f, 0.172549f, 0.176471f, 0.180392f, 0.184314f,
0.188235f, 0.192157f, 0.196078f, 0.200000f, 0.203922f, 0.207843f, 0.211765f, 0.215686f,
0.219608f, 0.223529f, 0.227451f, 0.231373f, 0.235294f, 0.239216f, 0.243137f, 0.247059f,
0.250980f, 0.254902f, 0.258824f, 0.262745f, 0.266667f, 0.270588f, 0.274510f, 0.278431f,
0.282353f, 0.286275f, 0.290196f, 0.294118f, 0.298039f, 0.301961f, 0.305882f, 0.309804f,
0.313726f, 0.317647f, 0.321569f, 0.325490f, 0.329412f, 0.333333f, 0.337255f, 0.341176f,
0.345098f, 0.349020f, 0.352941f, 0.356863f, 0.360784f, 0.364706f, 0.368627f, 0.372549f,
0.376471f, 0.380392f, 0.384314f, 0.388235f, 0.392157f, 0.396078f, 0.400000f, 0.403922f,
0.407843f, 0.411765f, 0.415686f, 0.419608f, 0.423529f, 0.427451f, 0.431373f, 0.435294f,
0.439216f, 0.443137f, 0.447059f, 0.450980f, 0.454902f, 0.458824f, 0.462745f, 0.466667f,
0.470588f, 0.474510f, 0.478431f, 0.482353f, 0.486275f, 0.490196f, 0.494118f, 0.498039f,
0.501961f, 0.505882f, 0.509804f, 0.513726f, 0.517647f, 0.521569f, 0.525490f, 0.529412f,
0.533333f, 0.537255f, 0.541177f, 0.545098f, 0.549020f, 0.552941f, 0.556863f, 0.560784f,
0.564706f, 0.568627f, 0.572549f, 0.576471f, 0.580392f, 0.584314f, 0.588235f, 0.592157f,
0.596078f, 0.600000f, 0.603922f, 0.607843f, 0.611765f, 0.615686f, 0.619608f, 0.623529f,
0.627451f, 0.631373f, 0.635294f, 0.639216f, 0.643137f, 0.647059f, 0.650980f, 0.654902f,
0.658824f, 0.662745f, 0.666667f, 0.670588f, 0.674510f, 0.678431f, 0.682353f, 0.686275f,
0.690196f, 0.694118f, 0.698039f, 0.701961f, 0.705882f, 0.709804f, 0.713726f, 0.717647f,
0.721569f, 0.725490f, 0.729412f, 0.733333f, 0.737255f, 0.741177f, 0.745098f, 0.749020f,
0.752941f, 0.756863f, 0.760784f, 0.764706f, 0.768627f, 0.772549f, 0.776471f, 0.780392f,
0.784314f, 0.788235f, 0.792157f, 0.796078f, 0.800000f, 0.803922f, 0.807843f, 0.811765f,
0.815686f, 0.819608f, 0.823529f, 0.827451f, 0.831373f, 0.835294f, 0.839216f, 0.843137f,
0.847059f, 0.850980f, 0.854902f, 0.858824f, 0.862745f, 0.866667f, 0.870588f, 0.874510f,
0.878431f, 0.882353f, 0.886275f, 0.890196f, 0.894118f, 0.898039f, 0.901961f, 0.905882f,
0.909804f, 0.913726f, 0.917647f, 0.921569f, 0.925490f, 0.929412f, 0.933333f, 0.937255f,
0.941177f, 0.945098f, 0.949020f, 0.952941f, 0.956863f, 0.960784f, 0.964706f, 0.968628f,
0.972549f, 0.976471f, 0.980392f, 0.984314f, 0.988235f, 0.992157f, 0.996078f, 1.000000
};
static I_Error_t I_Error_GL = NULL;
// !!! TEST !!!
D3DLVERTEX vTriangle[256];
// **************************************************************************
// GLOBALS
// **************************************************************************
#ifdef DEBUG_TO_FILE
static unsigned long nb_frames=0;
static clock_t my_clock;
HANDLE logstream;
#endif
static HDC hDC = NULL; // the window's device context
static HGLRC hGLRC = NULL; // the OpenGL rendering context
static HWND hWnd = NULL;
static BOOL WasFullScreen = FALSE;
#define MAX_VIDEO_MODES 32
static vmode_t video_modes[MAX_VIDEO_MODES];
// **************************************************************************
// FUNCTIONS
// **************************************************************************
// -----------------+
// APIENTRY DllMain : DLL Entry Point,
// : open/close debug log
// Returns :
// -----------------+
BOOL APIENTRY DllMain( HANDLE hModule, // handle to DLL module
DWORD fdwReason, // reason for calling function
LPVOID lpReserved ) // reserved
{
// Perform actions based on the reason for calling.
switch( fdwReason )
{
case DLL_PROCESS_ATTACH:
// Initialize once for each new process.
// Return FALSE to fail DLL load.
#ifdef DEBUG_TO_FILE
logstream = INVALID_HANDLE_VALUE;
logstream = CreateFile ("d3dlog.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL/*|FILE_FLAG_WRITE_THROUGH*/, NULL);
if (logstream == INVALID_HANDLE_VALUE)
return FALSE;
#endif
break;
case DLL_THREAD_ATTACH:
// Do thread-specific initialization.
break;
case DLL_THREAD_DETACH:
// Do thread-specific cleanup.
break;
case DLL_PROCESS_DETACH:
// Perform any necessary cleanup.
#ifdef DEBUG_TO_FILE
if ( logstream != INVALID_HANDLE_VALUE ) {
CloseHandle ( logstream );
logstream = INVALID_HANDLE_VALUE;
}
#endif
break;
}
return TRUE; // Successful DLL_PROCESS_ATTACH.
}
// -----------------+
// SetRes : Set a display mode
// Notes : pcurrentmode is actually not used
// -----------------+
int SetRes( viddef_t *lvid, vmode_t *pcurrentmode )
{
/*
char *renderer;
BOOL WantFullScreen = !(lvid->u.windowed); //(lvid->u.windowed ? 0 : CDS_FULLSCREEN );
DBG_Printf ("SetMode(): %dx%d %d bits (%s)\n",
lvid->width, lvid->height, lvid->bpp*8,
WantFullScreen ? "fullscreen" : "windowed");
hWnd = lvid->WndParent;
// BP : why flush texture ?
// if important flush also the first one (white texture) and restore it !
Flush(); // Flush textures.
// TODO: if not fullscreen, skip display stuff and just resize viewport stuff ...
// Exit previous mode
if( hGLRC )
UnSetRes();
// Change display settings.
if( WantFullScreen )
{
DEVMODE dm;
ZeroMemory( &dm, sizeof(dm) );
dm.dmSize = sizeof(dm);
dm.dmPelsWidth = lvid->width;
dm.dmPelsHeight = lvid->height;
dm.dmBitsPerPel = lvid->bpp*8;
dm.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL;
if( ChangeDisplaySettings( &dm, CDS_TEST ) != DISP_CHANGE_SUCCESSFUL )
return 0;
if( ChangeDisplaySettings( &dm, CDS_FULLSCREEN ) !=DISP_CHANGE_SUCCESSFUL )
return 0;
SetWindowLong( hWnd, GWL_STYLE, WS_POPUP|WS_VISIBLE );
// faB : book says to put these, surely for windowed mode
//WS_CLIPCHILDREN|WS_CLIPSIBLINGS );
}
SetWindowPos( hWnd, HWND_TOPMOST, 0, 0, lvid->width, lvid->height,
SWP_NOACTIVATE | SWP_NOZORDER );
if( !hDC )
hDC = GetDC( hWnd );
if( !hDC )
{
DBG_Printf("GetDC() FAILED\n");
return 0;
}
// Set res.
if( !SetupPixelFormat( lvid->bpp*8, 0, 16 ) )
return 0;
hGLRC = wglCreateContext( hDC );
if( !hGLRC ) { DBG_Printf("wglCreateContext() FAILED\n"); return 0; }
if( !wglMakeCurrent( hDC, hGLRC ) )
{
DBG_Printf("wglMakeCurrent() FAILED\n");
return 0;
}
screen_depth = lvid->bpp*8;
SetModelView( lvid->width, lvid->height );
SetStates();
// we need to clear the depth buffer. Very important!!!
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
lvid->buffer = NULL; // unless we use the software view
lvid->direct = NULL; // direct access to video memory, old DOS crap
WasFullScreen = WantFullScreen;
*/
BOOL WantFullScreen = !(lvid->u.windowed); //(lvid->u.windowed ? 0 : CDS_FULLSCREEN );
DBG_Printf ("SetMode(): %dx%d %d bits (%s)\n",
lvid->width, lvid->height, lvid->bpp*8,
WantFullScreen ? "fullscreen" : "windowed");
hWnd = lvid->WndParent;
// BP : why flush texture ?
// if important flush also the first one (white texture) and restore it !
Flush(); // Flush textures.
D3DXCreateContextEx( D3DX_DEFAULT, // D3DX handle
D3DX_CONTEXT_FULLSCREEN, // flags
hWnd,
hWnd, // hwndFocus
D3DX_DEFAULT, // colorbits
D3DX_DEFAULT, // alphabits
D3DX_DEFAULT, // numdepthbits
D3DX_DEFAULT, // stencilbits
D3DX_DEFAULT, // backbuffers
lvid->width,
lvid->height,
D3DX_DEFAULT, // refreshrate
&pD3DX // returned D3DX interface
);
pD3DDev = pD3DX->GetD3DDevice();
pDD = pD3DX->GetDD();
SetStates();
pD3DX->Clear(D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER);
return 1; // on renvoie une valeur pour dire que cela s'est bien pass
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -