30#include <spine/spine-cocos2dx.h>
32#include "../testResource.h"
34#include "ui/CocosGUI.h"
43MaterialSystemTest::MaterialSystemTest()
56 return "Material System";
65 auto sprite = Sprite3D::create(
"Sprite3DTest/boss1.obj");
66 sprite->setScale(8.f);
67 sprite->setTexture(
"Sprite3DTest/boss.png");
68 this->addChild(sprite);
69 sprite->setPositionNormalized(Vec2(0.5f,0.5f));
74 return "Material System on Sprite3D";
81 const char* names[] = {
82 "Sprite3DTest/ReskinGirl.c3b",
83 "Sprite3DTest/ReskinGirl.c3b",
84 "Sprite3DTest/ReskinGirl.c3b",
85 "Sprite3DTest/ReskinGirl.c3b",
86 "Sprite3DTest/ReskinGirl.c3b",
87 "Sprite3DTest/ReskinGirl.c3b",
88 "Sprite3DTest/ReskinGirl.c3b",
89 "Sprite3DTest/ReskinGirl.c3b",
92 const int totalNames =
sizeof(names) /
sizeof(names[0]);
94 auto size = Director::getInstance()->getWinSize();
96 for(
int i=0;i<totalNames;i++)
98 auto sprite = Sprite3D::create(names[i]);
99 this->addChild(sprite);
100 sprite->setPosition(Vec2((size.width/(totalNames+1))*(i+1), size.height/4));
107 return "Sprites with multiple meshes";
117 auto properties = Properties::createNonRefCounted(
"Materials/2d_effects.material#sample");
122 Material *mat1 = Material::createWithProperties(properties);
124 auto spriteBlur = Sprite::create(
"Images/grossini.png");
125 spriteBlur->setPositionNormalized(Vec2(0.2f, 0.5f));
126 this->addChild(spriteBlur);
127 spriteBlur->setProgramState(mat1->getTechniqueByName(
"blur")->getPassByIndex(0)->getProgramState());
129 auto spriteOutline = Sprite::create(
"Images/grossini.png");
130 spriteOutline->setPositionNormalized(Vec2(0.4f, 0.5f));
131 this->addChild(spriteOutline);
132 spriteOutline->setProgramState(mat1->getTechniqueByName(
"outline")->getPassByIndex(0)->getProgramState());
134 auto spriteNoise = Sprite::create(
"Images/grossini.png");
135 spriteNoise->setPositionNormalized(Vec2(0.6f, 0.5f));
136 this->addChild(spriteNoise);
137 spriteNoise->setProgramState(mat1->getTechniqueByName(
"noise")->getPassByIndex(0)->getProgramState());
139 auto spriteEdgeDetect = Sprite::create(
"Images/grossini.png");
140 spriteEdgeDetect->setPositionNormalized(Vec2(0.8f, 0.5f));
141 this->addChild(spriteEdgeDetect);
142 spriteEdgeDetect->setProgramState(mat1->getTechniqueByName(
"edge_detect")->getPassByIndex(0)->getProgramState());
146#define FETCH_CCTIME_LOCATION(sprite) do { \
147 auto programState = sprite->getProgramState(); \
148 auto location = programState->getUniformLocation("u_Time"); \
149 timeUniforms.emplace_back(programState, location); \
160 CC_SAFE_DELETE(properties);
165 return "Testing effects on Sprite";
170 float time = Director::getInstance()->getTotalFrames() * Director::getInstance()->getAnimationInterval();
171 Vec4 random(time / 10.0f, time, time * 2.0f, time * 4.0f);
174 loc.programState->setUniform(loc.location, &random,
sizeof(random));
187 virtual bool resolveAutoBinding(backend::ProgramState* programState,
const std::string& uniform,
const std::string& autoBinding)
override;
189 void callbackRadius(backend::ProgramState* programState, backend::UniformLocation uniform);
190 void callbackColor(backend::ProgramState* programState, backend::UniformLocation uniform);
195 if (autoBinding.compare(
"DYNAMIC_RADIUS")==0)
197 auto loc = programState->getUniformLocation(uniform);
201 else if (autoBinding.compare(
"OUTLINE_COLOR")==0)
203 auto loc = programState->getUniformLocation(uniform);
212 float f = CCRANDOM_0_1() * 10;
213 programState->setUniform(uniform, &f,
sizeof(f));
218 float r = CCRANDOM_0_1();
219 float g = CCRANDOM_0_1();
220 float b = CCRANDOM_0_1();
223 programState->setUniform(uniform, &color,
sizeof(color));
242 auto properties = Properties::createNonRefCounted(
"Materials/auto_binding_test.material#sample");
247 Material *mat1 = Material::createWithProperties(properties);
249 auto spriteBlur = Sprite::create(
"Images/grossini.png");
250 spriteBlur->setPositionNormalized(Vec2(0.2f, 0.5f));
251 this->addChild(spriteBlur);
252 spriteBlur->setProgramState(mat1->getTechniqueByName(
"blur")->getPassByIndex(0)->getProgramState());
254 auto spriteOutline = Sprite::create(
"Images/grossini.png");
255 spriteOutline->setPositionNormalized(Vec2(0.4f, 0.5f));
256 this->addChild(spriteOutline);
257 spriteOutline->setProgramState(mat1->getTechniqueByName(
"outline")->getPassByIndex(0)->getProgramState());
259 auto spriteNoise = Sprite::create(
"Images/grossini.png");
260 spriteNoise->setPositionNormalized(Vec2(0.6f, 0.5f));
261 this->addChild(spriteNoise);
262 spriteNoise->setProgramState(mat1->getTechniqueByName(
"noise")->getPassByIndex(0)->getProgramState());
264 auto spriteEdgeDetect = Sprite::create(
"Images/grossini.png");
265 spriteEdgeDetect->setPositionNormalized(Vec2(0.8f, 0.5f));
266 this->addChild(spriteEdgeDetect);
267 spriteEdgeDetect->setProgramState(mat1->getTechniqueByName(
"edge_detect")->getPassByIndex(0)->getProgramState());
274 CC_SAFE_DELETE(properties);
279 return "Testing auto-bindings uniforms";
284 float time = Director::getInstance()->getTotalFrames() * Director::getInstance()->getAnimationInterval();
285 Vec4 random(time / 10.0f, time, time * 2.0f, time * 4.0f);
296 auto sprite = Sprite3D::create(
"Sprite3DTest/boss1.obj");
298 this->addChild(sprite);
299 sprite->setPositionNormalized(Vec2(0.5f,0.5f));
303 Material *mat = Material::createWithFilename(
"Materials/3d_effects.material");
304 sprite->setMaterial(mat);
307 auto light1 = AmbientLight::create(Color3B::RED);
310 auto light2 = DirectionLight::create(Vec3(-1,1,0), Color3B::GREEN);
316 auto rot = RotateBy::create(5, Vec3(30.0f,60.0f,270.0f));
317 auto repeat = RepeatForever::create(rot);
318 sprite->runAction(repeat);
323 return "Testing setTechnique()";
332 _sprite->getMaterial(0)->setTechnique(
"lit");
335 _sprite->getMaterial(0)->setTechnique(
"normal");
338 _sprite->getMaterial(0)->setTechnique(
"outline");
354 auto sprite = Sprite3D::create(
"Sprite3DTest/boss1.obj");
356 this->addChild(sprite);
357 sprite->setPositionNormalized(Vec2(0.25f, 0.5f));
359 Material *mat = Material::createWithFilename(
"Materials/3d_effects.material");
360 sprite->setMaterial(mat);
362 auto rot = RotateBy::create(5, Vec3(360.0f,240.0f,120.0f));
363 auto repeat = RepeatForever::create(rot);
364 sprite->runAction(repeat);
367 auto sprite2 = Sprite3D::create(
"Sprite3DTest/boss1.obj");
368 sprite2->setScale(3);
369 this->addChild(sprite2);
370 sprite2->setPositionNormalized(Vec2(0.5f, 0.5f));
371 sprite2->setMaterial(mat);
372 sprite2->runAction(repeat->clone());
375 auto sprite3 = Sprite3D::create(
"Sprite3DTest/boss1.obj");
376 sprite3->setScale(3);
377 this->addChild(sprite3);
378 sprite3->setPositionNormalized(Vec2(0.75f, 0.5f));
379 auto mat2 = mat->clone();
380 sprite3->setMaterial(mat2);
381 sprite3->runAction(repeat->clone());
385 mat->setTechnique(
"outline");
394 return "Testing material->clone()";
408 auto screenSize = Director::getInstance()->getWinSize();
410 ui::Slider* slider = ui::Slider::create();
411 slider->loadBarTexture(
"cocosui/sliderTrack.png");
412 slider->loadSlidBallTextures(
"cocosui/sliderThumb.png",
"cocosui/sliderThumb.png",
"");
413 slider->loadProgressBarTexture(
"cocosui/sliderProgress.png");
414 slider->setPercent(50);
416 slider->setPosition(Vec2(screenSize.width / 2.0f, screenSize.height / 3.0f));
417 slider->addEventListener([&](Ref* sender, ui::Slider::EventType type) {
419 if (type == ui::Slider::EventType::ON_SLIDEBALL_UP)
421 ui::Slider* slider =
dynamic_cast<ui::Slider*
>(sender);
422 float p = slider->getPercent() / 100.0f;
423 slider->setTouchEnabled(
false);
425 Label* label =
dynamic_cast<Label*
>(this->getChildByTag(
SHOW_LEBAL_TAG));
428 label->setString(
"Testing start!");
431 [
this, p, slider](
float)
434 slider->setTouchEnabled(
true);
436 1.0,
"schedule test parsing");
443 auto label = Label::createWithSystemFont(
"Max parsing count is 10000, which may crash because of high memory consumption.",
"Helvetica", 10);
444 label->setPosition(Vec2(screenSize.width / 2.0f, screenSize.height / 2.0f - 20));
446 label = Label::createWithSystemFont(
"Slide to test parsing performance",
"Helvetica", 10);
447 label->setPosition(Vec2(screenSize.width / 2.0f, screenSize.height / 2.0f));
450 label = Label::createWithSystemFont(
"",
"Helvetica", 10);
451 label->setPosition(Vec2(screenSize.width / 2.0f, screenSize.height / 2.0f + 20));
459 std::clock_t begin = std::clock();
461 for (
unsigned int i = 0; i < count; i++)
463 Material::createWithFilename(
"Materials/2d_effects.material");
464 Material::createWithFilename(
"Materials/3d_effects.material");
467 std::clock_t end = std::clock();
468 double elapsed_secs = double(end - begin) / CLOCKS_PER_SEC;
469 Label* label =
dynamic_cast<Label*
>(this->getChildByTag(
SHOW_LEBAL_TAG));
472 std::string str = StringUtils::format(
"Testing completed! Took: %.3f seconds for parsing material %d times.", elapsed_secs, count);
473 label->setString(str);
475 CCLOG(
"Took: %.3f seconds for parsing material %d times.", elapsed_secs, count);
481 return "Testing parsing performance";
489 const char* spacename = properties->getNamespace();
490 const char*
id = properties->getId();
493 for(i=0; i<indent*2;i++)
497 log(
"%sNamespace: %s ID: %s\n%s{", chindent, spacename,
id, chindent);
500 const char* name = properties->getNextProperty();
501 const char* value = NULL;
504 value = properties->getString(name);
505 log(
"%s%s = %s", chindent, name, value);
506 name = properties->getNextProperty();
509 Properties* space = properties->getNextNamespace();
510 while (space != NULL)
513 space = properties->getNextNamespace();
516 log(
"%s}\n",chindent);
#define ADD_TEST_CASE(__className__)
static void printProperties(Properties *properties, int indent)
#define FETCH_CCTIME_LOCATION(sprite)
void callbackRadius(backend::ProgramState *programState, backend::UniformLocation uniform)
virtual bool resolveAutoBinding(backend::ProgramState *programState, const std::string &uniform, const std::string &autoBinding) override
void callbackColor(backend::ProgramState *programState, backend::UniformLocation uniform)
virtual void onEnter() override
void updateCCTimeUniforms(float)
std::vector< Locations > timeUniforms
virtual std::string subtitle() const override
EffectAutoBindingResolver * _resolver
virtual void onEnter() override
virtual ~Material_AutoBindings()
cocos2d::backend::ProgramState * _noiseProgramState
void updateUniformTime(float)
cocos2d::backend::UniformLocation _locationTime
virtual std::string subtitle() const override
virtual std::string subtitle() const override
virtual void onEnter() override
virtual std::string subtitle() const override
virtual void onEnter() override
virtual void onEnter() override
virtual std::string subtitle() const override
cocos2d::Sprite3D * _sprite
virtual std::string subtitle() const override
virtual void onEnter() override
void changeMaterial(float dt)
virtual std::string title() const override
virtual void onEnter() override