2015-05-06 04:07:32 +08:00
|
|
|
/****************************************************************************
|
|
|
|
Copyright (c) 2012 cocos2d-x.org
|
2018-01-29 16:25:32 +08:00
|
|
|
Copyright (c) 2013-2016 Chukong Technologies Inc.
|
|
|
|
Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd.
|
2015-05-06 04:07:32 +08:00
|
|
|
|
|
|
|
http://www.cocos2d-x.org
|
|
|
|
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
|
|
of this software and associated documentation files (the "Software"), to deal
|
|
|
|
in the Software without restriction, including without limitation the rights
|
|
|
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
|
|
copies of the Software, and to permit persons to whom the Software is
|
|
|
|
furnished to do so, subject to the following conditions:
|
|
|
|
|
|
|
|
The above copyright notice and this permission notice shall be included in
|
|
|
|
all copies or substantial portions of the Software.
|
|
|
|
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
|
|
THE SOFTWARE.
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
#include "MaterialSystemTest.h"
|
2015-05-15 08:24:27 +08:00
|
|
|
|
|
|
|
#include <ctime>
|
2015-06-13 07:47:08 +08:00
|
|
|
#include <spine/spine-cocos2dx.h>
|
2015-05-15 08:24:27 +08:00
|
|
|
|
2015-05-06 04:07:32 +08:00
|
|
|
#include "../testResource.h"
|
|
|
|
#include "cocos2d.h"
|
2015-08-10 15:51:26 +08:00
|
|
|
#include "ui/CocosGUI.h"
|
2015-05-06 04:07:32 +08:00
|
|
|
|
|
|
|
USING_NS_CC;
|
|
|
|
|
2015-05-14 08:39:39 +08:00
|
|
|
static void printProperties(Properties* properties, int indent);
|
2015-05-06 06:59:41 +08:00
|
|
|
|
2015-05-06 04:07:32 +08:00
|
|
|
|
2015-05-12 12:31:33 +08:00
|
|
|
// MARK: Tests
|
2015-05-06 04:07:32 +08:00
|
|
|
|
2015-05-12 12:31:33 +08:00
|
|
|
MaterialSystemTest::MaterialSystemTest()
|
2015-05-06 04:07:32 +08:00
|
|
|
{
|
2015-05-12 12:31:33 +08:00
|
|
|
ADD_TEST_CASE(Material_2DEffects);
|
2019-03-15 14:11:50 +08:00
|
|
|
ADD_TEST_CASE(Material_AutoBindings);
|
2015-05-14 08:39:39 +08:00
|
|
|
ADD_TEST_CASE(Material_setTechnique);
|
|
|
|
ADD_TEST_CASE(Material_clone);
|
2015-05-12 12:31:33 +08:00
|
|
|
ADD_TEST_CASE(Material_MultipleSprite3D);
|
|
|
|
ADD_TEST_CASE(Material_Sprite3DTest);
|
2015-05-15 08:24:27 +08:00
|
|
|
ADD_TEST_CASE(Material_parsePerformance);
|
2015-05-06 04:07:32 +08:00
|
|
|
}
|
|
|
|
|
2015-05-12 12:31:33 +08:00
|
|
|
std::string MaterialSystemBaseTest::title() const
|
2015-05-06 04:07:32 +08:00
|
|
|
{
|
2015-05-12 12:31:33 +08:00
|
|
|
return "Material System";
|
2015-05-06 04:07:32 +08:00
|
|
|
}
|
|
|
|
|
2015-05-12 12:31:33 +08:00
|
|
|
// MARK: Tests start here
|
2015-05-06 04:07:32 +08:00
|
|
|
|
|
|
|
void Material_Sprite3DTest::onEnter()
|
|
|
|
{
|
|
|
|
MaterialSystemBaseTest::onEnter();
|
|
|
|
|
|
|
|
auto sprite = Sprite3D::create("Sprite3DTest/boss1.obj");
|
|
|
|
sprite->setScale(8.f);
|
|
|
|
sprite->setTexture("Sprite3DTest/boss.png");
|
|
|
|
this->addChild(sprite);
|
2016-10-27 09:45:40 +08:00
|
|
|
sprite->setPositionNormalized(Vec2(0.5,0.5));
|
2015-05-06 04:07:32 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
std::string Material_Sprite3DTest::subtitle() const
|
|
|
|
{
|
|
|
|
return "Material System on Sprite3D";
|
|
|
|
}
|
|
|
|
|
|
|
|
void Material_MultipleSprite3D::onEnter()
|
|
|
|
{
|
|
|
|
MaterialSystemBaseTest::onEnter();
|
|
|
|
|
|
|
|
const char* names[] = {
|
|
|
|
"Sprite3DTest/ReskinGirl.c3b",
|
|
|
|
"Sprite3DTest/ReskinGirl.c3b",
|
|
|
|
"Sprite3DTest/ReskinGirl.c3b",
|
|
|
|
"Sprite3DTest/ReskinGirl.c3b",
|
|
|
|
"Sprite3DTest/ReskinGirl.c3b",
|
|
|
|
"Sprite3DTest/ReskinGirl.c3b",
|
|
|
|
"Sprite3DTest/ReskinGirl.c3b",
|
|
|
|
"Sprite3DTest/ReskinGirl.c3b",
|
|
|
|
};
|
|
|
|
|
|
|
|
const int totalNames = sizeof(names) / sizeof(names[0]);
|
|
|
|
|
|
|
|
auto size = Director::getInstance()->getWinSize();
|
|
|
|
|
|
|
|
for(int i=0;i<totalNames;i++)
|
|
|
|
{
|
|
|
|
auto sprite = Sprite3D::create(names[i]);
|
|
|
|
this->addChild(sprite);
|
|
|
|
sprite->setPosition(Vec2((size.width/(totalNames+1))*(i+1), size.height/4));
|
|
|
|
sprite->setScale(3);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string Material_MultipleSprite3D::subtitle() const
|
|
|
|
{
|
|
|
|
return "Sprites with multiple meshes";
|
|
|
|
}
|
|
|
|
|
2015-05-12 12:31:33 +08:00
|
|
|
//
|
2015-06-03 07:56:59 +08:00
|
|
|
// MARK: Material_2DEffects
|
2015-05-12 12:31:33 +08:00
|
|
|
//
|
|
|
|
void Material_2DEffects::onEnter()
|
|
|
|
{
|
|
|
|
MaterialSystemBaseTest::onEnter();
|
|
|
|
|
2015-05-20 04:51:52 +08:00
|
|
|
auto properties = Properties::createNonRefCounted("Materials/2d_effects.material#sample");
|
2015-05-12 12:31:33 +08:00
|
|
|
|
|
|
|
// Print the properties of every namespace within this one.
|
|
|
|
printProperties(properties, 0);
|
|
|
|
|
|
|
|
Material *mat1 = Material::createWithProperties(properties);
|
|
|
|
|
|
|
|
auto spriteBlur = Sprite::create("Images/grossini.png");
|
2016-10-27 09:45:40 +08:00
|
|
|
spriteBlur->setPositionNormalized(Vec2(0.2f, 0.5f));
|
2015-05-12 12:31:33 +08:00
|
|
|
this->addChild(spriteBlur);
|
2019-03-14 13:43:40 +08:00
|
|
|
spriteBlur->setProgramState(mat1->getTechniqueByName("blur")->getPassByIndex(0)->getProgramState());
|
2015-05-12 12:31:33 +08:00
|
|
|
|
|
|
|
auto spriteOutline = Sprite::create("Images/grossini.png");
|
2016-10-27 09:45:40 +08:00
|
|
|
spriteOutline->setPositionNormalized(Vec2(0.4f, 0.5f));
|
2015-05-12 12:31:33 +08:00
|
|
|
this->addChild(spriteOutline);
|
2019-03-14 13:43:40 +08:00
|
|
|
spriteOutline->setProgramState(mat1->getTechniqueByName("outline")->getPassByIndex(0)->getProgramState());
|
2015-05-12 12:31:33 +08:00
|
|
|
|
|
|
|
auto spriteNoise = Sprite::create("Images/grossini.png");
|
2016-10-27 09:45:40 +08:00
|
|
|
spriteNoise->setPositionNormalized(Vec2(0.6f, 0.5f));
|
2015-05-12 12:31:33 +08:00
|
|
|
this->addChild(spriteNoise);
|
2019-03-14 13:43:40 +08:00
|
|
|
spriteNoise->setProgramState(mat1->getTechniqueByName("noise")->getPassByIndex(0)->getProgramState());
|
2015-05-12 12:31:33 +08:00
|
|
|
|
|
|
|
auto spriteEdgeDetect = Sprite::create("Images/grossini.png");
|
2016-10-27 09:45:40 +08:00
|
|
|
spriteEdgeDetect->setPositionNormalized(Vec2(0.8f, 0.5f));
|
2015-05-12 12:31:33 +08:00
|
|
|
this->addChild(spriteEdgeDetect);
|
2019-03-14 13:43:40 +08:00
|
|
|
spriteEdgeDetect->setProgramState(mat1->getTechniqueByName("edge_detect")->getPassByIndex(0)->getProgramState());
|
2015-05-15 08:24:27 +08:00
|
|
|
|
2019-03-15 14:11:50 +08:00
|
|
|
timeUniforms.clear();
|
|
|
|
|
2019-03-15 15:09:39 +08:00
|
|
|
#define FETCH_CCTIME_LOCATION(sprite) do { \
|
2019-03-15 14:11:50 +08:00
|
|
|
auto programState = sprite->getProgramState(); \
|
2019-03-26 13:45:03 +08:00
|
|
|
auto location = programState->getUniformLocation("u_Time"); \
|
2019-03-15 14:11:50 +08:00
|
|
|
timeUniforms.emplace_back(programState, location); \
|
|
|
|
}while(0)
|
|
|
|
|
2019-03-15 15:09:39 +08:00
|
|
|
FETCH_CCTIME_LOCATION(spriteBlur);
|
|
|
|
FETCH_CCTIME_LOCATION(spriteOutline);
|
|
|
|
FETCH_CCTIME_LOCATION(spriteNoise);
|
|
|
|
FETCH_CCTIME_LOCATION(spriteEdgeDetect);
|
2019-03-15 14:11:50 +08:00
|
|
|
|
|
|
|
schedule(CC_SCHEDULE_SELECTOR(Material_2DEffects::updateCCTimeUniforms));
|
|
|
|
|
2015-05-15 08:24:27 +08:00
|
|
|
// properties is not a "Ref" object
|
|
|
|
CC_SAFE_DELETE(properties);
|
2015-05-12 12:31:33 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
std::string Material_2DEffects::subtitle() const
|
|
|
|
{
|
|
|
|
return "Testing effects on Sprite";
|
|
|
|
}
|
|
|
|
|
2019-03-15 14:11:50 +08:00
|
|
|
void Material_2DEffects::updateCCTimeUniforms(float)
|
|
|
|
{
|
|
|
|
float time = Director::getInstance()->getTotalFrames() * Director::getInstance()->getAnimationInterval();
|
|
|
|
Vec4 random(time / 10.0f, time, time * 2.0f, time * 4.0f);
|
|
|
|
for (auto &loc : timeUniforms)
|
|
|
|
{
|
|
|
|
loc.programState->setUniform(loc.location, &random, sizeof(random));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-03-14 13:43:40 +08:00
|
|
|
//
|
2019-03-15 14:11:50 +08:00
|
|
|
// MARK: Material_AutoBindings
|
2019-03-14 13:43:40 +08:00
|
|
|
//
|
2019-03-15 14:11:50 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Custom material auto-binding resolver for terrain.
|
|
|
|
*/
|
|
|
|
class EffectAutoBindingResolver : public backend::ProgramState::AutoBindingResolver
|
|
|
|
{
|
|
|
|
virtual bool resolveAutoBinding(backend::ProgramState* programState,/* Node* node,*/ const std::string& uniform, const std::string& autoBinding) override;
|
|
|
|
|
|
|
|
void callbackRadius(backend::ProgramState* programState, backend::UniformLocation uniform);
|
|
|
|
void callbackColor(backend::ProgramState* programState, backend::UniformLocation uniform);
|
|
|
|
};
|
|
|
|
|
|
|
|
bool EffectAutoBindingResolver::resolveAutoBinding(backend::ProgramState* programState, /*Node* node,*/ const std::string& uniform, const std::string& autoBinding)
|
|
|
|
{
|
|
|
|
if (autoBinding.compare("DYNAMIC_RADIUS")==0)
|
|
|
|
{
|
|
|
|
auto loc = programState->getUniformLocation(uniform);
|
2019-03-15 15:09:39 +08:00
|
|
|
programState->setCallbackUniform(loc, CC_CALLBACK_2(EffectAutoBindingResolver::callbackRadius, this));
|
2019-03-15 14:11:50 +08:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
else if (autoBinding.compare("OUTLINE_COLOR")==0)
|
|
|
|
{
|
|
|
|
auto loc = programState->getUniformLocation(uniform);
|
2019-03-15 15:09:39 +08:00
|
|
|
programState->setCallbackUniform(loc, CC_CALLBACK_2(EffectAutoBindingResolver::callbackColor, this));
|
2019-03-15 14:11:50 +08:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
void EffectAutoBindingResolver::callbackRadius(backend::ProgramState *programState, backend::UniformLocation uniform)
|
|
|
|
{
|
|
|
|
float f = CCRANDOM_0_1() * 10;
|
|
|
|
programState->setUniform(uniform, &f, sizeof(f));
|
|
|
|
}
|
|
|
|
|
|
|
|
void EffectAutoBindingResolver::callbackColor(backend::ProgramState *programState, backend::UniformLocation uniform)
|
|
|
|
{
|
|
|
|
float r = CCRANDOM_0_1();
|
|
|
|
float g = CCRANDOM_0_1();
|
|
|
|
float b = CCRANDOM_0_1();
|
|
|
|
Vec3 color(r, g, b);
|
|
|
|
|
|
|
|
programState->setUniform(uniform, &color, sizeof(color));
|
|
|
|
}
|
|
|
|
|
|
|
|
Material_AutoBindings::Material_AutoBindings()
|
|
|
|
{
|
|
|
|
_resolver = new EffectAutoBindingResolver;
|
|
|
|
}
|
|
|
|
|
|
|
|
Material_AutoBindings::~Material_AutoBindings()
|
|
|
|
{
|
|
|
|
delete _resolver;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void Material_AutoBindings::onEnter()
|
|
|
|
{
|
|
|
|
MaterialSystemBaseTest::onEnter();
|
|
|
|
|
|
|
|
// auto properties = Properties::createNonRefCounted("Materials/2d_effects.material#sample");
|
|
|
|
auto properties = Properties::createNonRefCounted("Materials/auto_binding_test.material#sample");
|
|
|
|
|
|
|
|
// Print the properties of every namespace within this one.
|
|
|
|
printProperties(properties, 0);
|
|
|
|
|
|
|
|
Material *mat1 = Material::createWithProperties(properties);
|
|
|
|
|
|
|
|
auto spriteBlur = Sprite::create("Images/grossini.png");
|
|
|
|
spriteBlur->setPositionNormalized(Vec2(0.2f, 0.5f));
|
|
|
|
this->addChild(spriteBlur);
|
|
|
|
spriteBlur->setProgramState(mat1->getTechniqueByName("blur")->getPassByIndex(0)->getProgramState());
|
|
|
|
|
|
|
|
auto spriteOutline = Sprite::create("Images/grossini.png");
|
|
|
|
spriteOutline->setPositionNormalized(Vec2(0.4f, 0.5f));
|
|
|
|
this->addChild(spriteOutline);
|
|
|
|
spriteOutline->setProgramState(mat1->getTechniqueByName("outline")->getPassByIndex(0)->getProgramState());
|
|
|
|
|
|
|
|
auto spriteNoise = Sprite::create("Images/grossini.png");
|
|
|
|
spriteNoise->setPositionNormalized(Vec2(0.6f, 0.5f));
|
|
|
|
this->addChild(spriteNoise);
|
|
|
|
spriteNoise->setProgramState(mat1->getTechniqueByName("noise")->getPassByIndex(0)->getProgramState());
|
|
|
|
|
|
|
|
auto spriteEdgeDetect = Sprite::create("Images/grossini.png");
|
|
|
|
spriteEdgeDetect->setPositionNormalized(Vec2(0.8f, 0.5f));
|
|
|
|
this->addChild(spriteEdgeDetect);
|
|
|
|
spriteEdgeDetect->setProgramState(mat1->getTechniqueByName("edge_detect")->getPassByIndex(0)->getProgramState());
|
|
|
|
|
|
|
|
_noiseProgramState = spriteNoise->getProgramState();
|
2019-03-26 13:45:03 +08:00
|
|
|
_locationTime = _noiseProgramState->getUniformLocation("u_Time");
|
2019-03-15 14:11:50 +08:00
|
|
|
|
|
|
|
schedule(CC_SCHEDULE_SELECTOR(Material_AutoBindings::updateUniformTime));
|
|
|
|
// properties is not a "Ref" object
|
|
|
|
CC_SAFE_DELETE(properties);
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string Material_AutoBindings::subtitle() const
|
|
|
|
{
|
|
|
|
return "Testing auto-bindings uniforms";
|
|
|
|
}
|
|
|
|
|
|
|
|
void Material_AutoBindings::updateUniformTime(float dt)
|
|
|
|
{
|
|
|
|
float time = Director::getInstance()->getTotalFrames() * Director::getInstance()->getAnimationInterval();
|
|
|
|
Vec4 random(time / 10.0f, time, time * 2.0f, time * 4.0f);
|
|
|
|
_noiseProgramState->setUniform(_locationTime, &random, sizeof(random));
|
|
|
|
}
|
2015-06-03 07:56:59 +08:00
|
|
|
|
2015-05-12 12:31:33 +08:00
|
|
|
//
|
|
|
|
//
|
|
|
|
//
|
2015-05-14 08:39:39 +08:00
|
|
|
void Material_setTechnique::onEnter()
|
2015-05-12 12:31:33 +08:00
|
|
|
{
|
|
|
|
MaterialSystemBaseTest::onEnter();
|
|
|
|
|
|
|
|
auto sprite = Sprite3D::create("Sprite3DTest/boss1.obj");
|
2015-05-14 08:39:39 +08:00
|
|
|
sprite->setScale(6);
|
2015-05-12 12:31:33 +08:00
|
|
|
this->addChild(sprite);
|
2016-10-27 09:45:40 +08:00
|
|
|
sprite->setPositionNormalized(Vec2(0.5,0.5));
|
2015-05-12 12:31:33 +08:00
|
|
|
_sprite = sprite;
|
|
|
|
|
|
|
|
|
|
|
|
Material *mat = Material::createWithFilename("Materials/3d_effects.material");
|
|
|
|
sprite->setMaterial(mat);
|
|
|
|
|
|
|
|
// lights
|
|
|
|
auto light1 = AmbientLight::create(Color3B::RED);
|
|
|
|
addChild(light1);
|
|
|
|
|
|
|
|
auto light2 = DirectionLight::create(Vec3(-1,1,0), Color3B::GREEN);
|
|
|
|
addChild(light2);
|
|
|
|
|
2015-05-14 08:39:39 +08:00
|
|
|
this->schedule(CC_CALLBACK_1(Material_setTechnique::changeMaterial, this), 1, "cookie");
|
2015-05-12 12:31:33 +08:00
|
|
|
_techniqueState = 0;
|
2015-05-14 08:39:39 +08:00
|
|
|
|
|
|
|
auto rot = RotateBy::create(5, Vec3(30,60,270));
|
|
|
|
auto repeat = RepeatForever::create(rot);
|
|
|
|
sprite->runAction(repeat);
|
2015-05-12 12:31:33 +08:00
|
|
|
}
|
|
|
|
|
2015-05-14 08:39:39 +08:00
|
|
|
std::string Material_setTechnique::subtitle() const
|
2015-05-12 12:31:33 +08:00
|
|
|
{
|
2015-05-14 08:39:39 +08:00
|
|
|
return "Testing setTechnique()";
|
2015-05-12 12:31:33 +08:00
|
|
|
}
|
|
|
|
|
2015-05-14 08:39:39 +08:00
|
|
|
void Material_setTechnique::changeMaterial(float dt)
|
2015-05-12 12:31:33 +08:00
|
|
|
{
|
|
|
|
// get it from Mesh 0
|
|
|
|
switch (_techniqueState)
|
|
|
|
{
|
|
|
|
case 0:
|
|
|
|
_sprite->getMaterial(0)->setTechnique("lit");
|
|
|
|
break;
|
|
|
|
case 1:
|
2015-05-14 08:39:39 +08:00
|
|
|
_sprite->getMaterial(0)->setTechnique("normal");
|
2015-05-12 12:31:33 +08:00
|
|
|
break;
|
2015-05-13 13:24:52 +08:00
|
|
|
case 2:
|
|
|
|
_sprite->getMaterial(0)->setTechnique("outline");
|
|
|
|
break;
|
2015-05-12 12:31:33 +08:00
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2019-03-14 13:43:40 +08:00
|
|
|
_techniqueState = (_techniqueState + 1) % 3;
|
2015-05-12 12:31:33 +08:00
|
|
|
}
|
|
|
|
|
2015-05-14 08:39:39 +08:00
|
|
|
//
|
|
|
|
//
|
|
|
|
//
|
|
|
|
void Material_clone::onEnter()
|
|
|
|
{
|
|
|
|
MaterialSystemBaseTest::onEnter();
|
|
|
|
|
|
|
|
auto sprite = Sprite3D::create("Sprite3DTest/boss1.obj");
|
|
|
|
sprite->setScale(3);
|
|
|
|
this->addChild(sprite);
|
2016-10-27 09:45:40 +08:00
|
|
|
sprite->setPositionNormalized(Vec2(0.25, 0.5));
|
2015-05-14 08:39:39 +08:00
|
|
|
|
|
|
|
Material *mat = Material::createWithFilename("Materials/3d_effects.material");
|
|
|
|
sprite->setMaterial(mat);
|
|
|
|
|
|
|
|
auto rot = RotateBy::create(5, Vec3(360,240,120));
|
|
|
|
auto repeat = RepeatForever::create(rot);
|
|
|
|
sprite->runAction(repeat);
|
|
|
|
|
|
|
|
// sprite 2... using same material
|
|
|
|
auto sprite2 = Sprite3D::create("Sprite3DTest/boss1.obj");
|
|
|
|
sprite2->setScale(3);
|
|
|
|
this->addChild(sprite2);
|
2016-10-27 09:45:40 +08:00
|
|
|
sprite2->setPositionNormalized(Vec2(0.5, 0.5));
|
2019-03-14 16:22:54 +08:00
|
|
|
sprite2->setMaterial(mat);
|
2015-05-14 08:39:39 +08:00
|
|
|
sprite2->runAction(repeat->clone());
|
|
|
|
|
|
|
|
// sprite 3... using cloned material
|
|
|
|
auto sprite3 = Sprite3D::create("Sprite3DTest/boss1.obj");
|
|
|
|
sprite3->setScale(3);
|
|
|
|
this->addChild(sprite3);
|
2016-10-27 09:45:40 +08:00
|
|
|
sprite3->setPositionNormalized(Vec2(0.75, 0.5));
|
2015-05-14 08:39:39 +08:00
|
|
|
auto mat2 = mat->clone();
|
|
|
|
sprite3->setMaterial(mat2);
|
|
|
|
sprite3->runAction(repeat->clone());
|
|
|
|
|
|
|
|
// testing clone
|
|
|
|
// should affect both sprite 1 and sprite 2
|
|
|
|
mat->setTechnique("outline");
|
|
|
|
|
|
|
|
// should affect only sprite 3
|
|
|
|
// mat2->setTechnique("normal");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string Material_clone::subtitle() const
|
|
|
|
{
|
|
|
|
return "Testing material->clone()";
|
|
|
|
}
|
|
|
|
|
2015-05-15 08:24:27 +08:00
|
|
|
//
|
|
|
|
//
|
|
|
|
//
|
2015-08-10 16:12:15 +08:00
|
|
|
const int SHOW_LEBAL_TAG = 114;
|
|
|
|
|
2015-05-15 08:24:27 +08:00
|
|
|
void Material_parsePerformance::onEnter()
|
|
|
|
{
|
|
|
|
MaterialSystemBaseTest::onEnter();
|
2015-08-10 15:51:26 +08:00
|
|
|
|
2015-08-10 16:41:16 +08:00
|
|
|
_maxParsingCoumt = 5e3;
|
2015-08-10 15:51:26 +08:00
|
|
|
|
|
|
|
auto screenSize = Director::getInstance()->getWinSize();
|
|
|
|
|
|
|
|
ui::Slider* slider = ui::Slider::create();
|
|
|
|
slider->loadBarTexture("cocosui/sliderTrack.png");
|
|
|
|
slider->loadSlidBallTextures("cocosui/sliderThumb.png", "cocosui/sliderThumb.png", "");
|
|
|
|
slider->loadProgressBarTexture("cocosui/sliderProgress.png");
|
|
|
|
slider->setPercent(50);
|
|
|
|
|
|
|
|
slider->setPosition(Vec2(screenSize.width / 2.0f, screenSize.height / 3.0f));
|
|
|
|
slider->addEventListener([&](Ref* sender, ui::Slider::EventType type) {
|
|
|
|
|
2015-08-10 16:12:15 +08:00
|
|
|
if (type == ui::Slider::EventType::ON_SLIDEBALL_UP)
|
2015-08-10 15:51:26 +08:00
|
|
|
{
|
|
|
|
ui::Slider* slider = dynamic_cast<ui::Slider*>(sender);
|
|
|
|
float p = slider->getPercent() / 100.0f;
|
2015-08-10 16:12:15 +08:00
|
|
|
slider->setTouchEnabled(false);
|
2015-08-10 15:51:26 +08:00
|
|
|
CCLOG("Will parsing material %d times", (int)(p * _maxParsingCoumt));
|
2015-08-10 16:12:15 +08:00
|
|
|
Label* label = dynamic_cast<Label*>(this->getChildByTag(SHOW_LEBAL_TAG));
|
|
|
|
if(label)
|
|
|
|
{
|
|
|
|
label->setString("Testing start!");
|
|
|
|
}
|
2015-08-10 15:51:26 +08:00
|
|
|
this->scheduleOnce(
|
2015-08-10 16:12:15 +08:00
|
|
|
[this, p, slider](float)
|
2015-08-10 15:51:26 +08:00
|
|
|
{
|
|
|
|
this->parsingTesting(p * _maxParsingCoumt);
|
2015-08-10 16:12:15 +08:00
|
|
|
slider->setTouchEnabled(true);
|
2015-08-10 15:51:26 +08:00
|
|
|
},
|
|
|
|
1.0, "schedule test parsing");
|
|
|
|
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
addChild(slider);
|
|
|
|
|
2017-02-10 10:35:52 +08:00
|
|
|
auto label = Label::createWithSystemFont("Max parsing count is 10000, which may crash because of high memory consumption.", "Helvetica", 10);
|
2015-08-10 16:12:15 +08:00
|
|
|
label->setPosition(Vec2(screenSize.width / 2.0f, screenSize.height / 2.0f - 20));
|
|
|
|
addChild(label);
|
|
|
|
label = Label::createWithSystemFont("Slide to test parsing performance", "Helvetica", 10);
|
|
|
|
label->setPosition(Vec2(screenSize.width / 2.0f, screenSize.height / 2.0f));
|
|
|
|
addChild(label);
|
|
|
|
|
|
|
|
label = Label::createWithSystemFont("", "Helvetica", 10);
|
|
|
|
label->setPosition(Vec2(screenSize.width / 2.0f, screenSize.height / 2.0f + 20));
|
|
|
|
label->setTag(SHOW_LEBAL_TAG);
|
|
|
|
addChild(label);
|
2015-05-15 08:24:27 +08:00
|
|
|
|
2015-08-10 15:51:26 +08:00
|
|
|
}
|
2015-05-15 08:24:27 +08:00
|
|
|
|
2015-08-10 15:51:26 +08:00
|
|
|
void Material_parsePerformance::parsingTesting(unsigned int count)
|
|
|
|
{
|
|
|
|
std::clock_t begin = std::clock();
|
|
|
|
|
2016-04-22 11:20:05 +08:00
|
|
|
for (unsigned int i = 0; i < count; i++)
|
2015-05-15 08:24:27 +08:00
|
|
|
{
|
|
|
|
Material::createWithFilename("Materials/2d_effects.material");
|
|
|
|
Material::createWithFilename("Materials/3d_effects.material");
|
|
|
|
}
|
2015-08-10 15:51:26 +08:00
|
|
|
|
2015-05-15 08:24:27 +08:00
|
|
|
std::clock_t end = std::clock();
|
|
|
|
double elapsed_secs = double(end - begin) / CLOCKS_PER_SEC;
|
2015-08-10 16:12:15 +08:00
|
|
|
Label* label = dynamic_cast<Label*>(this->getChildByTag(SHOW_LEBAL_TAG));
|
|
|
|
if(label)
|
|
|
|
{
|
|
|
|
std::string str = StringUtils::format("Testing completed! Took: %.3f seconds for parsing material %d times.", elapsed_secs, count);
|
|
|
|
label->setString(str);
|
|
|
|
|
|
|
|
CCLOG("Took: %.3f seconds for parsing material %d times.", elapsed_secs, count);
|
|
|
|
}
|
2015-05-15 08:24:27 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
std::string Material_parsePerformance::subtitle() const
|
|
|
|
{
|
|
|
|
return "Testing parsing performance";
|
|
|
|
}
|
2015-06-16 05:12:44 +08:00
|
|
|
|
2015-05-14 08:39:39 +08:00
|
|
|
// MARK: Helper functions
|
|
|
|
|
|
|
|
static void printProperties(Properties* properties, int indent)
|
|
|
|
{
|
|
|
|
// Print the name and ID of the current namespace.
|
|
|
|
const char* spacename = properties->getNamespace();
|
|
|
|
const char* id = properties->getId();
|
|
|
|
char chindent[64];
|
|
|
|
int i=0;
|
|
|
|
for(i=0; i<indent*2;i++)
|
|
|
|
chindent[i] = ' ';
|
|
|
|
chindent[i] = '\0';
|
|
|
|
|
2015-05-15 08:24:27 +08:00
|
|
|
log("%sNamespace: %s ID: %s\n%s{", chindent, spacename, id, chindent);
|
2015-05-14 08:39:39 +08:00
|
|
|
|
|
|
|
// Print all properties in this namespace.
|
|
|
|
const char* name = properties->getNextProperty();
|
|
|
|
const char* value = NULL;
|
|
|
|
while (name != NULL)
|
|
|
|
{
|
|
|
|
value = properties->getString(name);
|
2015-05-15 08:24:27 +08:00
|
|
|
log("%s%s = %s", chindent, name, value);
|
2015-05-14 08:39:39 +08:00
|
|
|
name = properties->getNextProperty();
|
|
|
|
}
|
|
|
|
|
|
|
|
Properties* space = properties->getNextNamespace();
|
|
|
|
while (space != NULL)
|
|
|
|
{
|
|
|
|
printProperties(space, indent+1);
|
|
|
|
space = properties->getNextNamespace();
|
|
|
|
}
|
|
|
|
|
2015-05-15 08:24:27 +08:00
|
|
|
log("%s}\n",chindent);
|
2015-05-14 08:39:39 +08:00
|
|
|
}
|