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

📄 terrain.h

📁 x3d_new.rar
💻 H
字号:
#pragma once

#include "object.h"
#include "Camera.h"

#include "RiceIndices.h"
#include "Field.h"
#include "TerrainTexture.h"

#include <vector>

#include <d3d9.h>

struct SPatch
{
	LPDIRECT3DVERTEXBUFFER9	m_pVB;
	LPDIRECT3DVERTEXBUFFER9 m_pVBNormal;
	LPDIRECT3DINDEXBUFFER9  m_pIB;
	int m_nIndexCount;
};

class CTerrain :
    public CObject
{
public:
    CTerrain(void);
    ~CTerrain(void);

    virtual void Render(void);

public:
    // 顶点格式
    struct SVertexData          
    {
        enum { FVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX2 };

		D3DXVECTOR3  position;	// 位置
		D3DXVECTOR3  normal;	// 法线		

        float tu, tv;           // 纹理坐标
        float tu1, tv1;         // 纹理坐标1
    };

    // 法线的顶点格式
    struct SNormalVertexData          
    {    
        enum { FVF = D3DFVF_XYZ | D3DFVF_DIFFUSE };

        D3DXVECTOR3  position;	// 位置
		DWORD		 diffuse;   // 颜色
    };

public:
    // 创建、销毁
    bool Create(int nSize);
    void Destroy(void);

    //   随机生成高度数据
	//	 fRoughness:	粗糙度(0.0f - 1.0f)
	//	 fSlab:			层次趋向(0.0f - 1.0f)
	//	 nBlur:			模糊次数
    void RandomHeight(float fRoughness = 0.5f, float fSlab = 0.5f, int nBlur = 2);

    //   更新模型细节
    void UpdateDetail(CCamera* pCamera, int nEyeshot);

    //   是否绘制法线
    void SetDrawNormal(bool bDraw){
        m_bDrawNormal = bDraw;
    }
    bool IsDrawNormal(void){
        return m_bDrawNormal;
    }

    //   高度缩放
    void SetHeightScale(float fScale){
        m_fHeightScale = fScale;
    }
    float GetHeightScale(void){
        return m_fHeightScale;
    }

    //    地形尺寸
    int   GetSize(void){
        return m_nSize;
    }

	//	  地形块尺寸
	int	  GetPatchSize(void){
		return m_nPatchSize;
	}

    //    地形高度最大值
    float GetMaxHeight(void){
        assert(m_field.IsValid());
        return m_field.GetMaxHeight() * m_fHeightScale;
    }

private:
    //      设置模型
    HRESULT SetupGeometry(void);

    //      设置法线模型
    HRESULT SetupNormalGeometry(void);

    //      设置索引
    HRESULT SetupIndexBuffer(void);

    //      设置材质
    void    SetupMaterial(void);

    //      索引映射
    void    MapIndices(LPDWORD pOut, const STile* pTile);

private:    
    CRiceIndicesMng         m_RiceIndicesMng;   // "米"字索引模板管理器
    CField                  m_field;            // 用于管理地形高度及细节等
    CFieldTexturePainter    m_TexturePainter;   // 用于生成地形纹理

	SPatch*					m_Patchs;			// 地形块数组

    LPDIRECT3DTEXTURE9      m_pTexture;         // 地形纹理指针
    LPDIRECT3DTEXTURE9      m_pDetailTexture;   // 细节纹理指针
    D3DMATERIAL9            m_Material;         // 材质

    bool                    m_bDrawNormal;      // 是否绘制法线
    float                   m_fHeightScale;     // 高度缩放
    int                     m_nSize;            // 地形尺寸
	int						m_nPatchSize;		// 地形块尺寸
};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -