Merge branch 'develop' into develop_renderer_tileMapTest

* develop: (24 commits)
  Update CHANGELOG [ci skip]
  Update AUTHORS [ci skip]
  Update CHANGELOG [ci skip]
  More renderer optimizations
  [AUTO] : updating submodule reference to latest autogenerated bindings
  Update CHANGELOG [ci skip]
  Sprite: removed _hasChildren
  Compilation fix: Updates cocos_files.json and removes unused  in template.
  use data.isNull() instead of !data.getBytes()
  Update VS project file.
  Updates CHANGELOG
  SpriteBatchCommand and ParticleBatchCommand use the BatchCommand
  Updates Xcode, Android and Linux project
  fixes #3720
  Renderer performance fixes
  Console::log(format, va_args) is private
  fix compiling error
  Relieve inherit from LabelProtocol
  closed #3688, Solve the bug : LabelAtlas set a shorter string than before, the effect will be wrong.
  add check data valid in getStringFromFile
  ...
This commit is contained in:
Huabing.Xu 2014-01-16 12:47:32 +08:00
commit 21d586d4ca
40 changed files with 601 additions and 395 deletions

View File

@ -718,6 +718,9 @@ Developers:
Pisces000221 Pisces000221
Corrected a few mistakes in the README file of project-creator. Corrected a few mistakes in the README file of project-creator.
hbbalfred
Fixed a bug that crash if file doesn't exist when using FileUtils::getStringFromFile.
Retired Core Developers: Retired Core Developers:
WenSheng Yang WenSheng Yang

View File

@ -1,11 +1,19 @@
cocos2d-x-3.0final ?.? ? cocos2d-x-3.0final ?.? ?
[All] [All]
[FIX] Crash if file doesn't exist when using FileUtils::getStringFromFile.
[FIX] If setting a shorter string than before while using LabelAtlas, the effect will be wrong.
[NEW] Label: Uses a struct of TTF configuration for Label::createWithTTF to reduce parameters and make this interface more easily to use.
[NEW] Console: added the 'textures', 'fileutils dump' and 'config' commands [NEW] Console: added the 'textures', 'fileutils dump' and 'config' commands
[NEW] DrawNode supports to draw triangle, quad bezier, cubic bezier. [NEW] DrawNode supports to draw triangle, quad bezier, cubic bezier.
[NEW] Renderer: Added BatchCommand. This command is not "batchable" with other commands, but improves performance in about 10%
[FIX] Console: log(format, va_args) is private to prevent possible resolution errors
[FIX] Configuration: dumpInfo() -> getInfo() [FIX] Configuration: dumpInfo() -> getInfo()
[FIX] ControlSlider doesn't support to set selected thumb sprite. [FIX] ControlSlider doesn't support to set selected thumb sprite.
[FIX] ControlButton doesn't support to set scale ratio of touchdown state. [FIX] ControlButton doesn't support to set scale ratio of touchdown state.
[FIX] Particles: Crash was triggered if there is not `textureFileName`section in particle plist file. [FIX] Particles: Crash was triggered if there is not `textureFileName`section in particle plist file.
[FIX] Renderer: QuadCommand::init() does not copy the Quads, it only store a reference making the code faster
[FIX] Renderer: Performance improved in Sprite and SpriteBatchNode (and subclasses) sprites in about 20%
[FIX] Sprite: removed _hasChildren optimization. It uses !_children.empty() now which is super fast as well
[FIX] Tests: TestCpp works with CMake on Windows. [FIX] Tests: TestCpp works with CMake on Windows.
[FIX] Tests: Sprites Performance Test has 3 new tests [FIX] Tests: Sprites Performance Test has 3 new tests
[FIX] TextureCache: getTextureForKey and removeTextureForKey work as expected [FIX] TextureCache: getTextureForKey and removeTextureForKey work as expected

View File

@ -1 +1 @@
3d6ada05d55194dd8e4c10ed8316add7c0d8705c 88c095bbe123ab56df3f7870692c6631f4464c8d

View File

@ -122,6 +122,7 @@ renderer/CCFrustum.cpp \
renderer/CCGroupCommand.cpp \ renderer/CCGroupCommand.cpp \
renderer/CCMaterialManager.cpp \ renderer/CCMaterialManager.cpp \
renderer/CCQuadCommand.cpp \ renderer/CCQuadCommand.cpp \
renderer/CCBatchCommand.cpp \
renderer/CCRenderCommand.cpp \ renderer/CCRenderCommand.cpp \
renderer/CCRenderer.cpp \ renderer/CCRenderer.cpp \
renderer/CCRenderMaterial.cpp \ renderer/CCRenderMaterial.cpp \

View File

@ -158,7 +158,7 @@ void AtlasNode::draw(void)
shader, shader,
_blendFunc, _blendFunc,
_textureAtlas->getQuads(), _textureAtlas->getQuads(),
_textureAtlas->getTotalQuads(), _quadsToDraw,
_modelViewTransform); _modelViewTransform);
Director::getInstance()->getRenderer()->addCommand(&_quadCommand); Director::getInstance()->getRenderer()->addCommand(&_quadCommand);

View File

@ -32,84 +32,74 @@
NS_CC_BEGIN NS_CC_BEGIN
Label* Label::createWithTTF(const std::string& label, const std::string& fontFilePath, int fontSize, int lineSize, TextHAlignment alignment, GlyphCollection glyphs, const char *customGlyphs, bool useDistanceField) Label* Label::create()
{ {
FontAtlas *tmpAtlas = nullptr; Label *ret = new Label();
if(useDistanceField)
tmpAtlas = FontAtlasCache::getFontAtlasTTF(fontFilePath.c_str(), DISTANCEFIELD_ATLAS_FONTSIZE, glyphs, customGlyphs,true);
else
tmpAtlas = FontAtlasCache::getFontAtlasTTF(fontFilePath.c_str(), fontSize, glyphs, customGlyphs,false);
if (!tmpAtlas)
return nullptr;
// create the actual label
Label* templabel = Label::createWithAtlas(tmpAtlas, alignment, lineSize, useDistanceField,true);
if (templabel)
{
if(useDistanceField)
templabel->setFontSize(fontSize);
templabel->setText(label, lineSize, alignment, false);
return templabel;
}
return nullptr;
}
Label* Label::createWithBMFont(const std::string& label, const std::string& bmfontFilePath, TextHAlignment alignment, int lineSize)
{
FontAtlas *tmpAtlas = FontAtlasCache::getFontAtlasFNT(bmfontFilePath.c_str());
if (!tmpAtlas)
return 0;
Label* templabel = Label::createWithAtlas(tmpAtlas, alignment, lineSize);
if (templabel)
{
templabel->setText(label, lineSize, alignment, false);
return templabel;
}
else
{
return 0;
}
return 0;
}
Label* Label::createWithAtlas(FontAtlas *atlas, TextHAlignment alignment, int lineSize, bool useDistanceField,bool useA8Shader)
{
Label *ret = new Label(atlas, alignment, useDistanceField,useA8Shader);
if (!ret) if (!ret)
return 0; return nullptr;
if( ret->init() ) ret->autorelease();
return ret;
}
Label* Label::createWithTTF(const TTFConfig& ttfConfig, const std::string& text, TextHAlignment alignment /* = TextHAlignment::CENTER */, int lineSize /* = 0 */)
{
Label *ret = new Label();
if (!ret)
return nullptr;
if (ret->setTTFConfig(ttfConfig))
{ {
if(ttfConfig.distanceFieldEnabled)
ret->setFontSize(ttfConfig.fontSize);
ret->setString(text,alignment,lineSize);
ret->autorelease(); ret->autorelease();
return ret; return ret;
} }
else else
{ {
delete ret; delete ret;
return 0; return nullptr;
}
}
Label* Label::createWithTTF(const std::string& text, const std::string& fontFilePath, int fontSize, int lineSize /* = 0 */, TextHAlignment alignment /* = TextHAlignment::CENTER */, GlyphCollection glyphs /* = GlyphCollection::NEHE */, const char *customGlyphs /* = 0 */, bool useDistanceField /* = false */)
{
TTFConfig ttfConfig(fontFilePath.c_str(),fontSize,glyphs,customGlyphs,useDistanceField);
return createWithTTF(ttfConfig,text,alignment,lineSize);
}
Label* Label::createWithBMFont(const std::string& bmfontFilePath, const std::string& text,const TextHAlignment& alignment /* = TextHAlignment::CENTER */, int lineSize /* = 0 */)
{
Label *ret = new Label();
if (!ret)
return nullptr;
if (ret->setBMFontFilePath(bmfontFilePath))
{
ret->setString(text,alignment,lineSize);
ret->autorelease();
return ret;
}
else
{
delete ret;
return nullptr;
} }
return ret;
} }
Label::Label(FontAtlas *atlas, TextHAlignment alignment, bool useDistanceField,bool useA8Shader) Label::Label(FontAtlas *atlas, TextHAlignment alignment, bool useDistanceField,bool useA8Shader)
: _reusedLetter(nullptr) : _reusedLetter(nullptr)
, _multilineEnable(true)
, _commonLineHeight(0.0f) , _commonLineHeight(0.0f)
, _lineBreakWithoutSpaces(false) , _lineBreakWithoutSpaces(false)
, _width(0.0f) , _width(0.0f)
, _alignment(alignment) , _alignment(alignment)
, _currentUTF16String(0) , _currentUTF16String(nullptr)
, _originalUTF16String(0) , _originalUTF16String(nullptr)
, _advances(nullptr) , _advances(nullptr)
, _fontAtlas(atlas) , _fontAtlas(atlas)
, _isOpacityModifyRGB(true) , _isOpacityModifyRGB(true)
@ -118,6 +108,7 @@ Label::Label(FontAtlas *atlas, TextHAlignment alignment, bool useDistanceField,b
, _fontSize(0) , _fontSize(0)
, _uniformEffectColor(0) , _uniformEffectColor(0)
{ {
_cascadeColorEnabled = true;
} }
Label::~Label() Label::~Label()
@ -137,10 +128,13 @@ bool Label::init()
bool ret = true; bool ret = true;
if(_fontAtlas) if(_fontAtlas)
{ {
_reusedLetter = Sprite::createWithTexture(&_fontAtlas->getTexture(0)); if (_reusedLetter == nullptr)
_reusedLetter->setOpacityModifyRGB(_isOpacityModifyRGB); {
ret = SpriteBatchNode::initWithTexture(&_fontAtlas->getTexture(0), 30); _reusedLetter = Sprite::createWithTexture(&_fontAtlas->getTexture(0));
_reusedLetter->retain(); _reusedLetter->setOpacityModifyRGB(_isOpacityModifyRGB);
_reusedLetter->retain();
}
ret = SpriteBatchNode::initWithTexture(&_fontAtlas->getTexture(0), 30);
} }
if (_useDistanceField) if (_useDistanceField)
setLabelEffect(LabelEffect::NORMAL,Color3B::BLACK); setLabelEffect(LabelEffect::NORMAL,Color3B::BLACK);
@ -148,46 +142,94 @@ bool Label::init()
setShaderProgram(ShaderCache::getInstance()->getProgram(GLProgram::SHADER_NAME_POSITION_TEXTURE_A8_COLOR)); setShaderProgram(ShaderCache::getInstance()->getProgram(GLProgram::SHADER_NAME_POSITION_TEXTURE_A8_COLOR));
else else
setShaderProgram(ShaderCache::getInstance()->getProgram(GLProgram::SHADER_NAME_POSITION_TEXTURE_COLOR)); setShaderProgram(ShaderCache::getInstance()->getProgram(GLProgram::SHADER_NAME_POSITION_TEXTURE_COLOR));
return ret; return ret;
} }
void Label::setString(const std::string &stringToRender) bool Label::initWithFontAtlas(FontAtlas* atlas,bool distanceFieldEnabled /* = false */, bool useA8Shader /* = false */)
{ {
_multilineEnable = true; FontAtlas *oldAtlas = _fontAtlas;
setText(stringToRender, _width, TextHAlignment::CENTER, false); bool oldDistanceFieldEnable = _useDistanceField;
bool oldA8ShaderEnabel = _useA8Shader;
_fontAtlas = atlas;
_useDistanceField = distanceFieldEnabled;
_useA8Shader = useA8Shader;
bool ret = Label::init();
if (oldAtlas)
{
if (ret)
{
FontAtlasCache::releaseFontAtlas(oldAtlas);
}
else
{
_fontAtlas = oldAtlas;
_useDistanceField = oldDistanceFieldEnable;
_useA8Shader = oldA8ShaderEnabel;
Label::init();
FontAtlasCache::releaseFontAtlas(atlas);
}
}
if (_fontAtlas)
{
_commonLineHeight = _fontAtlas->getCommonLineHeight();
if (_currentUTF16String)
{
alignText();
}
}
return ret;
} }
void Label::setString(const std::string &stringToRender,bool multilineEnable) bool Label::setTTFConfig(const TTFConfig& ttfConfig)
{ {
_multilineEnable = multilineEnable; FontAtlas *newAtlas = nullptr;
setText(stringToRender, _width, TextHAlignment::CENTER, false); if(ttfConfig.distanceFieldEnabled)
newAtlas = FontAtlasCache::getFontAtlasTTF(ttfConfig.fontFilePath, DISTANCEFIELD_ATLAS_FONTSIZE, ttfConfig.glyphs, ttfConfig.customGlyphs,true);
else
newAtlas = FontAtlasCache::getFontAtlasTTF(ttfConfig.fontFilePath, ttfConfig.fontSize, ttfConfig.glyphs, ttfConfig.customGlyphs,false);
if (!newAtlas)
return false;
return initWithFontAtlas(newAtlas,ttfConfig.distanceFieldEnabled,true);
} }
bool Label::setText(const std::string& stringToRender, float lineWidth, TextHAlignment alignment, bool lineBreakWithoutSpaces) bool Label::setBMFontFilePath(const std::string& bmfontFilePath)
{ {
if (!_fontAtlas) FontAtlas *newAtlas = FontAtlasCache::getFontAtlasFNT(bmfontFilePath);
if (!newAtlas)
return false;
return initWithFontAtlas(newAtlas);
}
bool Label::setString(const std::string& text, const TextHAlignment& alignment /* = TextHAlignment::CENTER */, float lineWidth /* = -1 */, bool lineBreakWithoutSpaces /* = false */)
{
if (!_fontAtlas || _commonLineHeight <= 0)
return false; return false;
// carloX // carloX
// reset the string // reset the string
resetCurrentString(); resetCurrentString();
_width = lineWidth; if(lineWidth >= 0)
{
_width = lineWidth;
}
_alignment = alignment; _alignment = alignment;
_lineBreakWithoutSpaces = lineBreakWithoutSpaces; _lineBreakWithoutSpaces = lineBreakWithoutSpaces;
// store locally common line height unsigned short* utf16String = cc_utf8_to_utf16(text.c_str());
_commonLineHeight = _fontAtlas->getCommonLineHeight();
if (_commonLineHeight <= 0)
return false;
// int numLetter = 0;
unsigned short* utf16String = cc_utf8_to_utf16(stringToRender.c_str());
if(!utf16String) if(!utf16String)
return false; return false;
_cascadeColorEnabled = true;
setCurrentString(utf16String); setCurrentString(utf16String);
setOriginalString(utf16String); setOriginalString(utf16String);
@ -299,7 +341,7 @@ void Label::alignText()
_textureAtlas->removeAllQuads(); _textureAtlas->removeAllQuads();
_fontAtlas->prepareLetterDefinitions(_currentUTF16String); _fontAtlas->prepareLetterDefinitions(_currentUTF16String);
LabelTextFormatter::createStringSprites(this); LabelTextFormatter::createStringSprites(this);
if(_multilineEnable && LabelTextFormatter::multilineText(this) ) if(_width > 0 && LabelTextFormatter::multilineText(this) )
LabelTextFormatter::createStringSprites(this); LabelTextFormatter::createStringSprites(this);
LabelTextFormatter::alignText(this); LabelTextFormatter::alignText(this);

View File

@ -54,23 +54,43 @@ enum class LabelEffect {
struct FontLetterDefinition; struct FontLetterDefinition;
class FontAtlas; class FontAtlas;
typedef struct _ttfConfig
{
std::string fontFilePath;
int fontSize;
GlyphCollection glyphs;
const char *customGlyphs;
bool distanceFieldEnabled;
_ttfConfig(const char* filePath,int fontSize = 36, const GlyphCollection& glyphs = GlyphCollection::NEHE,
const char *customGlyphs = nullptr,bool useDistanceField = false)
:fontFilePath(filePath)
,fontSize(fontSize)
,glyphs(glyphs)
,customGlyphs(customGlyphs)
,distanceFieldEnabled(useDistanceField)
{}
}TTFConfig;
class CC_DLL Label : public SpriteBatchNode, public LabelProtocol, public LabelTextFormatProtocol class CC_DLL Label : public SpriteBatchNode, public LabelTextFormatProtocol
{ {
public: public:
static Label* create();
// static create
static Label* createWithTTF(const std::string& label, const std::string& fontFilePath, int fontSize, int lineSize = 0, TextHAlignment alignment = TextHAlignment::CENTER, GlyphCollection glyphs = GlyphCollection::NEHE, const char *customGlyphs = 0, bool useDistanceField = false);
static Label* createWithBMFont(const std::string& label, const std::string& bmfontFilePath, TextHAlignment alignment = TextHAlignment::CENTER, int lineSize = 0);
bool setText(const std::string& stringToRender, float lineWidth, TextHAlignment alignment = TextHAlignment::LEFT, bool lineBreakWithoutSpaces = false);
CC_DEPRECATED_ATTRIBUTE static Label* createWithTTF(const std::string& label, const std::string& fontFilePath, int fontSize, int lineSize = 0, TextHAlignment alignment = TextHAlignment::CENTER, GlyphCollection glyphs = GlyphCollection::NEHE, const char *customGlyphs = 0, bool useDistanceField = false);
static Label* createWithTTF(const TTFConfig& ttfConfig, const std::string& text, TextHAlignment alignment = TextHAlignment::CENTER, int lineWidth = 0);
static Label* createWithBMFont(const std::string& bmfontFilePath, const std::string& text,const TextHAlignment& alignment = TextHAlignment::CENTER, int lineWidth = 0);
bool setTTFConfig(const TTFConfig& ttfConfig);
bool setBMFontFilePath(const std::string& bmfontFilePath);
bool setString(const std::string& text, const TextHAlignment& alignment = TextHAlignment::CENTER, float lineWidth = -1, bool lineBreakWithoutSpaces = false);
//only support for TTF
void setLabelEffect(LabelEffect effect,const Color3B& effectColor); void setLabelEffect(LabelEffect effect,const Color3B& effectColor);
virtual void setString(const std::string &stringToRender) override;
void setString(const std::string &stringToRender,bool multilineEnable);
virtual void setAlignment(TextHAlignment alignment); virtual void setAlignment(TextHAlignment alignment);
virtual void setWidth(float width); virtual void setWidth(float width);
virtual void setLineBreakWithoutSpace(bool breakWithoutSpace); virtual void setLineBreakWithoutSpace(bool breakWithoutSpace);
@ -116,7 +136,7 @@ public:
virtual void setLabelContentSize(const Size &newSize) override; virtual void setLabelContentSize(const Size &newSize) override;
// carloX // carloX
virtual const std::string& getString() const override { static std::string _ret("not implemented"); return _ret; } virtual const std::string& getString() const { static std::string _ret("not implemented"); return _ret; }
void addChild(Node * child, int zOrder=0, int tag=0) override; void addChild(Node * child, int zOrder=0, int tag=0) override;
virtual std::string getDescription() const override; virtual std::string getDescription() const override;
@ -127,14 +147,14 @@ private:
/** /**
* @js NA * @js NA
*/ */
Label(FontAtlas *atlas, TextHAlignment alignment, bool useDistanceField = false,bool useA8Shader = false); Label(FontAtlas *atlas = nullptr, TextHAlignment alignment = TextHAlignment::CENTER, bool useDistanceField = false,bool useA8Shader = false);
/** /**
* @js NA * @js NA
* @lua NA * @lua NA
*/ */
~Label(); ~Label();
static Label* createWithAtlas(FontAtlas *atlas, TextHAlignment alignment = TextHAlignment::LEFT, int lineSize = 0, bool useDistanceField = false,bool useA8Shader = false); bool initWithFontAtlas(FontAtlas* atlas,bool distanceFieldEnabled = false, bool useA8Shader = false);
void setFontSize(int fontSize); void setFontSize(int fontSize);
@ -151,12 +171,10 @@ private:
virtual void updateColor() override; virtual void updateColor() override;
//! used for optimization //! used for optimization
Sprite *_reusedLetter; Sprite *_reusedLetter;
std::vector<LetterInfo> _lettersInfo; std::vector<LetterInfo> _lettersInfo;
bool _multilineEnable;
float _commonLineHeight; float _commonLineHeight;
bool _lineBreakWithoutSpaces; bool _lineBreakWithoutSpaces;
float _width; float _width;

View File

@ -382,26 +382,14 @@ void ParticleBatchNode::draw(void)
return; return;
} }
// CC_NODE_DRAW_SETUP(); _batchCommand.init(0,
// _vertexZ,
// GL::blendFunc( _blendFunc.src, _blendFunc.dst ); _textureAtlas->getTexture()->getName(),
// _shaderProgram,
// _textureAtlas->drawQuads(); _blendFunc,
_textureAtlas,
auto shader = ShaderCache::getInstance()->getProgram(GLProgram::SHADER_NAME_POSITION_TEXTURE_COLOR_NO_MVP); _modelViewTransform);
Director::getInstance()->getRenderer()->addCommand(&_batchCommand);
kmMat4 mv;
kmGLGetMatrix(KM_GL_MODELVIEW, &mv);
_quadCommand.init(0,
_vertexZ,
_textureAtlas->getTexture()->getName(),
shader,
_blendFunc,
_textureAtlas->getQuads(),
_textureAtlas->getTotalQuads(),
mv);
Director::getInstance()->getRenderer()->addCommand(&_quadCommand);
CC_PROFILER_STOP("CCParticleBatchNode - draw"); CC_PROFILER_STOP("CCParticleBatchNode - draw");
} }

View File

@ -32,7 +32,7 @@
#include "CCNode.h" #include "CCNode.h"
#include "CCProtocols.h" #include "CCProtocols.h"
#include "renderer/CCQuadCommand.h" #include "renderer/CCBatchCommand.h"
NS_CC_BEGIN NS_CC_BEGIN
@ -146,7 +146,7 @@ private:
/** the blend function used for drawing the quads */ /** the blend function used for drawing the quads */
BlendFunc _blendFunc; BlendFunc _blendFunc;
// quad command // quad command
QuadCommand _quadCommand; BatchCommand _batchCommand;
}; };
// end of particle_nodes group // end of particle_nodes group

View File

@ -242,9 +242,7 @@ bool Sprite::initWithTexture(Texture2D *texture, const Rect& rect, bool rotated)
// zwoptex default values // zwoptex default values
_offsetPosition = Point::ZERO; _offsetPosition = Point::ZERO;
_hasChildren = false;
// clean the Quad // clean the Quad
memset(&_quad, 0, sizeof(_quad)); memset(&_quad, 0, sizeof(_quad));
@ -767,7 +765,6 @@ void Sprite::addChild(Node *child, int zOrder, int tag)
} }
//CCNode already sets isReorderChildDirty_ so this needs to be after batchNode check //CCNode already sets isReorderChildDirty_ so this needs to be after batchNode check
Node::addChild(child, zOrder, tag); Node::addChild(child, zOrder, tag);
_hasChildren = true;
} }
void Sprite::reorderChild(Node *child, int zOrder) void Sprite::reorderChild(Node *child, int zOrder)
@ -813,8 +810,6 @@ void Sprite::removeAllChildrenWithCleanup(bool cleanup)
} }
Node::removeAllChildrenWithCleanup(cleanup); Node::removeAllChildrenWithCleanup(cleanup);
_hasChildren = false;
} }
void Sprite::sortAllChildren() void Sprite::sortAllChildren()
@ -882,27 +877,24 @@ void Sprite::setDirtyRecursively(bool bValue)
{ {
_recursiveDirty = bValue; _recursiveDirty = bValue;
setDirty(bValue); setDirty(bValue);
// recursively set dirty
if (_hasChildren) for(const auto &child: _children) {
{ Sprite* sp = dynamic_cast<Sprite*>(child);
for(const auto &child: _children) { if (sp)
Sprite* sp = dynamic_cast<Sprite*>(child); {
if (sp) sp->setDirtyRecursively(true);
{
sp->setDirtyRecursively(true);
}
} }
} }
} }
// XXX HACK: optimization // XXX HACK: optimization
#define SET_DIRTY_RECURSIVELY() { \ #define SET_DIRTY_RECURSIVELY() { \
if (! _recursiveDirty) { \ if (! _recursiveDirty) { \
_recursiveDirty = true; \ _recursiveDirty = true; \
setDirty(true); \ setDirty(true); \
if ( _hasChildren) \ if (!_children.empty()) \
setDirtyRecursively(true); \ setDirtyRecursively(true); \
} \ } \
} }
void Sprite::setPosition(const Point& pos) void Sprite::setPosition(const Point& pos)

View File

@ -538,7 +538,6 @@ protected:
bool _dirty; /// Whether the sprite needs to be updated bool _dirty; /// Whether the sprite needs to be updated
bool _recursiveDirty; /// Whether all of the sprite's children needs to be updated bool _recursiveDirty; /// Whether all of the sprite's children needs to be updated
bool _hasChildren; /// Whether the sprite contains children
bool _shouldBeHidden; /// should not be drawn because one of the ancestors is not visible bool _shouldBeHidden; /// should not be drawn because one of the ancestors is not visible
kmMat4 _transformToBatch; kmMat4 _transformToBatch;

View File

@ -99,7 +99,7 @@ bool SpriteBatchNode::initWithTexture(Texture2D *tex, ssize_t capacity)
_descendants.reserve(capacity); _descendants.reserve(capacity);
setShaderProgram(ShaderCache::getInstance()->getProgram(GLProgram::SHADER_NAME_POSITION_TEXTURE_COLOR_NO_MVP)); setShaderProgram(ShaderCache::getInstance()->getProgram(GLProgram::SHADER_NAME_POSITION_TEXTURE_COLOR));
return true; return true;
} }
@ -356,18 +356,14 @@ void SpriteBatchNode::draw()
for(const auto &child: _children) for(const auto &child: _children)
child->updateTransform(); child->updateTransform();
kmMat4 mv; _batchCommand.init(0,
kmGLGetMatrix(KM_GL_MODELVIEW, &mv); _vertexZ,
_textureAtlas->getTexture()->getName(),
_quadCommand.init(0, _shaderProgram,
_vertexZ, _blendFunc,
_textureAtlas->getTexture()->getName(), _textureAtlas,
_shaderProgram, _modelViewTransform);
_blendFunc, Director::getInstance()->getRenderer()->addCommand(&_batchCommand);
_textureAtlas->getQuads(),
_textureAtlas->getTotalQuads(),
mv);
Director::getInstance()->getRenderer()->addCommand(&_quadCommand);
} }
void SpriteBatchNode::increaseAtlasCapacity(void) void SpriteBatchNode::increaseAtlasCapacity(void)

View File

@ -35,7 +35,7 @@ THE SOFTWARE.
#include "CCProtocols.h" #include "CCProtocols.h"
#include "CCTextureAtlas.h" #include "CCTextureAtlas.h"
#include "ccMacros.h" #include "ccMacros.h"
#include "renderer/CCQuadCommand.h" #include "renderer/CCBatchCommand.h"
NS_CC_BEGIN NS_CC_BEGIN
@ -189,7 +189,7 @@ protected:
TextureAtlas *_textureAtlas; TextureAtlas *_textureAtlas;
BlendFunc _blendFunc; BlendFunc _blendFunc;
QuadCommand _quadCommand; // quad command BatchCommand _batchCommand; // render command
// all descendants: children, grand children, etc... // all descendants: children, grand children, etc...
// There is not need to retain/release these objects, since they are already retained by _children // There is not need to retain/release these objects, since they are already retained by _children

View File

@ -144,6 +144,7 @@ set(COCOS2D_SRC
renderer/CCGroupCommand.cpp renderer/CCGroupCommand.cpp
renderer/CCMaterialManager.cpp renderer/CCMaterialManager.cpp
renderer/CCQuadCommand.cpp renderer/CCQuadCommand.cpp
renderer/CCBatchCommand.cpp
renderer/CCRenderCommand.cpp renderer/CCRenderCommand.cpp
renderer/CCRenderer.cpp renderer/CCRenderer.cpp
renderer/CCRenderMaterial.cpp renderer/CCRenderMaterial.cpp

View File

@ -317,6 +317,7 @@ xcopy /Y /Q "$(ProjectDir)..\..\external\win32-specific\gles\prebuilt\*.*" "$(Ou
<ClCompile Include="platform\win32\CCFileUtilsWin32.cpp" /> <ClCompile Include="platform\win32\CCFileUtilsWin32.cpp" />
<ClCompile Include="platform\win32\CCImage.cpp" /> <ClCompile Include="platform\win32\CCImage.cpp" />
<ClCompile Include="platform\win32\CCStdC.cpp" /> <ClCompile Include="platform\win32\CCStdC.cpp" />
<ClCompile Include="renderer\CCBatchCommand.cpp" />
<ClCompile Include="renderer\CCCustomCommand.cpp" /> <ClCompile Include="renderer\CCCustomCommand.cpp" />
<ClCompile Include="renderer\CCFrustum.cpp" /> <ClCompile Include="renderer\CCFrustum.cpp" />
<ClCompile Include="renderer\CCGroupCommand.cpp" /> <ClCompile Include="renderer\CCGroupCommand.cpp" />
@ -521,6 +522,7 @@ xcopy /Y /Q "$(ProjectDir)..\..\external\win32-specific\gles\prebuilt\*.*" "$(Ou
<ClInclude Include="platform\win32\CCGL.h" /> <ClInclude Include="platform\win32\CCGL.h" />
<ClInclude Include="platform\win32\CCPlatformDefine.h" /> <ClInclude Include="platform\win32\CCPlatformDefine.h" />
<ClInclude Include="platform\win32\CCStdC.h" /> <ClInclude Include="platform\win32\CCStdC.h" />
<ClInclude Include="renderer\CCBatchCommand.h" />
<ClInclude Include="renderer\CCCustomCommand.h" /> <ClInclude Include="renderer\CCCustomCommand.h" />
<ClInclude Include="renderer\CCFrustum.h" /> <ClInclude Include="renderer\CCFrustum.h" />
<ClInclude Include="renderer\CCGroupCommand.h" /> <ClInclude Include="renderer\CCGroupCommand.h" />

View File

@ -598,6 +598,9 @@
<ClCompile Include="renderer\CCRenderMaterial.cpp"> <ClCompile Include="renderer\CCRenderMaterial.cpp">
<Filter>renderer</Filter> <Filter>renderer</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="renderer\CCBatchCommand.cpp">
<Filter>renderer</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="..\physics\CCPhysicsBody.h"> <ClInclude Include="..\physics\CCPhysicsBody.h">
@ -1207,5 +1210,8 @@
<ClInclude Include="renderer\CCRenderMaterial.h"> <ClInclude Include="renderer\CCRenderMaterial.h">
<Filter>renderer</Filter> <Filter>renderer</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="renderer\CCBatchCommand.h">
<Filter>renderer</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -547,6 +547,8 @@ static Data getData(const std::string& filename, bool forString)
std::string FileUtils::getStringFromFile(const std::string& filename) std::string FileUtils::getStringFromFile(const std::string& filename)
{ {
Data data = getData(filename, true); Data data = getData(filename, true);
if (data.isNull())
return "";
std::string ret((const char*)data.getBytes()); std::string ret((const char*)data.getBytes());
return ret; return ret;
} }

View File

@ -0,0 +1,125 @@
/****************************************************************************
Copyright (c) 2013-2014 Chukong Technologies Inc.
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 "renderer/CCBatchCommand.h"
#include "ccGLStateCache.h"
#include "CCTextureAtlas.h"
NS_CC_BEGIN
BatchCommand::BatchCommand()
: _viewport(0)
, _depth(0)
, _textureID(0)
, _blendType(BlendFunc::DISABLE)
, _textureAtlas(nullptr)
{
_type = RenderCommand::Type::BATCH_COMMAND;
_shader = nullptr;
}
void BatchCommand::init(int viewport, int32_t depth, GLuint textureID, GLProgram* shader, BlendFunc blendType, TextureAtlas *textureAtlas, const kmMat4& modelViewTransform)
{
_viewport = viewport;
_depth = depth;
_textureID = textureID;
_blendType = blendType;
_shader = shader;
_textureAtlas = textureAtlas;
_mv = modelViewTransform;
}
BatchCommand::~BatchCommand()
{
}
int64_t BatchCommand::generateID()
{
_id = 0;
//Generate Material ID
//TODO fix shader ID generation
CCASSERT(_shader->getProgram() < pow(2,10), "ShaderID is greater than 2^10");
//TODO fix texture ID generation
CCASSERT(_textureID < pow(2,18), "TextureID is greater than 2^18");
//TODO fix blend id generation
int blendID = 0;
if(_blendType == BlendFunc::DISABLE)
{
blendID = 0;
}
else if(_blendType == BlendFunc::ALPHA_PREMULTIPLIED)
{
blendID = 1;
}
else if(_blendType == BlendFunc::ALPHA_NON_PREMULTIPLIED)
{
blendID = 2;
}
else if(_blendType == BlendFunc::ADDITIVE)
{
blendID = 3;
}
else
{
blendID = 4;
}
//TODO Material ID should be part of the ID
//
// Temporal hack (later, these 32-bits should be packed in 24-bits
//
// +---------------------+-------------------+----------------------+
// | Shader ID (10 bits) | Blend ID (4 bits) | Texture ID (18 bits) |
// +---------------------+-------------------+----------------------+
_materialID = (int32_t)_shader->getProgram() << 22
| (int32_t)blendID << 18
| (int32_t)_textureID << 0;
//Generate RenderCommandID
_id = (int64_t)_viewport << 61
| (int64_t)1 << 60 //translucent
| (int64_t)_depth << 36;
return _id;
}
void BatchCommand::execute()
{
// Set material
_shader->use();
_shader->setUniformsForBuiltins(_mv);
GL::bindTexture2D(_textureID);
GL::blendFunc(_blendType.src, _blendType.dst);
// Draw
_textureAtlas->drawQuads();
}
NS_CC_END

View File

@ -0,0 +1,81 @@
/****************************************************************************
Copyright (c) 2013-2014 Chukong Technologies Inc.
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.
****************************************************************************/
#ifndef _CC_BATCHCOMMAND_H_
#define _CC_BATCHCOMMAND_H_
#include "CCRenderCommand.h"
#include "CCGLProgram.h"
#include "CCRenderCommandPool.h"
#include "kazmath/kazmath.h"
NS_CC_BEGIN
class TextureAtlas;
#define CC_NO_TEXTURE 0
class BatchCommand : public RenderCommand
{
public:
BatchCommand();
~BatchCommand();
void init(int viewport, int32_t depth, GLuint texutreID, GLProgram* shader, BlendFunc blendType, TextureAtlas *textureAtlas, const kmMat4& modelViewTransform);
// +----------+----------+-----+-----------------------------------+
// | | | | | |
// | ViewPort | Transluc | | Depth | Material ID |
// | 3 bits | 1 bit | | 24 bits | 24 bit2 |
// +----------+----------+-----+----------------+------------------+
virtual int64_t generateID();
void execute();
protected:
int32_t _materialID;
//Key Data
int _viewport; /// Which view port it belongs to
//TODO use material to determine if it's translucent
int32_t _depth;
//Maternal
GLuint _textureID;
GLProgram* _shader;
// GLuint _shaderID;
BlendFunc _blendType;
TextureAtlas *_textureAtlas;
// ModelView transform
kmMat4 _mv;
};
NS_CC_END
#endif //_CC_BATCHCOMMAND_H_

View File

@ -27,8 +27,7 @@
NS_CC_BEGIN NS_CC_BEGIN
CustomCommand::CustomCommand() CustomCommand::CustomCommand()
:RenderCommand() : func(nullptr)
, func(nullptr)
, _viewport(0) , _viewport(0)
, _depth(0) , _depth(0)
{ {

View File

@ -86,8 +86,7 @@ void GroupCommandManager::releaseGroupID(int groupID)
} }
GroupCommand::GroupCommand() GroupCommand::GroupCommand()
:RenderCommand() : _viewport(0)
, _viewport(0)
, _depth(0) , _depth(0)
{ {
_type = RenderCommand::Type::GROUP_COMMAND; _type = RenderCommand::Type::GROUP_COMMAND;

View File

@ -29,17 +29,15 @@
NS_CC_BEGIN NS_CC_BEGIN
QuadCommand::QuadCommand() QuadCommand::QuadCommand()
:RenderCommand() :_viewport(0)
,_viewport(0)
,_depth(0) ,_depth(0)
,_textureID(0) ,_textureID(0)
,_blendType(BlendFunc::DISABLE) ,_blendType(BlendFunc::DISABLE)
,_quadCount(0) ,_quadsCount(0)
,_capacity(0)
{ {
_type = RenderCommand::Type::QUAD_COMMAND; _type = RenderCommand::Type::QUAD_COMMAND;
_shader = nullptr; _shader = nullptr;
_quad = nullptr; _quads = nullptr;
} }
void QuadCommand::init(int viewport, int32_t depth, GLuint textureID, GLProgram* shader, BlendFunc blendType, V3F_C4B_T2F_Quad* quad, ssize_t quadCount, const kmMat4 &mv) void QuadCommand::init(int viewport, int32_t depth, GLuint textureID, GLProgram* shader, BlendFunc blendType, V3F_C4B_T2F_Quad* quad, ssize_t quadCount, const kmMat4 &mv)
@ -48,63 +46,16 @@ void QuadCommand::init(int viewport, int32_t depth, GLuint textureID, GLProgram*
_depth = depth; _depth = depth;
_textureID = textureID; _textureID = textureID;
_blendType = blendType; _blendType = blendType;
_quadCount = quadCount;
_shader = shader; _shader = shader;
if(quadCount > _capacity ) { _quadsCount = quadCount;
//TODO find a better way to manage quads, current way will result in memory be wasted _quads = quad;
// _quad = (V3F_C4B_T2F_Quad*)malloc(sizeof(V3F_C4B_T2F_Quad) * quadCount);
_quad = (V3F_C4B_T2F_Quad*) realloc(_quad, sizeof(*quad) * quadCount );
_capacity = quadCount;
}
_quadCount = quadCount; _mv = mv;
memcpy(_quad, quad, sizeof(V3F_C4B_T2F_Quad) * quadCount);
for(int i=0; i<quadCount; ++i) {
V3F_C4B_T2F_Quad *q = &_quad[i];
kmVec3 vec1, out1;
vec1.x = q->bl.vertices.x;
vec1.y = q->bl.vertices.y;
vec1.z = q->bl.vertices.z;
kmVec3Transform(&out1, &vec1, &mv);
q->bl.vertices.x = out1.x;
q->bl.vertices.y = out1.y;
q->bl.vertices.z = out1.z;
kmVec3 vec2, out2;
vec2.x = q->br.vertices.x;
vec2.y = q->br.vertices.y;
vec2.z = q->br.vertices.z;
kmVec3Transform(&out2, &vec2, &mv);
q->br.vertices.x = out2.x;
q->br.vertices.y = out2.y;
q->br.vertices.z = out2.z;
kmVec3 vec3, out3;
vec3.x = q->tr.vertices.x;
vec3.y = q->tr.vertices.y;
vec3.z = q->tr.vertices.z;
kmVec3Transform(&out3, &vec3, &mv);
q->tr.vertices.x = out3.x;
q->tr.vertices.y = out3.y;
q->tr.vertices.z = out3.z;
kmVec3 vec4, out4;
vec4.x = q->tl.vertices.x;
vec4.y = q->tl.vertices.y;
vec4.z = q->tl.vertices.z;
kmVec3Transform(&out4, &vec4, &mv);
q->tl.vertices.x = out4.x;
q->tl.vertices.y = out4.y;
q->tl.vertices.z = out4.z;
}
} }
QuadCommand::~QuadCommand() QuadCommand::~QuadCommand()
{ {
free(_quad);
} }
int64_t QuadCommand::generateID() int64_t QuadCommand::generateID()

View File

@ -41,7 +41,7 @@ public:
QuadCommand(); QuadCommand();
~QuadCommand(); ~QuadCommand();
void init(int viewport, int32_t depth, GLuint texutreID, GLProgram* shader, BlendFunc blendType, V3F_C4B_T2F_Quad* quad, ssize_t quadCount, void init(int viewport, int32_t depth, GLuint texutreID, GLProgram* shader, BlendFunc blendType, V3F_C4B_T2F_Quad* quads, ssize_t quadCount,
const kmMat4& mv); const kmMat4& mv);
// +----------+----------+-----+-----------------------------------+ // +----------+----------+-----+-----------------------------------+
@ -60,13 +60,15 @@ public:
inline GLuint getTextureID() const { return _textureID; } inline GLuint getTextureID() const { return _textureID; }
inline V3F_C4B_T2F_Quad* getQuad() const { return _quad; } inline V3F_C4B_T2F_Quad* getQuads() const { return _quads; }
inline ssize_t getQuadCount() const { return _quadCount; } inline ssize_t getQuadCount() const { return _quadsCount; }
inline GLProgram* getShader() const { return _shader; } inline GLProgram* getShader() const { return _shader; }
inline BlendFunc getBlendType() const { return _blendType; } inline BlendFunc getBlendType() const { return _blendType; }
inline const kmMat4& getModelView() const { return _mv; }
protected: protected:
int32_t _materialID; int32_t _materialID;
@ -85,9 +87,10 @@ protected:
BlendFunc _blendType; BlendFunc _blendType;
V3F_C4B_T2F_Quad* _quad; V3F_C4B_T2F_Quad* _quads;
ssize_t _quadCount; ssize_t _quadsCount;
ssize_t _capacity;
kmMat4 _mv;
}; };
NS_CC_END NS_CC_END

View File

@ -42,6 +42,7 @@ public:
{ {
QUAD_COMMAND, QUAD_COMMAND,
CUSTOM_COMMAND, CUSTOM_COMMAND,
BATCH_COMMAND,
GROUP_COMMAND, GROUP_COMMAND,
UNKNOWN_COMMAND, UNKNOWN_COMMAND,
}; };
@ -49,9 +50,10 @@ public:
virtual int64_t generateID() = 0; virtual int64_t generateID() = 0;
/** Get Render Command Id */ /** Get Render Command Id */
virtual inline int64_t getID() { return _id; } inline int64_t getID() { return _id; }
virtual inline Type getType() { return _type; } /** Returns the Command type */
inline Type getType() { return _type; }
protected: protected:
RenderCommand(); RenderCommand();

View File

@ -27,6 +27,7 @@
#include "ccGLStateCache.h" #include "ccGLStateCache.h"
#include "CCCustomCommand.h" #include "CCCustomCommand.h"
#include "renderer/CCQuadCommand.h" #include "renderer/CCQuadCommand.h"
#include "renderer/CCBatchCommand.h"
#include "CCGroupCommand.h" #include "CCGroupCommand.h"
#include "CCConfiguration.h" #include "CCConfiguration.h"
#include "CCDirector.h" #include "CCDirector.h"
@ -256,7 +257,9 @@ void Renderer::render()
_lastCommand ++; _lastCommand ++;
} }
memcpy(_quads + _numQuads, cmd->getQuad(), sizeof(V3F_C4B_T2F_Quad) * cmdQuadCount); memcpy(_quads + _numQuads, cmd->getQuads(), sizeof(V3F_C4B_T2F_Quad) * cmdQuadCount);
convertToWorldCoordiantes(_quads + _numQuads, cmdQuadCount, cmd->getModelView());
_numQuads += cmdQuadCount; _numQuads += cmdQuadCount;
} }
else if(commandType == RenderCommand::Type::CUSTOM_COMMAND) else if(commandType == RenderCommand::Type::CUSTOM_COMMAND)
@ -265,6 +268,12 @@ void Renderer::render()
CustomCommand* cmd = static_cast<CustomCommand*>(command); CustomCommand* cmd = static_cast<CustomCommand*>(command);
cmd->execute(); cmd->execute();
} }
else if(commandType == RenderCommand::Type::BATCH_COMMAND)
{
flush();
BatchCommand* cmd = static_cast<BatchCommand*>(command);
cmd->execute();
}
else if(commandType == RenderCommand::Type::GROUP_COMMAND) else if(commandType == RenderCommand::Type::GROUP_COMMAND)
{ {
flush(); flush();
@ -319,6 +328,25 @@ void Renderer::render()
_lastMaterialID = 0; _lastMaterialID = 0;
} }
void Renderer::convertToWorldCoordiantes(V3F_C4B_T2F_Quad* quads, ssize_t quantity, const kmMat4& modelView)
{
for(ssize_t i=0; i<quantity; ++i) {
V3F_C4B_T2F_Quad *q = &quads[i];
kmVec3 *vec1 = (kmVec3*)&q->bl.vertices;
kmVec3Transform(vec1, vec1, &modelView);
kmVec3 *vec2 = (kmVec3*)&q->br.vertices;
kmVec3Transform(vec2, vec2, &modelView);
kmVec3 *vec3 = (kmVec3*)&q->tr.vertices;
kmVec3Transform(vec3, vec3, &modelView);
kmVec3 *vec4 = (kmVec3*)&q->tl.vertices;
kmVec3Transform(vec4, vec4, &modelView);
}
}
void Renderer::drawBatchedQuads() void Renderer::drawBatchedQuads()
{ {
//TODO we can improve the draw performance by insert material switching command before hand. //TODO we can improve the draw performance by insert material switching command before hand.

View File

@ -75,9 +75,12 @@ protected:
void mapBuffers(); void mapBuffers();
void drawBatchedQuads(); void drawBatchedQuads();
//Draw the previews queued quads and flush previous context //Draw the previews queued quads and flush previous context
void flush(); void flush();
void convertToWorldCoordiantes(V3F_C4B_T2F_Quad* quads, ssize_t quantity, const kmMat4& modelView);
std::stack<int> _commandGroupStack; std::stack<int> _commandGroupStack;
std::stack<RenderStackElement> _renderStack; std::stack<RenderStackElement> _renderStack;

View File

@ -50,7 +50,7 @@
#include "CCScheduler.h" #include "CCScheduler.h"
#include "CCScene.h" #include "CCScene.h"
#include "CCPlatformConfig.h" #include "CCPlatformConfig.h"
#include "CCFileUtils.h" #include "platform/CCFileUtils.h"
#include "CCConfiguration.h" #include "CCConfiguration.h"
#include "CCTextureCache.h" #include "CCTextureCache.h"
@ -144,24 +144,7 @@ static const char* inet_ntop(int af, const void* src, char* dst, int cnt)
// Free functions to log // Free functions to log
// //
// XXX: Deprecated static void _log(const char *format, va_list args)
void CCLog(const char * format, ...)
{
va_list args;
va_start(args, format);
log(format, args);
va_end(args);
}
void log(const char * format, ...)
{
va_list args;
va_start(args, format);
log(format, args);
va_end(args);
}
void log(const char *format, va_list args)
{ {
char buf[MAX_LOG_LENGTH]; char buf[MAX_LOG_LENGTH];
@ -176,7 +159,7 @@ void log(const char *format, va_list args)
MultiByteToWideChar(CP_UTF8, 0, buf, -1, wszBuf, sizeof(wszBuf)); MultiByteToWideChar(CP_UTF8, 0, buf, -1, wszBuf, sizeof(wszBuf));
OutputDebugStringW(wszBuf); OutputDebugStringW(wszBuf);
OutputDebugStringA("\n"); OutputDebugStringA("\n");
WideCharToMultiByte(CP_ACP, 0, wszBuf, sizeof(wszBuf), buf, sizeof(buf), NULL, FALSE); WideCharToMultiByte(CP_ACP, 0, wszBuf, sizeof(wszBuf), buf, sizeof(buf), NULL, FALSE);
printf("%s\n", buf); printf("%s\n", buf);
@ -189,6 +172,22 @@ void log(const char *format, va_list args)
Director::getInstance()->getConsole()->log(buf); Director::getInstance()->getConsole()->log(buf);
} }
// XXX: Deprecated
void CCLog(const char * format, ...)
{
va_list args;
va_start(args, format);
_log(format, args);
va_end(args);
}
void log(const char * format, ...)
{
va_list args;
va_start(args, format);
_log(format, args);
va_end(args);
}
// //
// Console code // Console code

View File

@ -58,7 +58,6 @@ static const int MAX_LOG_LENGTH = 16*1024;
@brief Output Debug message. @brief Output Debug message.
*/ */
void CC_DLL log(const char * format, ...) CC_FORMAT_PRINTF(1, 2); void CC_DLL log(const char * format, ...) CC_FORMAT_PRINTF(1, 2);
void CC_DLL log(const char * format, va_list args);
/** Console is helper class that lets the developer control the game from TCP connection. /** Console is helper class that lets the developer control the game from TCP connection.
Console will spawn a new thread that will listen to a specified TCP port. Console will spawn a new thread that will listen to a specified TCP port.

@ -1 +1 @@
Subproject commit bab1d8a7c5d8b29f14c8dc19158a8bb994f0e970 Subproject commit 74cb897b64f7325cf969341e9bc2d87fc7fb1bb7

View File

@ -1 +1 @@
16af4ad046f4db00af7a229d89c406054d8616c3 f92acd30f26c52238e94d2ef1f5b11e760980a67

View File

@ -158,20 +158,19 @@ LabelTTFAlignmentNew::LabelTTFAlignmentNew()
{ {
auto s = Director::getInstance()->getWinSize(); auto s = Director::getInstance()->getWinSize();
auto ttf0 = Label::createWithTTF("Alignment 0\nnew line", "fonts/tahoma.ttf", 32); TTFConfig config("fonts/tahoma.ttf",32);
ttf0->setAlignment(TextHAlignment::LEFT);
auto ttf0 = Label::createWithTTF(config,"Alignment 0\nnew line",TextHAlignment::LEFT);
ttf0->setPosition(Point(s.width/2,(s.height/6)*2 - 30)); ttf0->setPosition(Point(s.width/2,(s.height/6)*2 - 30));
ttf0->setAnchorPoint(Point(0.5f,0.5f)); ttf0->setAnchorPoint(Point(0.5f,0.5f));
this->addChild(ttf0); this->addChild(ttf0);
auto ttf1 = Label::createWithTTF("Alignment 1\nnew line", "fonts/tahoma.ttf", 32); auto ttf1 = Label::createWithTTF(config,"Alignment 1\nnew line",TextHAlignment::CENTER);
ttf1->setAlignment(TextHAlignment::CENTER);
ttf1->setPosition(Point(s.width/2,(s.height/6)*3 - 30)); ttf1->setPosition(Point(s.width/2,(s.height/6)*3 - 30));
ttf1->setAnchorPoint(Point(0.5f,0.5f)); ttf1->setAnchorPoint(Point(0.5f,0.5f));
this->addChild(ttf1); this->addChild(ttf1);
auto ttf2 = Label::createWithTTF("Alignment 2\nnew line", "fonts/tahoma.ttf", 32); auto ttf2 = Label::createWithTTF(config,"Alignment 2\nnew line",TextHAlignment::RIGHT);
ttf1->setAlignment(TextHAlignment::RIGHT);
ttf2->setPosition(Point(s.width/2,(s.height/6)*4 - 30)); ttf2->setPosition(Point(s.width/2,(s.height/6)*4 - 30));
ttf2->setAnchorPoint(Point(0.5f,0.5f)); ttf2->setAnchorPoint(Point(0.5f,0.5f));
this->addChild(ttf2); this->addChild(ttf2);
@ -194,7 +193,7 @@ LabelFNTColorAndOpacity::LabelFNTColorAndOpacity()
auto col = LayerColor::create( Color4B(128,128,128,255) ); auto col = LayerColor::create( Color4B(128,128,128,255) );
addChild(col, -10); addChild(col, -10);
auto label1 = Label::createWithBMFont("Test", "fonts/bitmapFontTest2.fnt"); auto label1 = Label::createWithBMFont("fonts/bitmapFontTest2.fnt", "Test");
label1->setAnchorPoint( Point(0,0) ); label1->setAnchorPoint( Point(0,0) );
addChild(label1, 0, kTagBitmapAtlas1); addChild(label1, 0, kTagBitmapAtlas1);
@ -204,13 +203,13 @@ LabelFNTColorAndOpacity::LabelFNTColorAndOpacity()
auto repeat = RepeatForever::create(seq); auto repeat = RepeatForever::create(seq);
label1->runAction(repeat); label1->runAction(repeat);
auto label2 = Label::createWithBMFont("Test", "fonts/bitmapFontTest2.fnt"); auto label2 = Label::createWithBMFont("fonts/bitmapFontTest2.fnt", "Test");
label2->setAnchorPoint( Point(0.5f, 0.5f) ); label2->setAnchorPoint( Point(0.5f, 0.5f) );
label2->setColor( Color3B::RED ); label2->setColor( Color3B::RED );
addChild(label2, 0, kTagBitmapAtlas2); addChild(label2, 0, kTagBitmapAtlas2);
label2->runAction( repeat->clone() ); label2->runAction( repeat->clone() );
auto label3 = Label::createWithBMFont("Test", "fonts/bitmapFontTest2.fnt"); auto label3 = Label::createWithBMFont("fonts/bitmapFontTest2.fnt", "Test");
label3->setAnchorPoint( Point(1,1) ); label3->setAnchorPoint( Point(1,1) );
addChild(label3, 0, kTagBitmapAtlas3); addChild(label3, 0, kTagBitmapAtlas3);
@ -252,7 +251,7 @@ LabelFNTSpriteActions::LabelFNTSpriteActions()
_time = 0; _time = 0;
// Upper Label // Upper Label
auto label = Label::createWithBMFont("Bitmap Font Atlas", "fonts/bitmapFontTest.fnt"); auto label = Label::createWithBMFont("fonts/bitmapFontTest.fnt", "Bitmap Font Atlas");
addChild(label); addChild(label);
auto s = Director::getInstance()->getWinSize(); auto s = Director::getInstance()->getWinSize();
@ -289,7 +288,7 @@ LabelFNTSpriteActions::LabelFNTSpriteActions()
// Bottom Label // Bottom Label
auto label2 = Label::createWithBMFont("00.0", "fonts/bitmapFontTest.fnt"); auto label2 = Label::createWithBMFont("fonts/bitmapFontTest.fnt", "00.0");
addChild(label2, 0, kTagBitmapAtlas2); addChild(label2, 0, kTagBitmapAtlas2);
label2->setPosition( Point(s.width/2.0f, 80) ); label2->setPosition( Point(s.width/2.0f, 80) );
@ -341,7 +340,7 @@ std::string LabelFNTSpriteActions::subtitle() const
LabelFNTPadding::LabelFNTPadding() LabelFNTPadding::LabelFNTPadding()
{ {
auto label = Label::createWithBMFont("abcdefg", "fonts/bitmapFontTest4.fnt"); auto label = Label::createWithBMFont("fonts/bitmapFontTest4.fnt", "abcdefg");
addChild(label); addChild(label);
auto s = Director::getInstance()->getWinSize(); auto s = Director::getInstance()->getWinSize();
@ -365,17 +364,17 @@ LabelFNTOffset::LabelFNTOffset()
auto s = Director::getInstance()->getWinSize(); auto s = Director::getInstance()->getWinSize();
Label* label = NULL; Label* label = NULL;
label = Label::createWithBMFont("FaFeFiFoFu", "fonts/bitmapFontTest5.fnt"); label = Label::createWithBMFont("fonts/bitmapFontTest5.fnt", "FaFeFiFoFu");
addChild(label); addChild(label);
label->setPosition( Point(s.width/2, s.height/2+50) ); label->setPosition( Point(s.width/2, s.height/2+50) );
label->setAnchorPoint( Point(0.5f, 0.5f) ) ; label->setAnchorPoint( Point(0.5f, 0.5f) ) ;
label = Label::createWithBMFont("fafefifofu", "fonts/bitmapFontTest5.fnt"); label = Label::createWithBMFont("fonts/bitmapFontTest5.fnt", "fafefifofu");
addChild(label); addChild(label);
label->setPosition( Point(s.width/2, s.height/2) ); label->setPosition( Point(s.width/2, s.height/2) );
label->setAnchorPoint( Point(0.5f, 0.5f) ); label->setAnchorPoint( Point(0.5f, 0.5f) );
label = Label::createWithBMFont("aeiou", "fonts/bitmapFontTest5.fnt"); label = Label::createWithBMFont("fonts/bitmapFontTest5.fnt", "aeiou");
addChild(label); addChild(label);
label->setPosition( Point(s.width/2, s.height/2-50) ); label->setPosition( Point(s.width/2, s.height/2-50) );
label->setAnchorPoint( Point(0.5f, 0.5f) ); label->setAnchorPoint( Point(0.5f, 0.5f) );
@ -396,19 +395,19 @@ LabelFNTColor::LabelFNTColor()
auto s = Director::getInstance()->getWinSize(); auto s = Director::getInstance()->getWinSize();
Label* label = NULL; Label* label = NULL;
label = Label::createWithBMFont("Blue", "fonts/bitmapFontTest5.fnt"); label = Label::createWithBMFont("fonts/bitmapFontTest5.fnt", "Blue");
label->setColor( Color3B::BLUE ); label->setColor( Color3B::BLUE );
addChild(label); addChild(label);
label->setPosition( Point(s.width/2, s.height/4) ); label->setPosition( Point(s.width/2, s.height/4) );
label->setAnchorPoint( Point(0.5f, 0.5f) ); label->setAnchorPoint( Point(0.5f, 0.5f) );
label = Label::createWithBMFont("Red", "fonts/bitmapFontTest5.fnt"); label = Label::createWithBMFont("fonts/bitmapFontTest5.fnt", "Red");
addChild(label); addChild(label);
label->setPosition( Point(s.width/2, 2*s.height/4) ); label->setPosition( Point(s.width/2, 2*s.height/4) );
label->setAnchorPoint( Point(0.5f, 0.5f) ); label->setAnchorPoint( Point(0.5f, 0.5f) );
label->setColor( Color3B::RED ); label->setColor( Color3B::RED );
label = Label::createWithBMFont("G", "fonts/bitmapFontTest5.fnt"); label = Label::createWithBMFont("fonts/bitmapFontTest5.fnt", "Green");
addChild(label); addChild(label);
label->setPosition( Point(s.width/2, 3*s.height/4) ); label->setPosition( Point(s.width/2, 3*s.height/4) );
label->setAnchorPoint( Point(0.5f, 0.5f) ); label->setAnchorPoint( Point(0.5f, 0.5f) );
@ -433,7 +432,7 @@ LabelFNTHundredLabels::LabelFNTHundredLabels()
{ {
char str[6] = {0}; char str[6] = {0};
sprintf(str, "-%d-", i); sprintf(str, "-%d-", i);
auto label = Label::createWithBMFont(str, "fonts/bitmapFontTest.fnt"); auto label = Label::createWithBMFont("fonts/bitmapFontTest.fnt", str);
addChild(label); addChild(label);
auto s = Director::getInstance()->getWinSize(); auto s = Director::getInstance()->getWinSize();
@ -459,7 +458,7 @@ LabelFNTMultiLine::LabelFNTMultiLine()
Size s; Size s;
// Left // Left
auto label1 = Label::createWithBMFont(" Multi line\nLeft", "fonts/bitmapFontTest3.fnt"); auto label1 = Label::createWithBMFont("fonts/bitmapFontTest3.fnt", " Multi line\nLeft");
label1->setAnchorPoint(Point(0,0)); label1->setAnchorPoint(Point(0,0));
addChild(label1, 0, kTagBitmapAtlas1); addChild(label1, 0, kTagBitmapAtlas1);
@ -468,7 +467,7 @@ LabelFNTMultiLine::LabelFNTMultiLine()
// Center // Center
auto label2 = Label::createWithBMFont("Multi line\nCenter", "fonts/bitmapFontTest3.fnt"); auto label2 = Label::createWithBMFont( "fonts/bitmapFontTest3.fnt", "Multi line\nCenter");
label2->setAnchorPoint(Point(0.5f, 0.5f)); label2->setAnchorPoint(Point(0.5f, 0.5f));
addChild(label2, 0, kTagBitmapAtlas2); addChild(label2, 0, kTagBitmapAtlas2);
@ -476,7 +475,7 @@ LabelFNTMultiLine::LabelFNTMultiLine()
CCLOG("content size: %.2fx%.2f", s.width, s.height); CCLOG("content size: %.2fx%.2f", s.width, s.height);
// right // right
auto label3 = Label::createWithBMFont("Multi line\nRight\nThree lines Three", "fonts/bitmapFontTest3.fnt"); auto label3 = Label::createWithBMFont("fonts/bitmapFontTest3.fnt", "Multi line\nRight\nThree lines Three");
label3->setAnchorPoint(Point(1, 1)); label3->setAnchorPoint(Point(1, 1));
addChild(label3, 0, kTagBitmapAtlas3); addChild(label3, 0, kTagBitmapAtlas3);
@ -504,19 +503,18 @@ LabelFNTandTTFEmpty::LabelFNTandTTFEmpty()
float delta = s.height/4; float delta = s.height/4;
// LabelBMFont // LabelBMFont
auto label1 = Label::createWithBMFont("", "fonts/bitmapFontTest3.fnt", TextHAlignment::CENTER, s.width); auto label1 = Label::createWithBMFont("fonts/bitmapFontTest3.fnt", "", TextHAlignment::CENTER, s.width);
addChild(label1, 0, kTagBitmapAtlas1); addChild(label1, 0, kTagBitmapAtlas1);
label1->setAnchorPoint(Point(0.5f, 0.5f)); label1->setAnchorPoint(Point(0.5f, 0.5f));
label1->setPosition(Point(s.width/2, delta)); label1->setPosition(Point(s.width/2, delta));
// LabelTTF // LabelTTF
auto label2 = Label::createWithTTF("", "fonts/arial.ttf", 48, s.width, TextHAlignment::CENTER,GlyphCollection::NEHE); TTFConfig ttfConfig("fonts/arial.ttf",48);
auto label2 = Label::createWithTTF(ttfConfig,"", TextHAlignment::CENTER,s.width);
addChild(label2, 0, kTagBitmapAtlas2); addChild(label2, 0, kTagBitmapAtlas2);
label2->setAnchorPoint(Point(0.5f, 0.5f)); label2->setAnchorPoint(Point(0.5f, 0.5f));
label2->setPosition(Point(s.width/2, delta * 2)); label2->setPosition(Point(s.width/2, delta * 2));
schedule(schedule_selector(LabelFNTandTTFEmpty::updateStrings), 1.0f); schedule(schedule_selector(LabelFNTandTTFEmpty::updateStrings), 1.0f);
setEmpty = false; setEmpty = false;
@ -558,7 +556,7 @@ LabelFNTRetina::LabelFNTRetina()
auto s = Director::getInstance()->getWinSize(); auto s = Director::getInstance()->getWinSize();
// LabelBMFont // LabelBMFont
auto label1 = Label::createWithBMFont("TESTING RETINA DISPLAY", "fonts/konqa32.fnt"); auto label1 = Label::createWithBMFont("fonts/konqa32.fnt", "TESTING RETINA DISPLAY");
label1->setAnchorPoint(Point(0.5f, 0.5f)); label1->setAnchorPoint(Point(0.5f, 0.5f));
addChild(label1); addChild(label1);
label1->setPosition(Point(s.width/2, s.height/2)); label1->setPosition(Point(s.width/2, s.height/2));
@ -582,7 +580,7 @@ LabelFNTGlyphDesigner::LabelFNTGlyphDesigner()
addChild(layer, -10); addChild(layer, -10);
// LabelBMFont // LabelBMFont
auto label1 = Label::createWithBMFont("Testing Glyph Designer", "fonts/futura-48.fnt"); auto label1 = Label::createWithBMFont("fonts/futura-48.fnt", "Testing Glyph Designer");
label1->setAnchorPoint(Point(0.5f, 0.5f)); label1->setAnchorPoint(Point(0.5f, 0.5f));
addChild(label1); addChild(label1);
label1->setPosition(Point(s.width/2, s.height/2)); label1->setPosition(Point(s.width/2, s.height/2));
@ -603,7 +601,8 @@ LabelTTFUnicodeChinese::LabelTTFUnicodeChinese()
auto size = Director::getInstance()->getWinSize(); auto size = Director::getInstance()->getWinSize();
// Adding "啊" letter at the end of string to make VS2012 happy, otherwise VS will generate errors // Adding "啊" letter at the end of string to make VS2012 happy, otherwise VS will generate errors
// like "Error 3 error C2146: syntax error : missing ')' before identifier 'label'"; // like "Error 3 error C2146: syntax error : missing ')' before identifier 'label'";
auto label = Label::createWithTTF("美好的一天啊", "fonts/wt021.ttf", 55, size.width, TextHAlignment::CENTER, GlyphCollection::CUSTOM, "美好的一天啊"); TTFConfig ttfConfig("fonts/wt021.ttf",55,GlyphCollection::CUSTOM, "美好的一天啊");
auto label = Label::createWithTTF(ttfConfig,"美好的一天啊", TextHAlignment::CENTER, size.width);
label->setAnchorPoint(Point(0.5f, 0.5f)); label->setAnchorPoint(Point(0.5f, 0.5f));
label->setPosition(Point(size.width / 2, size.height /2)); label->setPosition(Point(size.width / 2, size.height /2));
this->addChild(label); this->addChild(label);
@ -622,7 +621,7 @@ std::string LabelTTFUnicodeChinese::subtitle() const
LabelFNTUnicodeChinese::LabelFNTUnicodeChinese() LabelFNTUnicodeChinese::LabelFNTUnicodeChinese()
{ {
auto size = Director::getInstance()->getWinSize(); auto size = Director::getInstance()->getWinSize();
auto label = Label::createWithBMFont("中国", "fonts/bitmapFontChinese.fnt"); auto label = Label::createWithBMFont("fonts/bitmapFontChinese.fnt", "中国");
label->setAnchorPoint(Point(0.5f, 0.5f)); label->setAnchorPoint(Point(0.5f, 0.5f));
label->setPosition(Point(size.width / 2, size.height /2)); label->setPosition(Point(size.width / 2, size.height /2));
this->addChild(label); this->addChild(label);
@ -671,8 +670,7 @@ LabelFNTMultiLineAlignment::LabelFNTMultiLineAlignment()
auto size = Director::getInstance()->getWinSize(); auto size = Director::getInstance()->getWinSize();
// create and initialize a Label // create and initialize a Label
this->_labelShouldRetain = Label::createWithBMFont(LongSentencesExample, "fonts/markerFelt.fnt", TextHAlignment::CENTER, size.width/1.5); this->_labelShouldRetain = Label::createWithBMFont("fonts/markerFelt.fnt", LongSentencesExample, TextHAlignment::CENTER, size.width/1.5);
//this->_labelShouldRetain = Label::createWithBMFont(LongSentencesExample, "fonts/bitmapFontTest.fnt", TextHAlignment::CENTER, size.width/1.5);
this->_labelShouldRetain->setAnchorPoint(Point(0.5f, 0.5f)); this->_labelShouldRetain->setAnchorPoint(Point(0.5f, 0.5f));
this->_labelShouldRetain->retain(); this->_labelShouldRetain->retain();
@ -855,22 +853,22 @@ LabelFNTUNICODELanguages::LabelFNTUNICODELanguages()
auto s = Director::getInstance()->getWinSize(); auto s = Director::getInstance()->getWinSize();
auto label1 = Label::createWithBMFont(spanish, "fonts/arial-unicode-26.fnt", TextHAlignment::CENTER, 200); auto label1 = Label::createWithBMFont("fonts/arial-unicode-26.fnt", spanish, TextHAlignment::CENTER, 200);
addChild(label1); addChild(label1);
label1->setAnchorPoint(Point(0.5f, 0.5f)); label1->setAnchorPoint(Point(0.5f, 0.5f));
label1->setPosition(Point(s.width/2, s.height/5*3)); label1->setPosition(Point(s.width/2, s.height/5*3));
auto label2 = Label::createWithBMFont(chinese, "fonts/arial-unicode-26.fnt"); auto label2 = Label::createWithBMFont("fonts/arial-unicode-26.fnt", chinese);
addChild(label2); addChild(label2);
label2->setAnchorPoint(Point(0.5f, 0.5f)); label2->setAnchorPoint(Point(0.5f, 0.5f));
label2->setPosition(Point(s.width/2, s.height/5*2.5)); label2->setPosition(Point(s.width/2, s.height/5*2.5));
auto label3 = Label::createWithBMFont(russian, "fonts/arial-26-en-ru.fnt"); auto label3 = Label::createWithBMFont("fonts/arial-26-en-ru.fnt", russian);
addChild(label3); addChild(label3);
label3->setAnchorPoint(Point(0.5f, 0.5f)); label3->setAnchorPoint(Point(0.5f, 0.5f));
label3->setPosition(Point(s.width/2, s.height/5*2)); label3->setPosition(Point(s.width/2, s.height/5*2));
auto label4 = Label::createWithBMFont(japanese, "fonts/arial-unicode-26.fnt"); auto label4 = Label::createWithBMFont("fonts/arial-unicode-26.fnt", japanese);
addChild(label4); addChild(label4);
label4->setAnchorPoint(Point(0.5f, 0.5f)); label4->setAnchorPoint(Point(0.5f, 0.5f));
label4->setPosition(Point(s.width/2, s.height/5*1.5)); label4->setPosition(Point(s.width/2, s.height/5*1.5));
@ -894,7 +892,7 @@ LabelFNTBounds::LabelFNTBounds()
addChild(layer, -10); addChild(layer, -10);
// LabelBMFont // LabelBMFont
label1 = Label::createWithBMFont("Testing Glyph Designer", "fonts/boundsTestFont.fnt", TextHAlignment::CENTER, s.width); label1 = Label::createWithBMFont("fonts/boundsTestFont.fnt", "Testing Glyph Designer", TextHAlignment::CENTER, s.width);
label1->setAnchorPoint(Point(0.5f, 0.5f)); label1->setAnchorPoint(Point(0.5f, 0.5f));
addChild(label1); addChild(label1);
label1->setPosition(Point(s.width/2, s.height/2)); label1->setPosition(Point(s.width/2, s.height/2));
@ -946,7 +944,8 @@ LabelTTFLongLineWrapping::LabelTTFLongLineWrapping()
auto size = Director::getInstance()->getWinSize(); auto size = Director::getInstance()->getWinSize();
// Long sentence // Long sentence
auto label1 = Label::createWithTTF(LongSentencesExample, "fonts/arial.ttf", 28, size.width, TextHAlignment::CENTER, GlyphCollection::NEHE); TTFConfig ttfConfig("fonts/arial.ttf", 28);
auto label1 = Label::createWithTTF(ttfConfig, LongSentencesExample, TextHAlignment::CENTER,size.width);
label1->setPosition( Point(size.width/2, size.height/2) ); label1->setPosition( Point(size.width/2, size.height/2) );
label1->setAnchorPoint(Point(0.5, 1.0)); label1->setAnchorPoint(Point(0.5, 1.0));
addChild(label1); addChild(label1);
@ -966,22 +965,23 @@ LabelTTFColor::LabelTTFColor()
{ {
auto size = Director::getInstance()->getWinSize(); auto size = Director::getInstance()->getWinSize();
TTFConfig ttfConfig("fonts/arial.ttf", 35);
// Green // Green
auto label1 = Label::createWithTTF("Green", "fonts/arial.ttf", 35, size.width, TextHAlignment::CENTER, GlyphCollection::NEHE); auto label1 = Label::createWithTTF(ttfConfig,"Green", TextHAlignment::CENTER, size.width);
label1->setPosition( Point(size.width/2, size.height/5 * 1.5) ); label1->setPosition( Point(size.width/2, size.height/5 * 1.5) );
label1->setColor( Color3B::GREEN ); label1->setColor( Color3B::GREEN );
label1->setAnchorPoint(Point(0.5, 0.5)); label1->setAnchorPoint(Point(0.5, 0.5));
addChild(label1); addChild(label1);
// Red // Red
auto label2 = Label::createWithTTF("Red", "fonts/arial.ttf", 35, size.width, TextHAlignment::CENTER, GlyphCollection::NEHE); auto label2 = Label::createWithTTF(ttfConfig,"Red", TextHAlignment::CENTER, size.width);
label2->setPosition( Point(size.width/2, size.height/5 * 2.0) ); label2->setPosition( Point(size.width/2, size.height/5 * 2.0) );
label2->setColor( Color3B::RED ); label2->setColor( Color3B::RED );
label2->setAnchorPoint(Point(0.5, 0.5)); label2->setAnchorPoint(Point(0.5, 0.5));
addChild(label2); addChild(label2);
// Blue // Blue
auto label3 = Label::createWithTTF("Blue", "fonts/arial.ttf", 35, size.width, TextHAlignment::CENTER, GlyphCollection::NEHE); auto label3 = Label::createWithTTF(ttfConfig,"Blue", TextHAlignment::CENTER, size.width);
label3->setPosition( Point(size.width/2, size.height/5 * 2.5) ); label3->setPosition( Point(size.width/2, size.height/5 * 2.5) );
label3->setColor( Color3B::BLUE ); label3->setColor( Color3B::BLUE );
label3->setAnchorPoint(Point(0.5, 0.5)); label3->setAnchorPoint(Point(0.5, 0.5));
@ -1001,12 +1001,10 @@ std::string LabelTTFColor::subtitle() const
LabelTTFDynamicAlignment::LabelTTFDynamicAlignment() LabelTTFDynamicAlignment::LabelTTFDynamicAlignment()
{ {
auto size = Director::getInstance()->getWinSize(); auto size = Director::getInstance()->getWinSize();
TTFConfig ttfConfig("fonts/arial.ttf", 45);
_label = Label::createWithTTF(LongSentencesExample, "fonts/arial.ttf", 45, size.width, TextHAlignment::CENTER, GlyphCollection::NEHE); _label = Label::createWithTTF(ttfConfig,LongSentencesExample, TextHAlignment::CENTER, size.width);
_label->setPosition( Point(size.width/2, size.height/2) ); _label->setPosition( Point(size.width/2, size.height/2) );
_label->setAnchorPoint(Point(0.5, 0.5)); _label->setAnchorPoint(Point(0.5, 0.5));
auto menu = Menu::create( auto menu = Menu::create(
MenuItemFont::create("Left", CC_CALLBACK_1(LabelTTFDynamicAlignment::setAlignmentLeft, this)), MenuItemFont::create("Left", CC_CALLBACK_1(LabelTTFDynamicAlignment::setAlignmentLeft, this)),
@ -1074,21 +1072,24 @@ LabelTTFUnicodeNew::LabelTTFUnicodeNew()
float vStep = size.height/9; float vStep = size.height/9;
float vSize = size.height; float vSize = size.height;
TTFConfig ttfConfig("fonts/arial.ttf", 45,GlyphCollection::ASCII);
// Spanish // Spanish
auto label1 = Label::createWithTTF("Buen día, ¿cómo te llamas?", "fonts/arial.ttf", 45, size.width, TextHAlignment::CENTER, GlyphCollection::ASCII); auto label1 = Label::createWithTTF(ttfConfig,"Buen día, ¿cómo te llamas?", TextHAlignment::CENTER, size.width);
label1->setPosition( Point(size.width/2, vSize - (vStep * 4.5)) ); label1->setPosition( Point(size.width/2, vSize - (vStep * 4.5)) );
label1->setAnchorPoint(Point(0.5, 0.5)); label1->setAnchorPoint(Point(0.5, 0.5));
addChild(label1); addChild(label1);
// German // German
auto label2 = Label::createWithTTF("In welcher Straße haben Sie gelebt?", "fonts/arial.ttf", 45, size.width, TextHAlignment::CENTER, GlyphCollection::ASCII); auto label2 = Label::createWithTTF(ttfConfig,"In welcher Straße haben Sie gelebt?", TextHAlignment::CENTER,size.width);
label2->setPosition( Point(size.width/2, vSize - (vStep * 5.5)) ); label2->setPosition( Point(size.width/2, vSize - (vStep * 5.5)) );
label2->setAnchorPoint(Point(0.5, 0.5)); label2->setAnchorPoint(Point(0.5, 0.5));
addChild(label2); addChild(label2);
// chinese // chinese
auto label3 = Label::createWithTTF(chinese, "fonts/wt021.ttf", 45, size.width, TextHAlignment::CENTER, GlyphCollection::CUSTOM, chinese.c_str()); ttfConfig.fontFilePath = "fonts/wt021.ttf";
ttfConfig.glyphs = GlyphCollection::CUSTOM;
ttfConfig.customGlyphs = chinese.c_str();
auto label3 = Label::createWithTTF(ttfConfig,chinese, TextHAlignment::CENTER,size.width);
label3->setPosition( Point(size.width/2, vSize - (vStep * 6.5)) ); label3->setPosition( Point(size.width/2, vSize - (vStep * 6.5)) );
label3->setAnchorPoint(Point(0.5, 0.5)); label3->setAnchorPoint(Point(0.5, 0.5));
addChild(label3); addChild(label3);
@ -1118,9 +1119,10 @@ LabelTTFFontsTestNew::LabelTTFFontsTestNew()
#define arraysize(ar) (sizeof(ar) / sizeof(ar[0])) #define arraysize(ar) (sizeof(ar) / sizeof(ar[0]))
auto size = Director::getInstance()->getWinSize(); auto size = Director::getInstance()->getWinSize();
TTFConfig ttfConfig(ttfpaths[0],40, GlyphCollection::NEHE);
for(size_t i=0;i < arraysize(ttfpaths); ++i) { for(size_t i=0;i < arraysize(ttfpaths); ++i) {
auto label = Label::createWithTTF( ttfpaths[i], ttfpaths[i], 40, 0, TextHAlignment::CENTER, GlyphCollection::NEHE); ttfConfig.fontFilePath = ttfpaths[i];
auto label = Label::createWithTTF(ttfConfig, ttfpaths[i], TextHAlignment::CENTER,0);
if( label ) { if( label ) {
label->setPosition( Point(size.width/2, ((size.height * 0.6)/arraysize(ttfpaths) * i) + (size.height/5))); label->setPosition( Point(size.width/2, ((size.height * 0.6)/arraysize(ttfpaths) * i) + (size.height/5)));
@ -1147,7 +1149,7 @@ LabelBMFontTestNew::LabelBMFontTestNew()
{ {
auto size = Director::getInstance()->getWinSize(); auto size = Director::getInstance()->getWinSize();
auto label1 = Label::createWithBMFont("Hello World, this is testing the new Label using fnt file", "fonts/bitmapFontTest2.fnt", TextHAlignment::CENTER, size.width); auto label1 = Label::createWithBMFont("fonts/bitmapFontTest2.fnt", "Hello World, this is testing the new Label using fnt file", TextHAlignment::CENTER, size.width);
label1->setPosition( Point(size.width/2, size.height/2) ); label1->setPosition( Point(size.width/2, size.height/2) );
label1->setAnchorPoint(Point(0.5, 0.5)); label1->setAnchorPoint(Point(0.5, 0.5));
addChild(label1); addChild(label1);
@ -1166,8 +1168,9 @@ std::string LabelBMFontTestNew::subtitle() const
LabelTTFDistanceField::LabelTTFDistanceField() LabelTTFDistanceField::LabelTTFDistanceField()
{ {
auto size = Director::getInstance()->getWinSize(); auto size = Director::getInstance()->getWinSize();
TTFConfig ttfConfig("fonts/arial.ttf", 80, GlyphCollection::DYNAMIC,nullptr,true);
auto label1 = Label::createWithTTF("Distance Field", "fonts/arial.ttf", 80, size.width, TextHAlignment::CENTER, GlyphCollection::DYNAMIC,nullptr,true); auto label1 = Label::createWithTTF(ttfConfig,"Distance Field",TextHAlignment::CENTER,size.width);
label1->setPosition( Point(size.width/2, size.height/2) ); label1->setPosition( Point(size.width/2, size.height/2) );
label1->setColor( Color3B::GREEN ); label1->setColor( Color3B::GREEN );
label1->setAnchorPoint(Point(0.5, 0.5)); label1->setAnchorPoint(Point(0.5, 0.5));
@ -1180,7 +1183,7 @@ LabelTTFDistanceField::LabelTTFDistanceField()
nullptr); nullptr);
label1->runAction(RepeatForever::create(action)); label1->runAction(RepeatForever::create(action));
auto label2 = Label::createWithTTF("Distance Field", "fonts/arial.ttf", 80, size.width, TextHAlignment::CENTER, GlyphCollection::DYNAMIC,nullptr,true); auto label2 = Label::createWithTTF(ttfConfig,"Distance Field",TextHAlignment::CENTER,size.width);
label2->setPosition( Point(size.width/2, size.height/5) ); label2->setPosition( Point(size.width/2, size.height/5) );
label2->setColor( Color3B::RED ); label2->setColor( Color3B::RED );
label2->setAnchorPoint(Point(0.5, 0.5)); label2->setAnchorPoint(Point(0.5, 0.5));
@ -1205,21 +1208,23 @@ LabelTTFDistanceFieldEffect::LabelTTFDistanceFieldEffect()
auto bg = LayerColor::create(Color4B(200,191,231,255)); auto bg = LayerColor::create(Color4B(200,191,231,255));
this->addChild(bg); this->addChild(bg);
auto label1 = Label::createWithTTF("Glow", "fonts/arial.ttf", 80, size.width, TextHAlignment::CENTER, GlyphCollection::DYNAMIC,nullptr,true); TTFConfig ttfConfig("fonts/arial.ttf", 80, GlyphCollection::DYNAMIC,nullptr,true);
auto label1 = Label::createWithTTF(ttfConfig,"Glow", TextHAlignment::CENTER, size.width);
label1->setPosition( Point(size.width/2, size.height*0.5) ); label1->setPosition( Point(size.width/2, size.height*0.5) );
label1->setColor( Color3B::GREEN ); label1->setColor( Color3B::GREEN );
label1->setAnchorPoint(Point(0.5, 0.5)); label1->setAnchorPoint(Point(0.5, 0.5));
label1->setLabelEffect(LabelEffect::GLOW,Color3B::YELLOW); label1->setLabelEffect(LabelEffect::GLOW,Color3B::YELLOW);
addChild(label1); addChild(label1);
auto label2 = Label::createWithTTF("Outline", "fonts/arial.ttf", 80, size.width, TextHAlignment::CENTER, GlyphCollection::DYNAMIC,nullptr,true); auto label2 = Label::createWithTTF(ttfConfig,"Outline", TextHAlignment::CENTER, size.width);
label2->setPosition( Point(size.width/2, size.height*0.375) ); label2->setPosition( Point(size.width/2, size.height*0.375) );
label2->setColor( Color3B::RED ); label2->setColor( Color3B::RED );
label2->setAnchorPoint(Point(0.5, 0.5)); label2->setAnchorPoint(Point(0.5, 0.5));
label2->setLabelEffect(LabelEffect::OUTLINE,Color3B::BLUE); label2->setLabelEffect(LabelEffect::OUTLINE,Color3B::BLUE);
addChild(label2); addChild(label2);
auto label3 = Label::createWithTTF("Shadow", "fonts/arial.ttf", 80, size.width, TextHAlignment::CENTER, GlyphCollection::DYNAMIC,nullptr,true); auto label3 = Label::createWithTTF(ttfConfig,"Shadow", TextHAlignment::CENTER, size.width);
label3->setPosition( Point(size.width/2, size.height*0.25f) ); label3->setPosition( Point(size.width/2, size.height*0.25f) );
label3->setColor( Color3B::RED ); label3->setColor( Color3B::RED );
label3->setAnchorPoint(Point(0.5, 0.5)); label3->setAnchorPoint(Point(0.5, 0.5));

View File

@ -764,20 +764,22 @@ void DirectorEventTest::onEnter()
Size s = Director::getInstance()->getWinSize(); Size s = Director::getInstance()->getWinSize();
_label1 = Label::createWithTTF("Update: 0", "fonts/arial.ttf", 20); TTFConfig ttfConfig("fonts/arial.ttf", 20);
_label1 = Label::createWithTTF(ttfConfig, "Update: 0");
_label1->setPosition(30,s.height/2 + 60); _label1->setPosition(30,s.height/2 + 60);
this->addChild(_label1); this->addChild(_label1);
_label2 = Label::createWithTTF("Visit: 0", "fonts/arial.ttf", 20); _label2 = Label::createWithTTF(ttfConfig, "Visit: 0");
_label2->setPosition(30,s.height/2 + 20); _label2->setPosition(30,s.height/2 + 20);
this->addChild(_label2); this->addChild(_label2);
_label3 = Label::createWithTTF("Draw: 0", "fonts/arial.ttf", 20); _label3 = Label::createWithTTF(ttfConfig, "Draw: 0");
_label3->setPosition(30,30); _label3->setPosition(30,30);
_label3->setPosition(30,s.height/2 - 20); _label3->setPosition(30,s.height/2 - 20);
this->addChild(_label3); this->addChild(_label3);
_label4 = Label::createWithTTF("Projection: 0", "fonts/arial.ttf", 20); _label4 = Label::createWithTTF(ttfConfig, "Projection: 0");
_label4->setPosition(30,30); _label4->setPosition(30,30);
_label4->setPosition(30,s.height/2 - 60); _label4->setPosition(30,s.height/2 - 60);
this->addChild(_label4); this->addChild(_label4);

View File

@ -86,6 +86,7 @@ void LabelMainScene::initWithSubTest(int nodes)
_lastRenderedCount = 0; _lastRenderedCount = 0;
_quantityNodes = 0; _quantityNodes = 0;
_accumulativeTime = 0.0f;
_labelContainer = Layer::create(); _labelContainer = Layer::create();
addChild(_labelContainer); addChild(_labelContainer);
@ -212,15 +213,18 @@ void LabelMainScene::onIncrease(Object* sender)
} }
break; break;
case kCaseLabelUpdate: case kCaseLabelUpdate:
for( int i=0;i< kNodesIncrease;i++)
{ {
auto label = Label::createWithTTF("Label", "fonts/arial.ttf", 60, size.width, TextHAlignment::CENTER, GlyphCollection::DYNAMIC,nullptr,true); TTFConfig ttfConfig("fonts/arial.ttf", 60, GlyphCollection::DYNAMIC, nullptr, true);
label->setPosition(Point((size.width/2 + rand() % 50), ((int)size.height/2 + rand() % 50))); for( int i=0;i< kNodesIncrease;i++)
_labelContainer->addChild(label, 1, _quantityNodes); {
auto label = Label::createWithTTF(ttfConfig, "Label", TextHAlignment::CENTER, size.width);
label->setPosition(Point((size.width/2 + rand() % 50), ((int)size.height/2 + rand() % 50)));
_labelContainer->addChild(label, 1, _quantityNodes);
_quantityNodes++; _quantityNodes++;
} }
break; break;
}
case kCaseLabelBMFontBigLabels: case kCaseLabelBMFontBigLabels:
for( int i=0;i< kNodesIncrease;i++) for( int i=0;i< kNodesIncrease;i++)
{ {
@ -232,15 +236,18 @@ void LabelMainScene::onIncrease(Object* sender)
} }
break; break;
case kCaseLabelBigLabels: case kCaseLabelBigLabels:
for( int i=0;i< kNodesIncrease;i++)
{ {
auto label = Label::createWithTTF(LongSentencesExample, "fonts/arial.ttf", 60, size.width, TextHAlignment::CENTER, GlyphCollection::DYNAMIC,nullptr); TTFConfig ttfConfig("fonts/arial.ttf", 60, GlyphCollection::DYNAMIC);
label->setPosition(Point((rand() % 50), rand()%((int)size.height/3))); for( int i=0;i< kNodesIncrease;i++)
_labelContainer->addChild(label, 1, _quantityNodes); {
auto label = Label::createWithTTF(ttfConfig, LongSentencesExample, TextHAlignment::CENTER, size.width);
label->setPosition(Point((rand() % 50), rand()%((int)size.height/3)));
_labelContainer->addChild(label, 1, _quantityNodes);
_quantityNodes++; _quantityNodes++;
} }
break; break;
}
default: default:
break; break;
} }
@ -330,7 +337,7 @@ void LabelMainScene::updateText(float dt)
case kCaseLabelUpdate: case kCaseLabelUpdate:
for(const auto &child : children) { for(const auto &child : children) {
Label* label = (Label*)child; Label* label = (Label*)child;
label->setString(text,false); label->setString(text);
} }
break; break;
default: default:

View File

@ -151,7 +151,6 @@ TestController::~TestController()
void TestController::menuCallback(Object * sender) void TestController::menuCallback(Object * sender)
{ {
Director::getInstance()->purgeCachedData(); Director::getInstance()->purgeCachedData();
// get the userdata, it's the index of the menu item clicked // get the userdata, it's the index of the menu item clicked

View File

@ -1,26 +0,0 @@
#!/bin/bash
# Exit on error
set -e
rm -rf ../bin
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
#make global libs
cd ../cocos2d
#install depend libs
sudo ./build/install-deps-linux.sh
mkdir -p linux-build
cd linux-build
cmake .. -DBUILD_LIBS_LUA=OFF -DBUILD_HelloCpp=OFF -DBUILD_TestCpp=OFF -DBUILD_HelloLua=OFF -DBUILD_TestLua=OFF
make -j4
#make bin
cd $DIR
rm -rf bin
mkdir -p build
cd build
cmake ../..
make -j4
cd ..
mv ../bin bin

View File

@ -1,27 +0,0 @@
#!/bin/bash
# Exit on error
set -e
rm -rf ../bin
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
#make global libs
cd ../cocos2d
#install depend libs
sudo ./build/install-deps-linux.sh
mkdir -p linux-build
cd linux-build
cmake .. -DBUILD_HelloCpp=OFF -DBUILD_TestCpp=OFF -DBUILD_HelloLua=OFF -DBUILD_TestLua=OFF
make -j4
#make bin
cd $DIR
rm -rf bin
mkdir -p build
cd build
cmake ../..
make -j4
cd ..
mv ../bin bin
cp ../cocos2d/cocos/scripting/lua/script/* bin/Resources

View File

@ -1,6 +1,6 @@
#!/usr/bin/python #!/usr/bin/python
# create_project.py # obfuscate.py
# Create cross-platform cocos2d-x project # Create Ant buildfile to obfuscate game source code
# Copyright (c) 2012 cocos2d-x.org # Copyright (c) 2012 cocos2d-x.org
# Author: WangZhe # Author: WangZhe
@ -16,9 +16,9 @@ import sys
import os, os.path import os, os.path
def dumpUsage(): def dumpUsage():
print "Usage: generate-config.py -input INPUT_PATH -output OUTPUT_PATH -cocos2d COCOS2D_ROOT_PATH" print "Usage: %s -input INPUT_PATH -output OUTPUT_PATH -cocos2d COCOS2D_ROOT_PATH" % (os.path.basename(__file__))
print "Options:" print "Options:"
print " -intput INPUT_PATH The path to javscript files directory" print " -input INPUT_PATH The path to javascript files directory"
print " -output OUTPUT_PATH The path to the obfuscated javascript file" print " -output OUTPUT_PATH The path to the obfuscated javascript file"
print " -cocos2d COCOS2D_ROOT_PATH The root path of cocos2d-x, e.g. /workspace/cocos2d-x" print " -cocos2d COCOS2D_ROOT_PATH The root path of cocos2d-x, e.g. /workspace/cocos2d-x"
print "" print ""
@ -123,7 +123,7 @@ checkParams()
generateXmlForCompiler() generateXmlForCompiler()
# print "running ant to generate obfuscated main.js" # print "running ant to generate obfuscated main.js"
# os.popen("ant -buildfile obfuscate.xml") # os.popen("ant -buildfile obfuscate.xml")
print "Successful! obfuscate.xml is generated." print "Successful! obfuscate.xml generated."
print "Note: Please reoder the files sequence in obfuscate.xml, keep it the same order as javascript \"requrie\" instruction," print "Note: Please reorder the file's sequence in obfuscate.xml, keep it the same order as javascript \"require\" instruction,"
print "then call \"ant -buildfile obfuscate.xml\" to obfuscate your js codes." print "then call \"ant -buildfile obfuscate.xml\" to obfuscate your js code."

View File

@ -1 +1 @@
0a2d046187d7848172fadf6ee4a7e80897e6a75c 5ae50c3f2080b46e18ba3f5aee4c5c686d54e13a

View File

@ -54,7 +54,7 @@ skip = Node::[^setPosition$ setGLServerState description getUserObject .*UserDat
Copying::[*], Copying::[*],
LabelProtocol::[*], LabelProtocol::[*],
LabelTextFormatProtocol::[*], LabelTextFormatProtocol::[*],
Label::[getLettersInfo], Label::[getLettersInfo createWithTTF setTTFConfig],
.*Delegate::[*], .*Delegate::[*],
PoolManager::[*], PoolManager::[*],
Texture2D::[initWithPVRTCData addPVRTCImage releaseData setTexParameters initWithData keepData getPixelFormatInfoMap], Texture2D::[initWithPVRTCData addPVRTCImage releaseData setTexParameters initWithData keepData getPixelFormatInfoMap],

View File

@ -48,7 +48,7 @@ skip = Node::[setGLServerState description getUserObject .*UserData getGLServerS
Layer.*::[didAccelerate (g|s)etBlendFunc keyPressed keyReleased], Layer.*::[didAccelerate (g|s)etBlendFunc keyPressed keyReleased],
Menu.*::[.*Target getSubItems create initWithItems alignItemsInRows alignItemsInColumns], Menu.*::[.*Target getSubItems create initWithItems alignItemsInRows alignItemsInColumns],
MenuItem.*::[create setCallback initWithCallback], MenuItem.*::[create setCallback initWithCallback],
Label::[getLettersInfo], Label::[getLettersInfo createWithTTF setTTFConfig],
Copying::[*], Copying::[*],
LabelProtocol::[*], LabelProtocol::[*],
LabelTextFormatProtocol::[*], LabelTextFormatProtocol::[*],
@ -108,7 +108,6 @@ skip = Node::[setGLServerState description getUserObject .*UserData getGLServerS
ccFontDefinition::[*], ccFontDefinition::[*],
Object::[autorelease isEqual acceptVisitor update], Object::[autorelease isEqual acceptVisitor update],
UserDefault::[getInstance (s|g)etDataForKey], UserDefault::[getInstance (s|g)etDataForKey],
Label::[getLettersInfo],
EGLViewProtocol::[setTouchDelegate], EGLViewProtocol::[setTouchDelegate],
EGLView::[end swapBuffers], EGLView::[end swapBuffers],
NewTextureAtlas::[*], NewTextureAtlas::[*],