D3dFvf顶点格式的C++描述(vc.net版)

原创 2004年06月04日 15:02:00

以下代码在vc 7.1(vs.net2003)下编译通过。

使用模板偏特化实现

#ifndef _AI_D3DFVF_H_
#define _AI_D3DFVF_H_
//D3d9Fvf struct generate templates
//Author Kevinqing <qingzl@cdgwbn.com.cn>
//
#include <d3d9.h>
//-----------posoition-------------
namespace _D3DFvf{
template <bool b>struct pos_t;
template <> struct pos_t<true>{
union {
D3DVECTOR v;
struct{
float x,y,z;
};
};
};
//-----------RHW-------------------
template <bool b>struct rhw_t;
template <> struct rhw_t<false>{};
template <> struct rhw_t<true>{
float rhw;
};
//-----------W---------------------
template <bool b>struct w_t;
template <> struct w_t<false>{};
template <> struct w_t<true>{
DWORD w;
};
//-----------normal----------------
template <bool b>struct n_t;
template <> struct n_t<false>{};
template <> struct n_t<true>{
D3DVECTOR n;
};

//-----------psize-----------------
template <bool b>struct psize_t;
template <> struct psize_t<false>{};
template <> struct psize_t<true>{
float psize;
};
//-----------diff-------------------
template <bool b>struct diff_t;
template <> struct diff_t<false>{};
template <> struct diff_t<true>{
D3DCOLOR diff;
};

//-----------spec-------------------
template <bool b>struct spec_t;
template <> struct spec_t<false>{};
template <> struct spec_t<true>{
D3DCOLOR spec;
};

#define TestFlag(a,b,m) (bool((a&m)==b))
#define tp(a,b) TestFlag(a,b,D3DFVF_POSITION_MASK)

#define TestMask(a,b) (bool((a&b)!=0))
//----------b/i----------------------
#define IsXYZBn(a) (tp(a,D3DFVF_XYZB1)||/
tp(a,D3DFVF_XYZB2)||/
tp(a,D3DFVF_XYZB3)||/
tp(a,D3DFVF_XYZB4)||/
tp(a,D3DFVF_XYZB5))

#define XYZBn(a) (tp(a,D3DFVF_XYZB1)? 1:(/
tp(a,D3DFVF_XYZB2)? 2:(/
tp(a,D3DFVF_XYZB3)? 3:(/
tp(a,D3DFVF_XYZB4)? 4:(/
tp(a,D3DFVF_XYZB5)? 5:0)))))

template <bool b,int i>struct b_t;
template <int i>struct b_t<false,i>{};
template <>struct b_t<true,1>{
union{
float b;
DWORD i;
};
};
template <>struct b_t<true,2>{
union{
float b[2];
DWORD i[2];
};
};
template <>struct b_t<true,3>{
union{
float b[3];
DWORD i[3];
};
};
template <>struct b_t<true,4>{
union{
float b[4];
DWORD i[4];
};
};
template <>struct b_t<true,5>{
union{
float b[5];
DWORD i[5];
};
};

//--------------TEX-----------
#define TEXn(a) ((a&D3DFVF_TEXCOUNT_MASK)>>D3DFVF_TEXCOUNT_SHIFT)
#define _D3DFVF_TEXFMT(a,l) ((a>>(l*2+16))&3)
#define TEX_CORDn(a,l) ((_D3DFVF_TEXFMT(a,l)==D3DFVF_TEXTUREFORMAT1) ?1:(/
(_D3DFVF_TEXFMT(a,l)==D3DFVF_TEXTUREFORMAT2) ?2:(/
(_D3DFVF_TEXFMT(a,l)==D3DFVF_TEXTUREFORMAT3) ?3:4)))

#define DECL_TEXCORD_T(N) /
template <bool b,int n>struct texcord ## N ##_t;/
template <int n>struct texcord##N##_t<false,n>{};/
template <>struct texcord##N##_t<true,1>{/
float tu##N;/
};/
template <>struct texcord##N##_t<true,2>{/
float tu##N;/
float tv##N;/
};/
template <>struct texcord##N##_t<true,3>{/
float tu##N;/
float tv##N;/
float ta##N;/
};/
template <>struct texcord##N##_t<true,4>{/
float tu##N;/
float tv##N;/
float ta##N;/
float tb##N;/
};

DECL_TEXCORD_T(0)
DECL_TEXCORD_T(1)
DECL_TEXCORD_T(2)
DECL_TEXCORD_T(3)
DECL_TEXCORD_T(4)
DECL_TEXCORD_T(5)
DECL_TEXCORD_T(6)
DECL_TEXCORD_T(7)
template <const DWORD flag>
struct tex_t: public texcord0_t<(TEXn(flag)>0),TEX_CORDn(flag,0)>,
public texcord1_t<(TEXn(flag)>1),TEX_CORDn(flag,1)>,
public texcord2_t<(TEXn(flag)>2),TEX_CORDn(flag,2)>,
public texcord3_t<(TEXn(flag)>3),TEX_CORDn(flag,3)>,
public texcord4_t<(TEXn(flag)>4),TEX_CORDn(flag,4)>,
public texcord5_t<(TEXn(flag)>5),TEX_CORDn(flag,5)>,
public texcord6_t<(TEXn(flag)>6),TEX_CORDn(flag,6)>,
public texcord7_t<(TEXn(flag)>7),TEX_CORDn(flag,7)>
{

};

};//end of _D3DFvf

template <const DWORD Flags>
struct D3DFvf: public _D3DFvf::pos_t<TestMask(Flags,D3DFVF_POSITION_MASK)>,
public _D3DFvf::rhw_t<tp(Flags,D3DFVF_XYZRHW)>,
public _D3DFvf::w_t<tp(Flags,D3DFVF_XYZW)>,
public _D3DFvf::b_t<IsXYZBn(Flags),XYZBn(Flags)>,
public _D3DFvf::n_t<TestMask(Flags,D3DFVF_NORMAL)>,
public _D3DFvf::psize_t<TestMask(Flags,D3DFVF_PSIZE)>,
public _D3DFvf::diff_t<TestMask(Flags,D3DFVF_DIFFUSE)>,
public _D3DFvf::spec_t<TestMask(Flags,D3DFVF_SPECULAR)>,
public _D3DFvf::tex_t<Flags>



{

};
#undef TestFlag
#undef TestMask
#undef tp
#undef XYZBn
#undef IsXYZBn
#undef TEXn
#undef _D3DFVF_TEXFMT
#undef TEX_CORDn
#undef DECL_TEXCORD_T

#endif

 

读书笔记_数据结构-使用C++语言描述(第2版)

第一章    基础知识 数据:计算机加工处理的对象,分为数值数据和非数值数据。 数据结构的设计过程分为抽象层(数据的逻辑结构及运算)、数据结构层、实现层。 数据的逻辑结构:集合结构、线性结构、树...
  • morefans
  • morefans
  • 2016年09月11日 00:28
  • 1196

数据结构与算法分析 c++描述 读书笔记(1)

开卷有益,多多益善。由于过年期间学习了下python,再加上之后又在看图像处理和机器学习的东西,c++几乎荒废了,所以抽空就拜读下这本经典的书。网上找的书皮: 把博客当读书笔记了,不然曾经写的好几本的...
  • y277an
  • y277an
  • 2016年04月28日 19:33
  • 397

【directX 3D游戏开发】DirectX 中的空间坐标和灵活顶点格式使用

在DirectX 中,坐标系主要分为三种,分别是:自身坐标系,世界坐标系,和摄像机坐标系              自身坐标系:一般情况下,游戏角色的自身坐标系的原点一般在两脚之间,自身坐标系的作用是...
  • shangdi712
  • shangdi712
  • 2015年09月11日 10:58
  • 456

VC++ .Net 实例学习

VC++.NET中添加由C#编译的DLL引用的方法 http://blog.csdn.net/much0726/article/details/4986627 关于VC.NET的资料网络上...
  • bcbobo21cn
  • bcbobo21cn
  • 2017年06月18日 16:55
  • 775

PostScript 打印描述语言 介绍

PS(PostScript)格式文件 PS格式文件是使用的PS页面描述语言编写的文件。该语言是一种基于堆栈的解释型语言,已由支持Macintosh机器输出激光打印的Leve 1 发展到现在支持多种...
  • changyanmanman
  • changyanmanman
  • 2014年04月14日 21:33
  • 2128

所有顶点对之间的最短路径

求所有顶点对之间的最短路径的显而易见的方法是,每次以一个顶点为源点重复执行dijkstra算法n次来求得,总的执行时间为O(n^3). 下面介绍的是费罗伊德提出的另一个算法。该算法也是用邻接矩阵a表...
  • z690933166
  • z690933166
  • 2013年02月10日 22:33
  • 1250

读书笔记--灵活顶点格式

在计算机所能描绘的3D世界中,任何物体都是由多边形构成,它可以是三角形,也可以是四边形。所有的物体模型都是通过多边形网格逼近表示,因此这些多边形网格是构成物体模型的基本单元。   由于三角形是最简单的...
  • u013624649
  • u013624649
  • 2014年03月09日 11:29
  • 439

JSON结构描述

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Lan...
  • u011641885
  • u011641885
  • 2015年07月04日 09:43
  • 1058

OpenGL系列教程之八:OpenGL顶点缓冲区对象(VBO)

相关主题:顶点数组,显示列表,像素缓冲区对象 下载:vbo.zip, vboSimple.zip 创建VBO绘制VBO更新VBO例子 GL_ARB_vertex_buff...
  • wozhengtao
  • wozhengtao
  • 2016年09月26日 17:10
  • 284

树的最小顶点覆盖

最小顶点覆盖问题是算法设计中一个非常著名的NP完全问题,下面给出顶点覆盖问题的描述:   给定一个无向图:G=(V, E)和一个正整数k,判定是否存在一个顶点子集,其中=k,使得对于任意有u∈V'...
  • XuanZuoNuo
  • XuanZuoNuo
  • 2013年08月26日 12:58
  • 1406
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:D3dFvf顶点格式的C++描述(vc.net版)
举报原因:
原因补充:

(最多只允许输入30个字)