📄 ch3rendr.cpp
字号:
}
}
else
{
if ( uOption & ChMazeTextureHTTPReq::textureAutoSize )
{ // auto will always increase the size if it is less than 256
if ( iWidth != pDibIn->GetWidth()
&& (iWidth * 2) <= 256 )
{
iWidth *= 2;
}
if ( iHeight != pDibIn->GetHeight()
&& (iHeight * 2) <= 256 )
{
iHeight *= 2;
}
}
else if ( uOption & ChMazeTextureHTTPReq::textureExpand )
{
if ( iWidth != pDibIn->GetWidth() )
{
iWidth *= 2;
}
if ( iHeight != pDibIn->GetHeight() )
{
iHeight *= 2;
}
}
}
// shrink or expand if required
if ( (iWidth != pDibIn->GetWidth() || iHeight != pDibIn->GetHeight())
&& ( uOption & ChMazeTextureHTTPReq::textureShrink
|| uOption & ChMazeTextureHTTPReq::textureExpand )
|| ( uOption & ChMazeTextureHTTPReq::textureAutoSize ) )
{
// size the DIB
pDibIn->SetSize( iWidth, iHeight );
}
// Create new texture
Dword_t textureHandle = R3dNewTexture( hRC, R3D_TI_MIPMAP, 32, iWidth, iHeight );
if ( textureHandle )
{
LPBITMAPINFO pBmpInfo = pDibIn->GetBitmapInfoAddress();
RGBQUAD* pRgbQuad = pDibIn->GetClrTabAddress();
BYTE* pBits = (BYTE*)pDibIn->GetBitsAddress();
LPByte_t pTexBuffer = new Byte_t[ iWidth * 4 ];
Word_t texInfo;
if ( uOption & ChMazeTextureHTTPReq::textureChromaKey )
{
//texInfo = R3D_TI_CHROMAKEY;
texInfo = R3D_TI_DEFAULT; // jwd
}
else
{
texInfo = R3D_TI_DEFAULT;
luChromaClr = 0;
}
for( int i = iHeight - 1; i >= 0; i-- )
{ // the scan lines in a DIB are stored in reverse order
LPByte_t pTmpTex = pTexBuffer;
// Load the RGB quad in RGBA format
for ( int j = 0; j < iWidth; j++ )
{
if ( pBmpInfo->bmiHeader.biBitCount == 24 )
{
int iOffset = j*3;
*pTmpTex++ = pBits[2 + iOffset ];
*pTmpTex++ = pBits[1 + iOffset ];
*pTmpTex++ = pBits[0 + iOffset ];
}
else
{
*pTmpTex++ = pRgbQuad[ pBits[j] ].rgbRed;
*pTmpTex++ = pRgbQuad[ pBits[j] ].rgbGreen;
*pTmpTex++ = pRgbQuad[ pBits[j] ].rgbBlue;
}
Byte_t alpha = 0xFF;
if ( uOption & ChMazeTextureHTTPReq::textureChromaKey )
{
Byte_t red = LOBYTE(luChromaClr);
Byte_t green = HIBYTE(LOWORD(luChromaClr));
Byte_t blue = LOBYTE(HIWORD(luChromaClr));
if(*(pTmpTex-3) == red && *(pTmpTex-2) == green && *(pTmpTex-1) == blue)
{
alpha = 0;
}
}
*pTmpTex++ = alpha;
}
// Go to the next row
if ( pBmpInfo->bmiHeader.biBitCount == 24 )
{
pBits += (((pDibIn->GetWidth() * 3 ) + 3) & ~3);
}
else
{
pBits += (( pDibIn->GetWidth() + 3) & ~3);
}
// Load the texture row into 3dr
R3dLoadTexture( hRC,
texInfo, // texture info
32, // bits per pixel
0, // mip level
iWidth, // width of the texture
i, // row being set
0, // set this to zero for row at a time
textureHandle, // R3dNewTexture return value
//luChromaClr, // chromacode or alpha key if any
0, // chromacode or alpha key if any
pTexBuffer ); // the real data
}
// we are done, do the cleanup
delete []pTexBuffer;
}
return textureHandle;
}
#elif (defined(CH_USE_RLAB)) || defined(CH_USE_D3D)
// don't need for RLAB - see ChRLImage instead
#else
#pragma message("ChRenderContext::LoadDIBTexture() Not done!")
#endif
// Stack Manipulators for QV traversals. For 3dr, use 3dr's stack; for others, use ours
ChRenderContext * ChRenderContext::ClearTransformStack()
{
#if defined(CH_USE_3DR)
G3dSetActiveStack(GetGC(), G3DT_MODEL);
G3dClearStack( GetGC() );
#else
while(m_pStack && !m_pStack->IsEmpty())
{
m_pStack->RemoveHead();
}
PushTransform();
#endif
return this;
};
ChRenderContext * ChRenderContext::ComposeTransform(GxTransform3Wf& transform) // apply to object end
{
#if defined(CH_USE_3DR)
G3dSetActiveStack(GetGC(), G3DT_MODEL);
G3dPostMultTransform(GetGC(), *(transform.GetMatrix()));
#else
ASSERT(m_pStack);
GxTransform3Wf& top = m_pStack->GetHead();
//top = transform.Compose(top); // this could be faster if we had compose in place for transforms
top = transform * top; // this is one copy faster, i think
#endif
return this;
};
ChRenderContext * ChRenderContext::PopTransform()
{
#if defined(CH_USE_3DR)
G3dSetActiveStack(GetGC(), G3DT_MODEL);
G3dPopTransform( GetGC() );
#else
ASSERT(m_pStack);
m_pStack->RemoveHead();
#endif
return this;
};
ChRenderContext * ChRenderContext::PopTransform(GxTransform3Wf& transform)
{
#if defined(CH_USE_3DR)
// need to fetch and convert it first
GxTransformF_t mat;
G3dSetActiveStack(GetGC(), G3DT_MODEL);
G3dGetTransform(GetGC(), mat);
transform = GxTransform3Wf(mat);
G3dPopTransform( GetGC() );
#else
ASSERT(m_pStack);
transform = m_pStack->RemoveHead();
#endif
return this;
};
ChRenderContext * ChRenderContext::PushTransform()
{
#if defined(CH_USE_3DR)
G3dSetActiveStack(GetGC(), G3DT_MODEL);
G3dPushTransform( GetGC() );
#else
GxTransform3Wf top;
ASSERT(m_pStack);
if(!m_pStack->IsEmpty()) top = m_pStack->GetHead();
m_pStack->AddHead(top);
#endif
return this;
};
GxTransform3Wf ChRenderContext::GetModelTransform() // Renderer's current Model to world
{
#if defined(CH_USE_3DR)
GxTransformF_t mat;
G3dSetActiveStack(GetGC(), G3DT_MODEL);
G3dGetTransform(GetGC(), mat);
return GxTransform3Wf(mat);
#else
ASSERT(m_pStack);
GxTransform3Wf& top = m_pStack->GetHead();
return top;
#endif
}
ChRenderContext *ChRenderContext::SetModelTransform(GxTransform3Wf& transform)
{
#if defined(CH_USE_3DR)
G3dSetActiveStack(GetGC(), G3DT_MODEL);
G3dSetTransform(GetGC(), *(transform.GetMatrix())); //(float(*)[4])
#else
ASSERT(m_pStack);
GxTransform3Wf& top = m_pStack->GetHead();
top = transform;
#endif
return this;
}
// End transform stack methods
void ChRenderContext::Init(ChViewBaseClass *pWnd, CDC* pDC)
{
#if defined(CH_USE_3DR)
{
if(!m_hRC)
{
m_hRC = R3dCreateRC((DWORD)(pDC->GetSafeHdc()), R3D_RI_DOUBLE_BUFFER /*R3D_RI_DEFAULT*/);
m_hGC = G3dCreateGC( m_hRC);
m_hDC = pDC->GetSafeHdc();
m_pWnd = pWnd;
}
// Reset quality while moving to highest / 2 - range is 0 to 1.00
m_moveQuality = .50;
m_standingQuality = 1.0;
// Reset states
int dithering = !!(R3dGetState( m_hRC, R3D_STA_ENABLES) & R3D_SE_DITHERING);
int numColors = pDC->GetDeviceCaps(NUMCOLORS);
if(numColors > 256 || numColors < 0)
{
R3dSetState( m_hRC, R3D_STA_DISABLES, R3D_SE_DITHERING);
}
R3dSetState( m_hRC, R3D_STA_ENABLES, R3D_SE_SHADING);
R3dSetState( m_hRC, R3D_STA_ENABLES, R3D_SE_Z_BUFFERING);
R3dSetState( m_hRC, R3D_STA_DISABLES, R3D_SE_CLIPPING);
}
#elif (defined(CH_USE_RLAB))
{
RECT r;
int bpp;
if(!m_hRC)
{
m_hDC = pDC->GetSafeHdc();
m_pWnd = pWnd;
GetWnd()->GetClientRect(&r);
m_hRC = RLWinCreateDevice(GetWnd()->GetSafeHwnd(), NULL, r.right, r.bottom);
{
CDC *pdc = GetWnd()->GetDC();
bpp = pdc->GetDeviceCaps(BITSPIXEL);
GetWnd()->ReleaseDC(pdc);
}
if (bpp == 1)
{
ChNrDeviceSetShades(m_hRC, 4);
ChNrSetDefaultTextureShades(4);
} else if (bpp == 16)
{
ChNrDeviceSetShades(m_hRC, 32);
ChNrSetDefaultTextureColors(64);
ChNrSetDefaultTextureShades(32);
ChNrDeviceSetDither(m_hRC, FALSE);
} else if (bpp == 24)
{
ChNrDeviceSetShades(m_hRC, 256);
ChNrSetDefaultTextureColors(64);
ChNrSetDefaultTextureShades(256);
ChNrDeviceSetDither(m_hRC, FALSE);
} else
//ChNrDeviceSetDither(m_hRC, FALSE);
ChNrDeviceSetDither(m_hRC, TRUE);
#if (defined(CH_USE_RLAB))
// This is implicit in the driver in d3d
ChNrDeviceSetColorModel(m_hRC, stdColorModel); // ??????????
#endif
ChNrDeviceSetQuality(m_hRC, stdQuality);
m_sceneFrame = CreateFrame(NULL);
ChNrObjectAddDestroyCallback(m_sceneFrame, SceneDestroyCallback, this);
//TRACE("Scene Created\n");
m_cameraFrame = CreateFrame(m_sceneFrame);
ChNrFrameAddCallback(m_cameraFrame, CameraCallback, this);
ChNrObjectAddDestroyCallback(m_cameraFrame, CameraDestroyCallback, this);
//TRACE("Camera frame Created\n");
D3DRelease(m_cameraFrame);
m_viewport = CreateViewport( m_hRC, m_cameraFrame, 0, 0,
ChNrDeviceGetWidth(m_hRC),
ChNrDeviceGetHeight(m_hRC)
);
ChNrObjectAddDestroyCallback(m_viewport, ViewportDestroyCallback, this);
//TRACE("Viewport Created\n");
ChNrViewportSetBack(m_viewport, 5000.0);
// Change both scene and camera frames to RHS - camera is a child of scene
ChNrFrameAddScale(m_sceneFrame, CombineBefore, 1., 1., -1.);
#if (defined(CH_USE_RLAB))
RLSceneSetBackground(m_sceneFrame, ((ChMazeWnd*)GetWnd())->GetBackgroundColorL());
#else
SetBackgroundColor((ChMazeWnd*)GetWnd())->GetBackgroundColorL());
#endif
m_pStack = new ChTransformStack;
ClearTransformStack();
}
}
#else //d3d
{
#if 1
RECT r;
int bpp;
if(!m_hRC)
{
m_hDC = pDC->GetSafeHdc();
m_pWnd = pWnd;
GetWnd()->GetClientRect(&r);
/*
* Create the DD object
*/
HRESULT rval = DirectDrawCreate( NULL, &m_DD, NULL );
if (rval != D3DRM_OK) {
//Msg("Failed to create Direct3DRM.\n%s", D3DRMErrorToString(rval));
// NEED TO THROW AN EXCEPTION HERE!
return;
}
m_DD->SetCooperativeLevel(pWnd->GetSafeHwnd(), DDSCL_NORMAL);
// We might need a DD2 object too, but query for it if we do
/*
* Create the D3D object
*/
rval = m_DD->QueryInterface(IID_IDirect3D, (void **)&m_D3D);
if (rval != D3DRM_OK) {
//Msg("Failed to create Direct3DRM.\n%s", D3DRMErrorToString(rval));
// NEED TO THROW AN EXCEPTION HERE!
return;
}
/*
* Create the D3DRM object; wonderfully consistent, eh?
*/
rval = Direct3DRMCreate(&m_D3DRM);
if (rval != D3DRM_OK) {
//Msg("Failed to create Direct3DRM.\n%s", D3DRMErrorToString(rval));
// NEED TO THROW AN EXCEPTION HERE!
return;
}
/*
* Create a clipper and associate the window with it
*/
rval = DirectDrawCreateClipper(0, &m_DDClipper, NULL);
if (rval != DD_OK) {
//Msg("Failed to create DirectDrawClipper");
// NEED TO THROW AN EXCEPTION HERE!
return;
}
rval = m_DDClipper->SetHWnd(0, GetWnd()->GetSafeHwnd());
if (rval != DD_OK) {
//Msg("Failed to set hwnd on the clipper");
// NEED TO THROW AN EXCEPTION HERE!
return;
}
m_hRC = CreateDevice(r.right, r.bottom);
{
CDC *pdc = GetWnd()->GetDC();
bpp = pdc->GetDeviceCaps(BITSPIXEL);
GetWnd()->ReleaseDC(pdc);
}
if (bpp == 1)
{
ChNrDeviceSetShades(m_hRC, 4);
m_D3DRM->SetDefaultTextureShades(4);
} else if (bpp == 16)
{
ChNrDeviceSetShades(m_hRC, 32);
m_D3DRM->SetDefaultTextureColors(64);
m_D3DRM->SetDefaultTextureShades(32);
ChNrDeviceSetDither(m_hRC, FALSE);
} else if (bpp == 24)
{
ChNrDeviceSetShades(m_hRC, 256);
m_D3DRM->SetDefaultTextureColors(64);
m_D3DRM->SetDefaultTextureShades(256);
ChNrDeviceSetDither(m_hRC, FALSE);
} else
ChNrDeviceSetDither(m_hRC, TRUE);
ChNrDeviceSetQuality(m_hRC, stdQuality);
m_sceneFrame = CreateFrame(NULL);
ChNrObjectAddDestroyCallback(m_sceneFrame, SceneDestroyCallback, this);
//TRACE("Scene Created\n");
m_cameraFrame = CreateFrame(m_sceneFrame);
ChNrFrameAddCallback(m_cameraFrame, CameraCallback, this);
ChNrObjectAddDestroyCallback(m_cameraFrame, CameraDestroyCallback, this);
//TRACE("Camera frame Created\n");
D3DRelease(m_cameraFrame);
m_viewport = CreateViewport( m_hRC, m_cameraFrame, 0, 0,
ChNrDeviceGetWidth(m_hRC),
ChNrDeviceGetHeight(m_hRC)
);
ChNrObjectAddDestroyCallback(m_viewport, ViewportDestroyCallback, this);
//TRACE("Viewport Created\n");
ChNrViewportSetBack(m_viewport, 5000.0);
// Change both scene and camera frames to RHS - camera is a child of scene
ChNrFrameAddScale(m_sceneFrame, CombineBefore, 1., 1., -1.);
#if (defined(CH_USE_RLAB))
RLSceneSetBackground(m_sceneFrame, ((ChMazeWnd*)GetWnd())->GetBackgroundColorL());
#else
SetBackgroundColor(((ChMazeWnd*)GetWnd())->GetBackgroundColorL());
#endif
m_pStack = new ChTransformStack;
ClearTransformStack();
#if 0
{
ChNrMesh egg_mesh;
ChNrFrame egg;
egg_mesh = CreateMesh();
if(egg_mesh)
{
rval = egg_mesh->Load("egg.x", NULL, D3DRMLOAD_FROMFILE, NULL, NULL);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -