#include <irrlicht.h>
/*
在鬼火引擎中,每个事物都可以在命名空间irr中找到。
所以如果你希望使用引擎中的一些类,你需要添加irr::在类名前。
比如使用IrrlichtDevice需要写irr::IrrlichtDevice。
为了摆脱总写irr::的麻烦,我们告诉编译器我们使用命名空间。
*/
using namespace irr;
/*
在鬼火引擎中还有五个子命名空间。
你可以在'Namespace List'找到详细介绍或着使用http://irrlicht.sourceforge.net/docu/namespaces.html
就像irr命名空间一样,我们不希望总输入这5个子命名空间。
我们也同样告诉编译器使用这些命名空间。
*/
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;
/*
为了可以使用Irrlicht.DLL 文件,我们需要链接到Irrlicht.lib去。
我们可以在项目的选项中设置这些,但为了简单我们在这里表示链接库。
*/
#ifdef _IRR_WINDOWS_
#pragma comment(lib, "Irrlicht.lib")
#endif
/*
这是主函数。我们可以在所有平台用int main()。
在windows平台的话,如果想摆脱操作台,我们还可以用winmain函数。
但是为了让这个函数尽量简单,我们用main函数就好了。
*/
int main()
{
IrrlichtDevice *device =
createDevice( video::EDT_SOFTWARE, dimension2d<s32>(640, 480), 16,
false, false, false, 0);
/*
首先建立一个设备~
device类
参数解释
1 设备类型:驱动的类型(Type of the device)
video::EDT_NULL 空驱动,用于在没有主导的情况下驱动引擎?空引擎可以载入材质,但不能渲染和显示任何图形。
->video::EDT_SOFTWARE 鬼火引擎软件渲染,跨平台,跨硬件。仅用于2d制图,可运行简单的3d函数。这些3d函数运行速度快但不准确,甚至不支持贴图。
video::EDT_BURNINGSVIDEO 燃烧软件渲染,两个可用于替换鬼火渲染的软件之一。基本上,可以看做是鬼火软件的加速渲染(?)
它将3d几何形状完全栅格化,可是准确的显示纹理剪切和透视及色彩映射,提供子纹理像素纠正及子纹理元素纠正。
并且,它提供双线性的纹理过滤和比EDT_SOFTWARE更多的材质驱动。
---本渲染器完全由Thomas Alten完成,3Q a lot~
video::EDT_DIRECT3D8 Direct3D 8设备,只在Win32平台有效。可实现3d或2d图元的硬件加速渲染。
video::EDT_DIRECT3D9 Direct3D 9设备,只在Win32平台有效。可实现3d或2d图元的硬件加速渲染。
video::EDT_OPENGL. OpenGL设备,在大多数平台上有效。可实现3d或2d图元的硬件加速渲染。
2 窗口尺寸:窗口大小或显示方式(全屏模式)。
3 位:全屏模式下是指每像素所占位数,窗口模式下忽略。
4 全屏:设为真则全屏,否则为窗口模式。
5 模板缓冲:设定模板缓冲是否激活。设为真时,引擎则绘制模板缓冲阴影。注明:并非所有设备都支持模板缓冲。如果不支持,则不绘出阴影。
6 垂直同步:指定垂直的同步。设为真,则设备将等待垂直回扫的周期结束,否则不。
7 接收器:是个用户事件接收器。
7 sdk_version_do_not_use:不要使用或更换这个参数的值。失效时总设为IRRLICHT_SDK_VERSION。用于sdk版本检验。
水平同步VS垂直同步(转自http://cs.uuu9.com/200802/104276.shtml)
垂直和水平是CRT中两个基本的同步信号,水平同步信号决定了CRT画出一条横越屏幕线的时间。
垂直同步信号决定了CRT从屏幕顶部画到底部,再返回原始位置的时间,而恰恰是垂直同步代表着CRT显示器的刷新率水平!
如果需要使用更多参数,可以使用createDeviceEx()
*/
device->setWindowCaption(L"~( ̄▽ ̄)~");
/*设置窗口标题,作为device类的函数出现*/
/*
分别获得视频驱动、场景管理器和图形用户界面环境的指针个一头~
方便下面写程序
get*作为device类的函数出现
分别获得指向另三个类的指针
*/
IVideoDriver* driver = device->getVideoDriver();//获得视频驱动指针
ISceneManager* smgr = device->getSceneManager();//获得场景管理器指针
IGUIEnvironment* guienv = device->getGUIEnvironment();//获得gui环境指针
guienv->addStaticText(L"When you eat grape,you don't spew the tegument;when you don't eat, you do it!",
rect<s32>(10,10,200,50),true,true,0,-1,1);
/*
我们用上面这个gui环境的指针可以在这里加上一些话~
纯虚函数
参数解释:
1 文本:希望显示的文本。在创建够可通过SetText()修改。
2 矩形:静态文本的位置。
read after me ~ left left ~ top ~ top ~ width width ~ height height ~
3 边框:设为真则文本有3d边框。(默认false)
4 整字换行:设置文本是够换行。(默认true)
5 父元素:这个参数是一个元素的父元素。(默认为0)比如说一个window,设为0的话就是直接把fader(照明减弱控制器?)放到环境中。
6 id号:用于识别静态文本元素。(默认为-1)(s32)
7 背景填充色:设定是否背景被填充。(默认不填)
*/
/*
为了显示一些有趣的东西,我们载入一个Quake 2模型并显示它。
我们只需要通过getMesh()这个函数从场景管理器中获取它,然后用addAnimatedMeshSceneNode()曾加一个场景节点并显示这个网格。
也可以载入maya文件(.obj)、一个完整的Quake3地图(.bsp)或者Milshape文件(.ms3d)。
------cool模型叫sydney由Brian Collins提供
*/
IAnimatedMesh* mesh =smgr->getMesh("http://www.cnblogs.com/media/sydney.md2");
//----------test
IAnimatedMesh* mesh1 = smgr->getMesh("1.obj");
IAnimatedMeshSceneNode* node1 = smgr->addAnimatedMeshSceneNode(mesh1,0,-2,vector3df(20,0,0),vector3df(0, 0,0),vector3df(0.1f,0.1f,0.1f));
if(node1)
{
node1->setMaterialFlag(EMF_LIGHTING, false);
node1->setMD2Animation ( scene::EMAT_STAND );
node1->setMaterialTexture( 0, driver->getTexture("1.jpg") );
}
//~( ̄▽ ̄)~
//----------test end
IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode(mesh,0,-1,vector3df(0,0,0),vector3df(0,0,0),vector3df(1,1,1));
/*
纯虚函数
参数解释:
1 网格:载入要显示的动态网格的指针。
2 父元素:场景的父元素。若没有可为空。(默认为0)
3 id号:节点的id号。可用于识别场景节点的id号。(默认为-1)
4 位置:节点应该放置于相对于其父元素的位置。 (默认为vector3df(0, 0, 0))
5 旋转:场景节点初始时是否旋转。(默认为vector3df(0, 0, 0))
6 缩放:场景节点的初始缩放值。(默认为(1, 1, 1),(1.5f,1.5f,1.5f))
7 无指针时显示:没有指针载入时加入场景此节点。(默认为false)
*/
/*
为了让网格好看一点,我们改变一点它的材质。
我们目前不能使用灯光,因为我们没有动态灯在这个场景中,而且网格是全黑的。
然后我们设置帧循环,那样这个动画就可以izai0到310帧间不断循环。
最后我们给这个网格加上一个材质。
如果不加的话,网格将会显示成一个颜色
*/
if (node)
{
node->setMaterialFlag(EMF_LIGHTING, false);
/*
参数解释
1 标志位:设置所有材质的标志位。
----------------------------------暂略翻译
EMF_WIREFRAME 显示二维线框或填充三角形。(默认为false)
EMF_POINTCLOUD 显示为点云或填充三角形。(默认为false)
EMF_GOURAUD_SHADING 平面或哥罗德阴影 。(默认为true)
-> EMF_LIGHTING 这个材质是否被照亮。(默认为true)
EMF_ZBUFFER z深度是否可用。(默认为true)
EMF_ZWRITE_ENABLE z深度是可写或只读。(默认为true。若有透明材质,此参数可忽视。)
EMF_BACK_FACE_CULLING backfaceculling是否可用。(默认true)backfaceculling背面可见?
EMF_BILINEAR_FILTER 双线形过滤是否可用。(默认为true)
EMF_TRILINEAR_FILTER 三线形过滤是否可用。(默认为false,如果三线形过滤可用,双线性过滤可忽视。)
EMF_ANISOTROPIC_FILTER 各向异性过滤是否可用。(默认为false,在鬼火中各向异性可与双、三线形过滤一起使用以改善渲染质量。
若选择此参数,基元较不容易模糊。)
EMF_FOG_ENABLE 雾化是否可用。(默认为false)
EMF_NORMALIZE_NORMALS 标准化平均量。
如果你需要缩放一个动态的发光模型(lighted model?),你可以激活它。
通常,他的平均量将会缩放比较过度导致较暗。
如果你激活这个参数,平均量将会重新正常化,模型亮度看起来也会比较正常。
EMF_TEXTURE_WRAP 获得每一层的材质包设置。重写各层的设置。(⊙_⊙?)
EMF_MATERIAL_FLAG_COUNT 这不是一个标志,而是一个值,指出有几个标志。
----------------------怎么设置多个?
2 新值:更换所有材质的新值。
*/
node->setMD2Animation ( scene::EMAT_STAND );
/*
纯虚函数
参数可以设置为很多预置动画也可以自定义,此处为预设动画。
setMD2Animation ( const c8 * animationName)自定义
setMD2Animation ( EMD2_ANIMATION_TYPE anim)预设
EMAT_STAND、EMAT_RUN、EMAT_ATTACK、EMAT_PAIN_A、EMAT_PAIN_B、EMAT_PAIN_C、EMAT_JUMP、EMAT_FLIP、EMAT_SALUTE、EMAT_FALLBACK、
EMAT_WAVE、EMAT_POINT、EMAT_CROUCH_STAND、EMAT_CROUCH_WALK、EMAT_CROUCH_ATTACK、EMAT_CROUCH_PAIN、EMAT_CROUCH_DEATH、EMAT_DEATH_FALLBACK、
EMAT_DEATH_FALLFORWARD、EMAT_DEATH_FALLBACKSLOW、EMAT_BOOM、EMAT_COUNT(不是动画,而是动画类型的数量)
----------------------怎么设置多个?
*/
node->setMaterialTexture( 0, driver->getTexture("http://www.cnblogs.com/media/sydney.bmp") );
/*
参数解释:
1 材质层:0=<材质应该放在底基层<=MATERIAL_MAX_TEXTURES.
2 材质:所用的材质
*/
}
/*
为了可以看到网格,我们在3d空间里放置一个摄像机在(0, 30, -40)的位置。
摄像机从那儿看向(0,5,0)。
*/
smgr->addCameraSceneNode(0, vector3df(0,30,-40),vector3df(0,5,0));
/*
参数解释:
1 位置:摄像机所在的空间中所应该放置的相对于其父节点的位置。
2 看向:摄像机应该看相的位置。也叫目标。
3 父节点:摄像机的父场景节点。可以为空。父节点移动时,摄像机跟随移动。
4 id号:摄像机的id号。可用于设别摄像机。
-----------父节点id号为什么不能设为-1?
*/
/*
好了,现在我们建立起了这个场景,让我们来绘出所有东西。
我们在一个while循环中启用设备,知道设备不想绘出东西。
这应该是用户关闭窗口或者按下了ALT+F4。
*/
while(device->run())
{
/*
所有东西的绘制都在beginScene()和endScene()的调用之间。
beginScene用一种颜色清除屏幕上的颜色和深度(如果需要的话)。
然后我们让场景管理器和gui环境绘制他们所含有的。
用endScene来将所有东西呈现到屏幕上。
*/
driver->beginScene(true, true, SColor(255,100,101,140));
/*
纯虚函数
参数解释:
1 后备缓冲:指定是否后备缓冲应该被清空,这就意味着指定屏幕将被单色填充。
如果参数为空,则后备缓冲不清空,此时颜色参数可忽视。
2 z缓冲:指定深度缓冲是否被清空。如果只是2d绘制的话就没有必要清空z缓冲。
3 颜色:用于清除缓冲的颜色。
*/
smgr->drawAll();
guienv->drawAll();
driver->endScene();
}
/*
结束后我们要删除我们之前建立的鬼火设备,之后才可以再次建立设备。
在鬼火引擎中你可以删除任何你用(以create开头的)类函数或函数建立对象,仅需要使用函数->drop()。
可以在下面这个网站查看资料以获取更多信息
http://irrlicht.sourceforge.net//docu/classirr_1_1IUnknown.html#a3
*/
device->drop();
return 0;
}