axmol/tests/cpp-tests/Classes/LightTest/LightTest.cpp

362 lines
11 KiB
C++
Raw Normal View History

2014-09-17 14:26:57 +08:00
#include "LightTest.h"
2014-08-17 21:33:33 +08:00
static int sceneIdx = -1;
static std::function<Layer*()> createFunctions[] =
{
2014-09-17 14:26:57 +08:00
CL(LightTest)
2014-08-17 21:33:33 +08:00
};
#define MAX_LAYER (sizeof(createFunctions) / sizeof(createFunctions[0]))
static Layer* nextSpriteTestAction()
{
sceneIdx++;
sceneIdx = sceneIdx % MAX_LAYER;
2014-08-17 21:33:33 +08:00
auto layer = (createFunctions[sceneIdx])();
return layer;
2014-08-17 21:33:33 +08:00
}
static Layer* backSpriteTestAction()
{
sceneIdx--;
int total = MAX_LAYER;
if( sceneIdx < 0 )
sceneIdx += total;
2014-08-17 21:33:33 +08:00
auto layer = (createFunctions[sceneIdx])();
return layer;
2014-08-17 21:33:33 +08:00
}
static Layer* restartSpriteTestAction()
{
auto layer = (createFunctions[sceneIdx])();
return layer;
2014-08-17 21:33:33 +08:00
}
2014-09-17 14:26:57 +08:00
LightTest::LightTest()
: _directionalLight(nullptr)
2014-08-20 16:43:01 +08:00
, _pointLight(nullptr)
, _spotLight(nullptr)
2014-08-17 21:33:33 +08:00
{
addSprite();
addLights();
scheduleUpdate();
auto s = Director::getInstance()->getWinSize();
auto camera = Camera::createPerspective(60, (GLfloat)s.width/s.height, 1.0f, 1000.0f);
camera->setCameraFlag(CameraFlag::USER1);
camera->setPosition3D(Vec3(0.0, 100, 100));
camera->lookAt(Vec3(0.0, 0.0, 0.0), Vec3(0.0, 1.0, 0.0));
addChild(camera);
2014-08-20 16:41:45 +08:00
TTFConfig ttfConfig("fonts/arial.ttf", 15);
2014-09-18 16:38:35 +08:00
_ambientLightLabel = Label::createWithTTF(ttfConfig,"Ambient Light ON");
_ambientLightLabel->retain();
auto menuItem0 = MenuItemLabel::create(_ambientLightLabel, CC_CALLBACK_1(LightTest::SwitchLight,this,LightType::AMBIENT));
_directionalLightLabel = Label::createWithTTF(ttfConfig,"Directional Light OFF");
2014-08-26 09:43:11 +08:00
_directionalLightLabel->retain();
2014-09-18 16:38:35 +08:00
auto menuItem1 = MenuItemLabel::create(_directionalLightLabel, CC_CALLBACK_1(LightTest::SwitchLight,this,LightType::DIRECTIONAL));
2014-08-25 16:32:15 +08:00
_pointLightLabel = Label::createWithTTF(ttfConfig,"Point Light OFF");
2014-08-26 09:43:11 +08:00
_pointLightLabel->retain();
2014-09-18 16:38:35 +08:00
auto menuItem2 = MenuItemLabel::create(_pointLightLabel, CC_CALLBACK_1(LightTest::SwitchLight,this,LightType::POINT));
2014-08-25 16:32:15 +08:00
_spotLightLabel = Label::createWithTTF(ttfConfig,"Spot Light OFF");
2014-08-26 09:43:11 +08:00
_spotLightLabel->retain();
2014-09-18 16:38:35 +08:00
auto menuItem3 = MenuItemLabel::create(_spotLightLabel, CC_CALLBACK_1(LightTest::SwitchLight,this,LightType::SPOT));
auto menu = Menu::create(menuItem0, menuItem1,menuItem2,menuItem3,NULL);
menu->setPosition(Vec2::ZERO);
2014-09-18 16:38:35 +08:00
menuItem0->setAnchorPoint(Vec2::ANCHOR_TOP_LEFT);
menuItem0->setPosition( Vec2(VisibleRect::left().x, VisibleRect::top().y-50) );
2014-08-20 16:43:01 +08:00
menuItem1->setAnchorPoint(Vec2::ANCHOR_TOP_LEFT);
2014-09-18 16:38:35 +08:00
menuItem1->setPosition( Vec2(VisibleRect::left().x, VisibleRect::top().y-100) );
2014-08-20 16:43:01 +08:00
menuItem2->setAnchorPoint(Vec2::ANCHOR_TOP_LEFT);
2014-09-18 16:38:35 +08:00
menuItem2->setPosition( Vec2(VisibleRect::left().x, VisibleRect::top().y -150));
2014-08-20 16:43:01 +08:00
menuItem3->setAnchorPoint(Vec2::ANCHOR_TOP_LEFT);
2014-09-18 16:38:35 +08:00
menuItem3->setPosition( Vec2(VisibleRect::left().x, VisibleRect::top().y -200));
addChild(menu);
2014-08-17 21:33:33 +08:00
}
2014-09-17 14:26:57 +08:00
LightTest::~LightTest()
2014-08-17 21:33:33 +08:00
{
2014-08-26 09:43:11 +08:00
if (_spotLightLabel)
_spotLightLabel->release();
2014-08-25 16:32:15 +08:00
2014-08-26 09:43:11 +08:00
if (_pointLightLabel)
_pointLightLabel->release();
2014-08-25 16:32:15 +08:00
2014-08-26 09:43:11 +08:00
if (_directionalLightLabel)
_directionalLightLabel->release();
2014-08-25 16:32:15 +08:00
2014-09-18 16:38:35 +08:00
if (_spotLight)
_spotLight->release();
2014-08-19 15:51:30 +08:00
if (_pointLight)
_pointLight->release();
2014-08-19 15:51:30 +08:00
2014-09-18 16:38:35 +08:00
if (_directionalLight)
_directionalLight->release();
if (_ambientLight)
_ambientLight->release();
2014-08-17 21:33:33 +08:00
}
2014-09-17 14:26:57 +08:00
std::string LightTest::title() const
2014-08-17 21:33:33 +08:00
{
2014-08-19 15:51:30 +08:00
return "Light Test";
2014-08-17 21:33:33 +08:00
}
2014-09-17 14:26:57 +08:00
std::string LightTest::subtitle() const
2014-08-17 21:33:33 +08:00
{
return "";
2014-08-17 21:33:33 +08:00
}
2014-09-17 14:26:57 +08:00
void LightTest::restartCallback( Ref* sender )
2014-08-17 21:33:33 +08:00
{
auto s = new LightTestScene();
s->addChild(restartSpriteTestAction());
Director::getInstance()->replaceScene(s);
s->release();
2014-08-17 21:33:33 +08:00
}
2014-09-17 14:26:57 +08:00
void LightTest::nextCallback( Ref* sender )
2014-08-17 21:33:33 +08:00
{
auto s = new LightTestScene();
s->addChild( nextSpriteTestAction() );
Director::getInstance()->replaceScene(s);
s->release();
2014-08-17 21:33:33 +08:00
}
2014-09-17 14:26:57 +08:00
void LightTest::backCallback( Ref* sender )
2014-08-17 21:33:33 +08:00
{
auto s = new LightTestScene();
s->addChild( backSpriteTestAction() );
Director::getInstance()->replaceScene(s);
s->release();
2014-08-17 21:33:33 +08:00
}
2014-09-17 14:26:57 +08:00
void LightTest::onEnter()
2014-08-17 21:33:33 +08:00
{
BaseTest::onEnter();
}
2014-08-17 21:33:33 +08:00
2014-09-17 14:26:57 +08:00
void LightTest::onExit()
{
BaseTest::onExit();
}
2014-08-17 21:33:33 +08:00
2014-09-17 14:26:57 +08:00
void LightTest::addSprite()
2014-08-19 15:51:30 +08:00
{
auto s = Director::getInstance()->getWinSize();
2014-08-28 10:16:15 +08:00
//{
// std::string fileName = "Sprite3DTest/plane.c3b";
// auto sprite = Sprite3D::create(fileName);
// sprite->setRotation3D(Vec3(-90.0, 0.0, 0.0));
// sprite->setScale(5.0f);
// sprite->setPosition(Vec2(0.0, -50.0));
// addChild(sprite);
// sprite->setCameraMask(2);
//}
2014-08-26 09:43:11 +08:00
{
std::string fileName = "Sprite3DTest/orc.c3b";
auto sprite = Sprite3D::create(fileName);
sprite->setRotation3D(Vec3(0.0, 180.0, 0.0));
sprite->setPosition(Vec2(0.0, 0.0));
sprite->setScale(2.0);
auto sp = Sprite3D::create("Sprite3DTest/axe.c3b");
sprite->getAttachNode("Bip001 R Hand")->addChild(sp);
auto animation = Animation3D::create(fileName);
if (animation)
{
auto animate = Animate3D::create(animation);
sprite->runAction(RepeatForever::create(animate));
}
addChild(sprite);
sprite->setCameraMask(2);
}
{
std::string fileName = "Sprite3DTest/sphere.c3b";
auto sprite = Sprite3D::create(fileName);
2014-08-25 16:32:15 +08:00
sprite->setPosition(Vec2(30.0, 0.0));
addChild(sprite);
sprite->setCameraMask(2);
}
{
std::string fileName = "Sprite3DTest/sphere.c3b";
auto sprite = Sprite3D::create(fileName);
sprite->setScale(0.5f);
sprite->setPosition(Vec2(-50.0, 0.0));
addChild(sprite);
sprite->setCameraMask(2);
}
{
std::string fileName = "Sprite3DTest/sphere.c3b";
auto sprite = Sprite3D::create(fileName);
sprite->setScale(0.5f);
sprite->setPosition(Vec2(-30.0, 10.0));
addChild(sprite);
sprite->setCameraMask(2);
}
2014-08-19 15:51:30 +08:00
}
2014-09-17 14:26:57 +08:00
void LightTest::addLights()
2014-08-19 15:51:30 +08:00
{
2014-08-20 16:43:01 +08:00
auto s = Director::getInstance()->getWinSize();
2014-09-28 16:02:12 +08:00
_ambientLight = AmbientLight::create(Color3B(200, 200, 200));
2014-09-18 16:38:35 +08:00
_ambientLight->retain();
_ambientLight->setEnabled(true);
addChild(_ambientLight);
_ambientLight->setCameraMask(2);
2014-09-28 16:02:12 +08:00
_directionalLight = DirectionLight::create(Vec3(-1.0f, -1.0f, 0.0f), Color3B(200, 200, 200));
2014-08-20 16:43:01 +08:00
_directionalLight->retain();
2014-09-18 16:38:35 +08:00
_directionalLight->setEnabled(false);
2014-08-20 16:43:01 +08:00
addChild(_directionalLight);
2014-08-25 13:58:15 +08:00
_directionalLight->setCameraMask(2);
2014-09-28 16:02:12 +08:00
_pointLight = PointLight::create(Vec3(0.0f, 0.0f, 0.0f), Color3B(200, 200, 200), 10000.0f);
2014-08-20 16:43:01 +08:00
_pointLight->retain();
_pointLight->setEnabled(false);
addChild(_pointLight);
2014-08-25 13:58:15 +08:00
_pointLight->setCameraMask(2);
2014-09-28 16:02:12 +08:00
_spotLight = SpotLight::create(Vec3(-1.0f, -1.0f, 0.0f), Vec3(0.0f, 0.0f, 0.0f), Color3B(200, 200, 200), 0.0, 0.5, 10000.0f);
_spotLight->retain();
_spotLight->setEnabled(false);
addChild(_spotLight);
2014-08-25 13:58:15 +08:00
_spotLight->setCameraMask(2);
2014-09-18 16:38:35 +08:00
{
auto tintto1 = TintTo::create(4, 0, 0, 255);
auto tintto2 = TintTo::create(4, 0, 255, 0);
auto tintto3 = TintTo::create(4, 255, 0, 0);
auto tintto4 = TintTo::create(4, 255, 255, 255);
auto seq = Sequence::create(tintto1,tintto2, tintto3, tintto4, NULL);
_ambientLight->runAction(RepeatForever::create(seq));
}
2014-08-25 13:58:15 +08:00
{
auto tintto1 = TintTo::create(4, 255, 0, 0);
auto tintto2 = TintTo::create(4, 0, 255, 0);
auto tintto3 = TintTo::create(4, 0, 0, 255);
auto tintto4 = TintTo::create(4, 255, 255, 255);
auto seq = Sequence::create(tintto1,tintto2, tintto3, tintto4, NULL);
_directionalLight->runAction(RepeatForever::create(seq));
}
{
auto tintto1 = TintTo::create(4, 255, 0, 0);
auto tintto2 = TintTo::create(4, 0, 255, 0);
auto tintto3 = TintTo::create(4, 0, 0, 255);
auto tintto4 = TintTo::create(4, 255, 255, 255);
2014-08-25 16:32:15 +08:00
auto seq = Sequence::create(tintto2, tintto1, tintto3, tintto4, NULL);
2014-08-25 13:58:15 +08:00
_pointLight->runAction(RepeatForever::create(seq));
}
{
auto tintto1 = TintTo::create(4, 255, 0, 0);
auto tintto2 = TintTo::create(4, 0, 255, 0);
auto tintto3 = TintTo::create(4, 0, 0, 255);
auto tintto4 = TintTo::create(4, 255, 255, 255);
2014-08-25 16:32:15 +08:00
auto seq = Sequence::create(tintto3, tintto2, tintto1, tintto4, NULL);
2014-08-25 13:58:15 +08:00
_spotLight->runAction(RepeatForever::create(seq));
}
2014-08-19 15:51:30 +08:00
}
2014-09-17 14:26:57 +08:00
void LightTest::update( float delta )
2014-08-19 15:51:30 +08:00
{
static float angleDelta = 0.0;
2014-09-18 16:38:35 +08:00
2014-08-20 16:43:01 +08:00
if (_directionalLight)
2014-09-18 16:38:35 +08:00
{
2014-08-20 16:43:01 +08:00
_directionalLight->setRotation3D(Vec3(-45.0, -CC_RADIANS_TO_DEGREES(angleDelta), 0.0f));
2014-09-18 16:38:35 +08:00
}
2014-08-20 16:43:01 +08:00
if (_pointLight)
{
2014-08-25 16:32:15 +08:00
_pointLight->setPositionX(100.0f * cosf(angleDelta + 2.0 * delta));
2014-08-20 16:43:01 +08:00
_pointLight->setPositionY(100.0f);
2014-08-25 16:32:15 +08:00
_pointLight->setPositionZ(100.0f * sinf(angleDelta + 2.0 * delta));
2014-08-20 16:43:01 +08:00
}
if (_spotLight)
{
2014-08-25 16:32:15 +08:00
_spotLight->setPositionX(100.0f * cosf(angleDelta + 4.0 * delta));
2014-08-20 16:43:01 +08:00
_spotLight->setPositionY(100.0f);
2014-08-25 16:32:15 +08:00
_spotLight->setPositionZ(100.0f * sinf(angleDelta + 4.0 * delta));
_spotLight->setDirection(-Vec3(cosf(angleDelta + 4.0 * delta), 1.0, sinf(angleDelta + 4.0 * delta)));
2014-08-20 16:43:01 +08:00
}
2014-08-19 15:51:30 +08:00
angleDelta += delta;
2014-08-19 15:51:30 +08:00
BaseTest::update(delta);
2014-08-19 15:51:30 +08:00
}
2014-09-18 16:38:35 +08:00
void LightTest::SwitchLight( Ref* sender, LightType lightType )
2014-08-19 15:51:30 +08:00
{
switch (lightType)
{
2014-09-18 16:38:35 +08:00
case LightType::AMBIENT:
{
char str[32];
bool isON = !_ambientLight->isEnabled();
sprintf(str, "Ambient Light %s", isON == true? "ON":"OFF");
_ambientLight->setEnabled(isON);
_ambientLightLabel->setString(str);
}
break;
case LightType::DIRECTIONAL:
{
2014-08-26 09:43:11 +08:00
char str[32];
2014-09-18 16:38:35 +08:00
bool isON = !_directionalLight->isEnabled();
2014-08-26 09:43:11 +08:00
sprintf(str, "Directional Light %s", isON == true? "ON":"OFF");
2014-08-25 16:32:15 +08:00
_directionalLight->setEnabled(isON);
2014-08-26 09:43:11 +08:00
_directionalLightLabel->setString(str);
}
break;
2014-09-18 16:38:35 +08:00
case LightType::POINT:
{
2014-08-26 09:43:11 +08:00
char str[32];
2014-09-18 16:38:35 +08:00
bool isON = !_pointLight->isEnabled();
2014-08-26 09:43:11 +08:00
sprintf(str, "Point Light %s", isON == true? "ON":"OFF");
_pointLight->setEnabled(isON);
_pointLightLabel->setString(str);
}
break;
2014-09-18 16:38:35 +08:00
case LightType::SPOT:
{
2014-08-26 09:43:11 +08:00
char str[32];
2014-09-18 16:38:35 +08:00
bool isON = !_spotLight->isEnabled();
2014-08-26 09:43:11 +08:00
sprintf(str, "Spot Light %s", isON == true? "ON":"OFF");
_spotLight->setEnabled(isON);
_spotLightLabel->setString(str);
}
break;
default:
break;
}
2014-08-19 15:51:30 +08:00
}
void LightTestScene::runThisTest()
{
auto layer = nextSpriteTestAction();
addChild(layer);
2014-08-17 21:33:33 +08:00
Director::getInstance()->replaceScene(this);
2014-08-17 21:33:33 +08:00
}
LightTestScene::LightTestScene()
2014-08-17 21:33:33 +08:00
{
}