📄 hgraphic3d.h
字号:
/********************************************************************
*
* =-----------------------------------------------------------------=
* = ____ _________ =
* = / _ \ \___ __/ =
* = / /_/ / ____ / / =
* = / _ \ ● / _ \ / / =
* = / /_/ // // / / // / =
* = \______//_//_/ /_//_/ =
* = =
* = Copyright (c) BIN Technology studio,2004 =
* = LET'Z BT =
* =-----------------------------------------------------------------=
*
* FileName : hGraphic3D.h
* Description : 3D图像引擎接口,支持桌面为16Bit或32Bit
*
* Author : 风间苍月(TuQbasic)
* Email : tuqbasic@sohu.com
*
* Create : 2004.02.03
* LastChange : 2004.02.14
*
* History :
********************************************************************/
#pragma once
#include <d3d8.h>
#include <d3dx8.h>
#pragma comment(lib,"d3d8.lib")
#pragma comment(lib,"d3dx8.lib")
#include "hGraphic2D.h"
// 3D对象文件映像类型
#define MODEL_XXX 0x1
#define MODEL_MDX 0x2
#define MODEL_3DS 0x3
// 子图形顶点
#define VERTEX_LEFT_TOP 0x0
#define VERTEX_RIGHT_TOP 0x1
#define VERTEX_RIGHT_BOTTOM 0x2
#define VERTEX_LEFT_BOTTOM 0x3
// ************************************************************************************
// *--------------------------Direct3DTexture8接口-------------------------------------
class IDXTexture : public IBasicImage
{
public:
virtual ~IDXTexture(void) {}
// 获得Direct3DTexture8
virtual LPDIRECT3DTEXTURE8 GetDirectTexture8(void) = 0;
// 衰减和增强Alpha通道(同时也可衰减颜色),只在拥有Alpha通道下使用
virtual bool AttenuationAlpha(DWORD dwColor) = 0;
virtual bool AdditiveAlpha(DWORD dwColor) = 0;
};
typedef IDXTexture * LPI_DXTEXTURE;
typedef IDXTexture * LPI_DXALPHATEX;
// ************************************************************************************
// *---------------------世界观察眼睛,类似第一人称视角的观察控制----------------------
class IEyeWorld
{
public:
virtual ~IEyeWorld(void) {}
// 观察者的位置,默认为(0,0,1)
virtual void GetEyePosition(D3DVECTOR& vec) = 0;
virtual void SetEyePosition(const D3DVECTOR& vec) = 0;
// 眼睛观察的方向,默认为(0,0,0)
virtual void GetEyeLookat(D3DVECTOR& vec) = 0;
virtual void SetEyeLookat(const D3DVECTOR& vec) = 0;
// 观察者头顶的方向,默认为(0,1,0)
virtual void GetUpVector(D3DVECTOR& vec) = 0;
virtual void SetUpVector(const D3DVECTOR& vec) = 0;
// 眼睛的能见范围
virtual void GetEyeAbility(float *fNear, float *fFar) = 0;
virtual void SetEyeAbility(float fNear, float fFar) = 0;
// 应用当前的眼睛设置
virtual HRESULT ActiveEye(void) = 0;
};
typedef IEyeWorld * LPI_EYEWORLD;
#define MAX_LIGHT 8
// ************************************************************************************
// *---------------------Direct灯光对象管理,管理8个灯光-------------------------------
class ILight
{
public:
virtual ~ILight(void) {}
// 设置环境光
virtual HRESULT SetAmbientLight(D3DCOLOR d3dclr) = 0;
// 设置灯光是否有效
virtual HRESULT SetAmbientEnable(bool bEnable) = 0;
// 初始化一个点光源
virtual HRESULT SetPointLight(D3DVECTOR Position/*光源在空间中的位置*/,
float Range/*光照的的最大距离,在这个距离以外将不起作用*/,
DWORD Diffuse/*光的漫反射颜色*/,
DWORD Specular= 0/*镜面反射颜色*/,
DWORD Ambient= 0/*总体颜色(相当于环境光)*/,
unsigned long uIndex= 0/*0...7*/) = 0;
// 初始化一个聚光灯
virtual HRESULT SetSpotLight(D3DVECTOR Position/*光源在空间中的位置*/,
D3DVECTOR Direction/*光照的方向*/,
float Range/*光照的的最大距离,在这个距离以外将不起作用*/,
DWORD Diffuse/*光的漫反射颜色*/,
DWORD Specular= 0/*镜面反射颜色*/,
DWORD Ambient= 0/*总体颜色(相当于环境光)*/,
float Theta= D3DX_PI / 4/*聚光灯的内圈大小(单位:弧度)*/,
float Phi= D3DX_PI / 2/*聚光灯的外圈大小(单位:弧度)*/,
unsigned long uIndex= 0) = 0;
// 初始化一个平行光
virtual HRESULT SetDirectionalLight(D3DVECTOR Direction/*光照的方向*/,
float Range/*光照的的最大距离,在这个距离以外将不起作用*/,
DWORD Diffuse/*光的漫反射颜色*/,
DWORD Specular= 0/*镜面反射颜色*/,
DWORD Ambient= 0/*总体颜色(相当于环境光)*/,
unsigned long uIndex= 0) = 0;
// 设置一个自定义灯光
virtual HRESULT SetUserLight(D3DLIGHT8 d3dLight, unsigned long uIndex= 0) = 0;
// 选择一个灯光到设备上
virtual HRESULT SelectLight(unsigned long uIndex= 0) = 0;
// 设置灯光是否有效
virtual HRESULT EnableLight(bool bEnable, unsigned long uIndex= 0) = 0;
};
typedef ILight * LPI_LIGHT;
class IDisplay3D;
typedef IDisplay3D * LPI_DISPLAY3D;
// ************************************************************************************
// *---------------------------在2D空间绘制的子图形------------------------------------
class IDXSprite : public ITUnknown
{
public:
virtual ~IDXSprite(void) {}
// 绘制子图形,bAlpha将使用alpha通道
virtual HRESULT DrawSprite(LPI_DISPLAY3D pDisplay, bool bAlpha= false) = 0;
// 设置子图形的深度
virtual bool SetSpriteDepth(float fDepth) = 0;
// 设置顶点的位置,vIndex指示哪个顶点,默认为(0, 0)-(width, height)
virtual bool SetVertexPosition(POINT& pt, long vIndex) = 0;
// 获取一个顶点的信息
virtual bool GetVertexPostion(POINT& pt, long vIndex) = 0;
// 平移整个子图形
virtual bool MoveVertex(POINT& pt) = 0;
// 设置顶点的位置成矩形
virtual bool SetVertexPosition(RECT *rect) = 0;
// 设置定点颜色,默认为白色
virtual bool SetVertexColor(DWORD dwColor, long vIndex) = 0;
// 设置子图形使用纹理的区域,rect 不为空
virtual bool SetTextureRect(RECT *rect) = 0;
// 激活子图形的设置
virtual bool ActiveSprite(void) = 0;
// 设置子图形应用的纹理,引用计数加1
virtual bool SetTexture(LPI_DXTEXTURE pTexture) = 0;
// 获取子图形使用的纹理
virtual LPI_DXTEXTURE GetTexture(void) = 0;
};
typedef IDXSprite * LPI_DXSPRITE;
// ************************************************************************************
// *---------------------------------3D子图形------------------------------------------
class IDXSprite3D : public ITUnknown
{
public:
virtual ~IDXSprite3D(void) {}
// 绘制子图形,bAlpha将使用alpha通道
virtual HRESULT DrawSprite(LPI_DISPLAY3D pDisplay, bool bAlpha= false) = 0;
// 设置顶点的位置,vIndex指示哪个顶点,默认为(0, 0, 0)-(-1, 1, 0)
virtual bool SetVertexPosition(D3DVECTOR& vec, long vIndex) = 0;
// 获取一个顶点的信息
virtual bool GetVertexPostion(D3DVECTOR& vec, long vIndex) = 0;
// 平移整个子图形
virtual bool MoveVertex(D3DVECTOR& vec) = 0;
// 设置定点颜色,默认为白色
virtual bool SetVertexColor(DWORD dwColor, long vIndex) = 0;
// 设置子图形使用纹理的区域,rect 不为空
virtual bool SetTextureRect(RECT *rect) = 0;
// 激活子图形的设置
virtual bool ActiveSprite(void) = 0;
// 设置子图形应用的纹理,引用计数加1
virtual bool SetTexture(LPI_DXTEXTURE pTexture) = 0;
// 获取子图形使用的纹理
virtual LPI_DXTEXTURE GetTexture(void) = 0;
};
typedef IDXSprite3D * LPI_DXSPRITE3D;
// ************************************************************************************
// *-----------------------------------3D网格模型--------------------------------------
class IXModel : public ITUnknown
{
public:
virtual ~IXModel(void) {}
// 模型的位置
virtual void GetModelPosition(float *x, float *y, float *z) = 0;
virtual void SetModelPosition(float x, float y, float z) = 0;
// 模型自身的旋转,设置时将返回上一个设置值
virtual float SetRationX(float Angle) = 0;
virtual float GetRationX(void) = 0;
virtual float SetRationY(float Angle) = 0;
virtual float GetRationY(void) = 0;
virtual float SetRationZ(float Angle) = 0;
virtual float GetRationZ(void) = 0;
virtual void SetRation(float xAngle, float yAngle, float zAngle) = 0;
// 模型的缩放
virtual float SetScaleX(float Scale) = 0;
virtual float GetScaleX(void) = 0;
virtual float SetScaleY(float Scale) = 0;
virtual float GetScaleY(void) = 0;
virtual float SetScaleZ(float Scale) = 0;
virtual float GetScaleZ(void) = 0;
virtual void SetScale(float xScale, float yScale, float zScale) = 0;
// 应用当前的模型控制设置
virtual HRESULT ActiveModel(void) = 0;
// 在设备中渲染物体
virtual HRESULT RenderModel(LPI_DISPLAY3D pDisplay) = 0;
// 获取总共需要的纹理数目
virtual long GetTextureNumber(void) = 0;
// 获取纹理的文件名
virtual const char * GetTextureName(long index) = 0;
// 设置纹理
virtual bool SetTexture(LPI_DXTEXTURE pTexture, long index) = 0;
// 返回纹理
virtual LPI_DXTEXTURE GetTexture(long index) = 0;
};
typedef IXModel * LPI_XMODEL;
// ************************************************************************************
// *----------------------------------3D对象创建接口----------------------------------
class IHardWare3D : public IDisplay2D
{
public:
virtual ~IHardWare3D(void) {}
virtual LPI_BASICIMAGE Get3DBackBuffer(void) = 0;
virtual LPDIRECT3DDEVICE8 GetDirect3DDevice8(void) = 0;
// 创建用于输出到后台缓冲的文字
virtual LPD3DXFONT CreateD3DXFont(LOGFONT& font) = 0;
// 创建与当前显示位数一致的纹理,不含Alpha通道
virtual LPI_DXTEXTURE CreateTexture(int nWidth, int nHeight, long lType= TYPE_MEMORY) = 0;
virtual LPI_DXTEXTURE CreateTextureFromIMG(const char *szFileName, long Image= IMAGE_BMP, long lType= TYPE_MEMORY, LPI_PACKAGE pPackFile= NULL) = 0;
// 创建与当前显示位数一致的纹理,不含Alpha通道,如果图像格式不含Alpha通道,则Alpha为最大
virtual LPI_DXALPHATEX CreateAlphaTexture(int nWidth, int nHeight, long lType= TYPE_MEMORY) = 0;
virtual LPI_DXALPHATEX CreateAlphaTextureFromIMG(const char *szFileName, long Image= IMAGE_BMP, long lType= TYPE_MEMORY, LPI_PACKAGE pPackFile= NULL) = 0;
// 创建一个子图形
virtual LPI_DXSPRITE CreateSprite(LPI_DXTEXTURE pTexture) = 0;
virtual LPI_DXSPRITE CreateSpriteFromIMG(const char *szFileName, long Image= IMAGE_BMP, long lType= TYPE_MEMORY, LPI_PACKAGE pPackFile= NULL) = 0;
virtual LPI_DXSPRITE CreateAlphaSpriteFromIMG(const char *szFileName, long Image= IMAGE_BMP, long lType= TYPE_MEMORY, LPI_PACKAGE pPackFile= NULL) = 0;
// 创建3D子图形
virtual LPI_DXSPRITE3D Create3DSprite(LPI_DXTEXTURE pTexture) = 0;
virtual LPI_DXSPRITE3D Create3DSpriteFromIMG(const char *szFileName, long Image= IMAGE_BMP, long lType= TYPE_MEMORY, LPI_PACKAGE pPackFile= NULL) = 0;
virtual LPI_DXSPRITE3D Create3DAlphaSpriteFromIMG(const char *szFileName, long Image= IMAGE_BMP, long lType= TYPE_MEMORY, LPI_PACKAGE pPackFile= NULL) = 0;
// 从文件映像创建一个模型
virtual LPI_XMODEL CreateModelFromIMG(const char *szFileName, long Model= MODEL_XXX, LPI_PACKAGE pPackFile= NULL) = 0;
};
// ************************************************************************************
// *----------------------------------3D显示接口---------------------------------------
class IDisplay3D : public IHardWare3D
{
public:
virtual ~IDisplay3D(void) {}
// 清除场景中的内容
virtual HRESULT ClearDevice(DWORD clr= 0L) = 0;
// 开始绘制场景
virtual HRESULT BeginScene(void) = 0;
// 结束场景绘制
virtual HRESULT EndScene(void) = 0;
// 将绘制的场景绘制到前台画面
virtual HRESULT Present3D(void) = 0;
// 获取视点接口
virtual LPI_EYEWORLD GetEye(void) = 0;
// 获取灯光管理接口
virtual LPI_LIGHT GetLight(void) = 0;
// 绘制文本
virtual HRESULT DrawFont(int x, int y, DWORD dwColor, const char *szText) = 0;
// 设置设备状态
virtual HRESULT SetRenderState(D3DRENDERSTATETYPE State, DWORD Value) = 0;
};
//----------------------------------------------------------------------------------------------------
SAM_API HRESULT CreateDisplay3D(HWND hWnd, int nScreenWidth, int nScreenHeight, LPI_DISPLAY3D* ppDisplay3D, bool bWindowed= true, int iDepth= 16);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -