//
//
// File: silhouetteEdges.h
//
// Author: Frank Luna (C) All Rights Reserved
//
// System: AMD Athlon 1800+ XP, 512 DDR, Geforce 3, Windows XP, MSVC++ 7.0
//
// Desc: Generates the silhouette geometry of a mesh and renders it. Note
// that we assume mesh vertex formats as described in MeshVertex.
//
//
#ifndef __silhouetteEdgesH__
#define __silhouetteEdgesH__
#include "d3dUtility.h"
struct EdgeVertex //边缘点,坐标+法向量+连接面1+连接面2
{
D3DXVECTOR3 position;
D3DXVECTOR3 normal;
D3DXVECTOR3 faceNormal1;
D3DXVECTOR3 faceNormal2;
};
struct MeshVertex
{
D3DXVECTOR3 position;
D3DXVECTOR3 normal;
static const DWORD FVF; //在C++的类定义中static const可以在声明时给定值,而在类外定义时没有给定值(也不能再次给定值)
//具体使用见 silhouetteEdges.cpp 代码第二行
};
class SilhouetteEdges //轮廓边类
{
public:
SilhouetteEdges(
IDirect3DDevice9* device,
ID3DXMesh* mesh,
ID3DXBuffer* adjBuffer);
~SilhouetteEdges();
void render();
private:
IDirect3DDevice9* _device;
IDirect3DVertexBuffer9* _vb;
IDirect3DIndexBuffer9* _ib;
IDirect3DVertexDeclaration9* _decl;
UINT _numVerts;
UINT _numFaces;
private:
bool createVertexDeclaration();
void getFaceNormal(
ID3DXMesh* mesh,
DWORD faceIndex,
D3DXVECTOR3* faceNormal);
void getFaceNormals(
ID3DXMesh* mesh,
ID3DXBuffer* adjBuffer,
D3DXVECTOR3* currentFaceNormal,
D3DXVECTOR3 adjFaceNormals[3],
DWORD faceIndex);
void genEdgeVertices(
ID3DXMesh* mesh,
ID3DXBuffer* adjBuffer);
void genEdgeIndices(
ID3DXMesh* mesh);
};
#endif // __silhouetteEdgesH__
//
//
//File; silhouetteEdges.cpp
//
//laserss , 2015.3.14
//
//
#include "silhouetteEdges.h"
const DWORD MeshVertex::FVF = D3DFVF_XYZ | D3DFVF_NORMAL;
SilhouetteEdges::SilhouetteEdges(IDirect3DDevice9* device,
ID3DXMesh* mesh,
ID3DXBuffer* adjBuffer)
{
_device = device;
_vb = 0;
_ib = 0;
_decl = 0;
_numVerts = 0;
_numFaces = 0;
genEdgeVertices(mesh, adjBuffer);
genEdgeIndices(mesh);
createVertexDeclaration();
}
SilhouetteEdges::~SilhouetteEdges(){
d3d::Release<IDirect3DVertexBuffer9*>(_vb);
d3d::Release<IDirect3DIndexBuffer9*>(_ib);
d3d::Release<IDirect3DVertexDeclaration9*>(_decl);
}
bool SilhouetteEdges::createVertexDeclaration(){
//创建SilhouetteEdges中的顶点声明_decl (但还未启用)
HRESULT hr = 0;
D3DVERTEXELEMENT9 decl[] ={
// 一个坐标,三个法向量
// 数据流, 字节偏移量, 数据类型, 网格化方法, 顶点分量的用途, 相同用法顶点分量的序号
{0, 0,