16 Quake3MapShader
官方代码($sdk)\examples\16.Quake3MapShader
这个例子很像第2个官方例子,使用的场景模型也跟那例子用的。唯一的区别是,这个例子中增加了对Quake3压缩地图的场景进行更高级点的渲染,使它看起来比第2个例子更好。下面看具体代码。
#include <irrlicht.h>
#include "driverChoice.h"
//下面的宏用来定义Quake3允许载入的级别
#define IRRLICHT_QUAKE3_ARENA
//#define ORIGINAL_QUAKE3_ARENA
//#define CUSTOM_QUAKE3_ARENA
//#define SHOW_SHADER_NAME
//共有2个级别,例子里默认使用的是IRRLICHT_QUAKE3_ARENA,它是irr的Quake3渲染级别。另外一个是Quake3竞技场原始效果级别ORIGINAL_QUAKE3_ARENA。使用Quake3竞技场原始效果级别时,可以开启用户自定义效果CUSTOM_QUAKE3_ARENA宏。通过注释和取消注释来编译,可以看到不同级别的渲染效果。SHOW_SHADER_NAME宏用来开启关闭显示场景中用到的quake3 shader的名字。
//如果定义了ORIGINAL_QUAKE3_ARENA
#ifdef ORIGINAL_QUAKE3_ARENA
//定义QUAKE3_STORAGE_FORMAT宏
#define QUAKE3_STORAGE_FORMAT addFolderFileArchive
//定义QUAKE3_STORAGE_1宏
#define QUAKE3_STORAGE_1 "/baseq3/"
//如果定义了CUSTOM_QUAKE3_ARENA
#ifdef CUSTOM_QUAKE3_ARENA
//定义QUAKE3_STORAGE_2宏
#define QUAKE3_STORAGE_2 "/cf/"
//定义QUAKE3_MAP_NAME宏
#define QUAKE3_MAP_NAME "maps/cf.bsp"
#else
//定义QUAKE3_MAP_NAME宏
#define QUAKE3_MAP_NAME "maps/q3dm8.bsp"
#endif
#endif
//如果定义了IRRLICHT_QUAKE3_ARENA宏
#ifdef IRRLICHT_QUAKE3_ARENA
//定义QUAKE3_STORAGE_FORMAT宏
#define QUAKE3_STORAGE_FORMAT addFileArchive
//定义QUAKE3_STORAGE_1宏
#define QUAKE3_STORAGE_1 "../../media/map-20kdm2.pk3"
//定义QUAKE3_MAP_NAME宏
#define QUAKE3_MAP_NAME "maps/20kdm2.bsp"
#endif
using namespace irr;
using namespace scene;
#ifdef _MSC_VER
#pragma comment(lib,"Irrlicht.lib")
#endif
//截屏类。这个类继承IEventReceiver事件接收接口,用来检查用户操作按键情况,在按下F9键时进行屏幕截屏。
class CScreenShotFactory : publicIEventReceiver
{
public:
//device irr设备、templateName截屏临时名字、node场景节点(本例中没用到)
CScreenShotFactory( IrrlichtDevice *device, const c8 * templateName,ISceneNode* node )
: Device(device), Number(0), FilenameTemplate(templateName), Node(node)
{
FilenameTemplate.replace ( '/', '_' );
FilenameTemplate.replace ( '\\', '_' );
}
bool OnEvent(const SEvent& event)
{
//检查是否是键盘按下事件
if ((event.EventType ==