ogre 单个星光

//还演示了如何使用上的广告牌
#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);
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值