⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch3rendr.cpp

📁 Windows上的MUD客户端程序
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		}

	}
	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 + -