//还演示了如何使用上的广告牌
#include "ExampleApplication.h"
/** This class turns lights & billboards linked to them on & off */
//这个类是初始化灯光和广告版的值,比如颜色----是闪光器
class LightFlasher : public ControllerValue<Real> //Controller<Real>
{
protected:
Light* mLight;//类--动态光源在现场
Billboard* mBillboard;//类- 一个是一种原始的广告牌,每一帧总是面临着照相机
ColourValue mMaxColour;//类---代表颜色类,四个参数,123是红绿蓝0.0到1.0,参4是0.0到1.0从完全透明到完全全不透明
Real intensity;//float浮点值 --- 光强度 即是原来的多少倍
public:
LightFlasher(Light* light, Billboard* billboard, ColourValue maxColour)
{
mLight = light;
mBillboard = billboard;
mMaxColour = maxColour;
}
virtual Real getValue (void) const
{
return intensity;
}
virtual void setValue (Real value)
{
intensity = value;
ColourValue newColour;
// Attenuate the brightness of the light
newColour.r = mMaxColour.r * intensity;
newColour.g = mMaxColour.g * intensity;
newColour.b = mMaxColour.b * intensity;
mLight->setDiffuseColour(newColour);//设置灯光的颜色
mBillboard->setColour(newColour);//设置广告版的颜色
}
};
/** Controller function mapping waveform to light intensity */
//这个类是控制器功能映射波形,光照强度---------是为闪闪的星星写的 光源功能控制器类 基于波形预定义的控制器功能
class LightFlasherControllerFunction : public WaveformControllerFunction
{
/*ControllerFunctionRealPtr控制器功能类的构造参数是ControllerFunction类的指针,但是WaveformControllerFunction这个类又是ControllerFunction的子类,so
WaveformControllerFunction 这个类的指针 是闪光控制器类的参数,这个类有的变量--::::
默认时(WaveformType wType, Real base = 0, Real frequency = 1, Real phase = 0, Real amplitude = 1, bool deltaInput = true, Real dutyCycle = 0.5);
WaveformType mWaveType; 波类型——形状的波形
Real mBase; 基础——基值的输出从波
Real mFrequency; 频率-波的速度每秒
Real mPhase; 阶段——的偏移量开始的波,例如0.5开始到一半时波
Real mAmplitude; 振幅-尺度输出,而不是躺在[0,1]它躺在[0,1]*振幅
Real mDutyCycle; 责任周期——活跃的宽度的脉宽调制信号
*/
public://此类自己定义的类只需传参1波形,参2频率,参3开始的波值--以后可以添加自己想改的参数,把后面类的参数一起改就可以啦
LightFlasherControllerFunction(WaveformType wavetype, Real frequency, Real phase) : WaveformControllerFunction(wavetype, 0, frequency, phase, 1, true)
{
}
};
// Some global node data 一些 全局 节点 数据
SceneNode* mRedYellowLightsNode;//为 绑定星星 即光源和广告牌 定义的
SceneNode* mGreenBlueLightsNode;//为 绑定星星 即光源和广告牌 定义的
std::vector<AnimationState*> mAnimStateList;//为 存储动画状态 定义的
//使用他的类可以容纳这个类的实例来存储任何动画的状态.他们其
// Listener class for frame updates 帧更新 侦听器类
class LightingListener : public ExampleFrameListener
{
protected:
public:
friend class LightingApplication ;
LightingListener(RenderWindow* win, Camera* cam)
: ExampleFrameListener(win, cam)
{
}
bool frameRenderingQueued(const FrameEvent& evt)
{
if( ExampleFrameListener::frameRenderingQueued(evt) == false )
return false;
std::vector<AnimationState*>::iterator animi;
for (animi = mAnimStateList.begin(); animi != mAnimStateList.end(); ++animi)
{//修改时间的位置,调整为动画长度,这个方法循环的边缘的如果动画循环是启用的。
(*animi)->addTime(evt.timeSinceLastFrame);//timeSinceLastEvent
}
return true;
}
LightingApplication* mLightingApplication;
void getThis(LightingApplication* aa)
{
mLightingApplication = aa;
}
bool processUnbufferedKeyInput(const FrameEvent& evt);//这个函数是继承的,对星光的控制,键盘鼠标的响应---自己写
};
/** Application class */
class LightingApplication : public ExampleApplication
{
protected:
// The set of all the billboards used for the lights
// 2 sets because we'll rotate them differently
BillboardSet* mRedYellowLights;//广告牌集合类
BillboardSet* mGreenBlueLights;
// Billboards---广告牌--也是类
Billboard* mRedLightBoard; //这四个存放星星的
// Lights--灯光 类
Light* mRedLight;
// Light flashers 光 闪光器
ControllerValueRealPtr mRedLightFlasher; //ControllerValueRealPtr 是 ControllerValue的重命名也就是自己定义的类LightFlasher的父类
// Light controller functions 光源 功能控制器
ControllerFunctionRealPtr mRedLightControllerFunc;
// Light controllers 光源 控制器
Controller<Real>* mRedLightController;//对光的控制,以后就用这个指针
LightingListener* mFrameListener;//监听时要用
public:
Controller<Real>* getmRedLightController()
{
return mRedLightController;
}
protected:
void createFrameListener(void)
{
// This is where we instantiate our own frame listener
mFrameListener= new LightingListener(mWindow, mCamera);
mRoot->addFrameListener(mFrameListener);
mFrameListener->getThis(this);//把当前类的指针传给别的类,这样别的类就可以用当前类的公有成员了
}
void createScene(void)
{
// Set a very low level of ambient lighting
mSceneMgr->setAmbientLight(ColourValue(0.1, 0.1, 0.1));
// Use the "Space" skybox
mSceneMgr->setSkyBox(true, "Examples/SpaceSkyBox");
// Load ogre head
Entity* head = mSceneMgr->createEntity("head", "ogrehead.mesh");
// Attach the head to the scene //绑定头
mSceneMgr->getRootSceneNode()->createChildSceneNode(Vector3(0,0,-50))->attachObject(head);
//从此到setupTrailLights()这个函数之前的都可以注释掉------是对四颗星星的操作---
// Create nodes for the lights to be rotated with 创建节点的灯光与旋转
mRedYellowLightsNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();//给全局节点指针赋值
mGreenBlueLightsNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();
//mGreenBlueLightsNode->setPosition(Vector3(100,0,-50));
// First create the BillboardSets. This will define the materials for the billboards
// in its set to use
//首先创建BillboardSets广告牌集合。 这将定义材料在其设置为使用的广告牌
mRedYellowLights = mSceneMgr->createBillboardSet("RedYellowLights");//创建广告牌集合
mRedYellowLights->setMaterialName("Examples/Flare");//设置材质
mRedYellowLightsNode->attachObject(mRedYellowLights);//全局节点指针 绑定 广告牌集合
mGreenBlueLights = mSceneMgr->createBillboardSet("GreenBlueLights");
mGreenBlueLights->setMaterialName("Examples/Flare");
mGreenBlueLightsNode->attachObject(mGreenBlueLights);
// Red light billboard, in "off" state -- 红灯广告牌,在“关闭”状态
Vector3 redLightPosition(78, -8, -70);
mRedLightBoard = mRedYellowLights->createBillboard(redLightPosition);//创建广告牌
mRedLightBoard->setColour(ColourValue::Black); //广告牌颜色
// Red light, in "off" state
mRedLight = mSceneMgr->createLight("RedFlyingLight");//光源的名字
mRedLight->setType(Light::LT_POINT);// 点光源--光源类型
mRedLight->setPosition(redLightPosition);//设置光源的位置---和红色广告牌位置一起
mRedLight->setDiffuseColour(ColourValue::Black);//设置光源的颜色
mRedYellowLightsNode->attachObject(mRedLight);//全局节点指针 绑定 光源
// Light flashers 创建闪光器,构造函数的 参数1灯光类的指针,参数2是广告牌类的指针,参数3是颜色。
mRedLightFlasher = ControllerValueRealPtr(
new LightFlasher(mRedLight, mRedLightBoard, ColourValue::Red));//LightFlasher是自己写的类
//mRedLightFlasher->setValue(1000);//改变强度,要自己写内容,
// Light controller functions 创建 光源功能控制器 也是一个类,参数1是 波形,参2频率,参3开始的波值-
mRedLightControllerFunc = ControllerFunctionRealPtr(
new LightFlasherControllerFunction(Ogre::WFT_SINE, 0.5, 0.0));
//红 WFT_SINE 是 标准正弦波顺利的从低到高的变化然后再返回。
//绿 WFT_TRIANGLE 尖尖的山峰
//黄 WFT_SQUARE 是一半时间最小,一半时间最大
//蓝 WFT_INVERSE_SAWTOOTH 是稳定渐渐增大,瞬间结束
//还有一种是 WFT_PWM 是脉冲宽度调制 有责任周期为50%(0.5)能产生相同的输出,WFT_SQUARE。
// Light controllers //光源控制器 的创建
// ControllerManager管理控制器类来实例 ,//这类负责监视所有的控制器实例注册//当请求和更新它们。它还提供了一些便利的方法
//用于创建常用的控制器(如纹理动画师)。
ControllerManager* mControllerManager = &ControllerManager::getSingleton();//获得 管理控制器
//光源控制器 mRedLightController = 管理控制器-> 创建一个新的控制器和注册它跟经理。(参1子控制器,参2闪光器,参3光源功能控制器)
mRedLightController = mControllerManager->createController(mControllerManager->getFrameTimeSource(), mRedLightFlasher, mRedLightControllerFunc);
}
};