2010-07-08 10:26:58 +08:00
|
|
|
/****************************************************************************
|
|
|
|
Copyright (c) 2010 cocos2d-x.org
|
|
|
|
|
|
|
|
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 "CCAtlasNode.h"
|
2010-07-22 18:39:40 +08:00
|
|
|
#include "CCTextureAtlas.h"
|
2010-07-08 10:26:58 +08:00
|
|
|
|
2010-08-04 15:46:12 +08:00
|
|
|
namespace cocos2d {
|
|
|
|
|
2010-07-19 16:45:53 +08:00
|
|
|
// implementation CCAtlasNode
|
|
|
|
|
|
|
|
// CCAtlasNode - Creation & Init
|
|
|
|
|
|
|
|
CCAtlasNode::CCAtlasNode()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
CCAtlasNode::~CCAtlasNode()
|
|
|
|
{
|
|
|
|
m_pTextureAtlas->release();
|
|
|
|
}
|
|
|
|
|
2010-07-22 11:15:25 +08:00
|
|
|
CCAtlasNode * CCAtlasNode::atlasWithTileFile(const char *tile, int tileWidth, int tileHeight, int itemsToRender)
|
2010-07-19 16:45:53 +08:00
|
|
|
{
|
2010-09-04 12:02:52 +08:00
|
|
|
CCAtlasNode * pRet = new CCAtlasNode();
|
|
|
|
if (pRet->initWithTileFile(tile, tileWidth, tileHeight, itemsToRender))
|
|
|
|
{
|
|
|
|
pRet->autorelease();
|
|
|
|
return pRet;
|
|
|
|
}
|
|
|
|
CCX_SAFE_DELETE(pRet);
|
|
|
|
return NULL;
|
2010-07-19 16:45:53 +08:00
|
|
|
}
|
|
|
|
|
2010-09-04 12:02:52 +08:00
|
|
|
bool CCAtlasNode::initWithTileFile(const char *tile, int tileWidth, int tileHeight, int itemsToRender)
|
2010-07-19 16:45:53 +08:00
|
|
|
{
|
2010-09-04 12:02:52 +08:00
|
|
|
assert(tile != NULL);
|
2010-12-23 11:19:56 +08:00
|
|
|
m_nItemWidth = tileWidth * CC_CONTENT_SCALE_FACTOR();
|
|
|
|
m_nItemHeight = tileHeight * CC_CONTENT_SCALE_FACTOR();
|
2010-07-19 16:45:53 +08:00
|
|
|
|
|
|
|
m_cOpacity = 255;
|
|
|
|
m_tColor = m_tColorUnmodified = ccWHITE;
|
2010-07-20 13:49:13 +08:00
|
|
|
m_bIsOpacityModifyRGB = true;
|
2010-07-19 16:45:53 +08:00
|
|
|
|
|
|
|
m_tBlendFunc.src = CC_BLEND_SRC;
|
|
|
|
m_tBlendFunc.dst = CC_BLEND_DST;
|
|
|
|
|
|
|
|
// double retain to avoid the autorelease pool
|
|
|
|
// also, using: self.textureAtlas supports re-initialization without leaking
|
|
|
|
this->m_pTextureAtlas = new CCTextureAtlas();
|
|
|
|
m_pTextureAtlas->initWithFile(tile, itemsToRender);
|
2010-12-23 11:19:56 +08:00
|
|
|
|
|
|
|
if (! m_pTextureAtlas)
|
|
|
|
{
|
|
|
|
CCLOG("cocos2d: Could not initialize CCAtlasNode. Invalid Texture.");
|
|
|
|
delete this;
|
|
|
|
return false;
|
|
|
|
}
|
2010-07-19 16:45:53 +08:00
|
|
|
|
|
|
|
this->updateBlendFunc();
|
|
|
|
this->updateOpacityModifyRGB();
|
|
|
|
|
|
|
|
this->calculateMaxItems();
|
|
|
|
|
2010-09-04 12:02:52 +08:00
|
|
|
return true;
|
2010-07-19 16:45:53 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// CCAtlasNode - Atlas generation
|
|
|
|
|
|
|
|
void CCAtlasNode::calculateMaxItems()
|
|
|
|
{
|
2010-12-23 11:19:56 +08:00
|
|
|
CGSize s = m_pTextureAtlas->getTexture()->getContentSizeInPixels();
|
2010-08-31 11:20:37 +08:00
|
|
|
m_nItemsPerColumn = (int)(s.height / m_nItemHeight);
|
|
|
|
m_nItemsPerRow = (int)(s.width / m_nItemWidth);
|
2010-07-19 16:45:53 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void CCAtlasNode::updateAtlasValues()
|
2010-07-08 10:26:58 +08:00
|
|
|
{
|
2010-07-19 16:45:53 +08:00
|
|
|
NSAssert(false, "CCAtlasNode:Abstract updateAtlasValue not overriden");
|
|
|
|
//[NSException raise:@"CCAtlasNode:Abstract" format:@"updateAtlasValue not overriden"];
|
|
|
|
}
|
|
|
|
|
|
|
|
// CCAtlasNode - draw
|
|
|
|
void CCAtlasNode::draw()
|
|
|
|
{
|
|
|
|
// Default GL states: GL_TEXTURE_2D, GL_VERTEX_ARRAY, GL_COLOR_ARRAY, GL_TEXTURE_COORD_ARRAY
|
|
|
|
// Needed states: GL_TEXTURE_2D, GL_VERTEX_ARRAY, GL_TEXTURE_COORD_ARRAY
|
|
|
|
// Unneeded states: GL_COLOR_ARRAY
|
|
|
|
glDisableClientState(GL_COLOR_ARRAY);
|
|
|
|
|
|
|
|
glColor4ub( m_tColor.r, m_tColor.g, m_tColor.b, m_cOpacity);
|
2010-07-08 10:26:58 +08:00
|
|
|
|
2010-12-23 11:19:56 +08:00
|
|
|
bool newBlend = m_tBlendFunc.src != CC_BLEND_SRC || m_tBlendFunc.dst != CC_BLEND_DST;
|
|
|
|
if(newBlend)
|
2010-07-19 16:45:53 +08:00
|
|
|
{
|
|
|
|
glBlendFunc( m_tBlendFunc.src, m_tBlendFunc.dst );
|
|
|
|
}
|
|
|
|
|
|
|
|
m_pTextureAtlas->drawQuads();
|
|
|
|
|
|
|
|
if( newBlend )
|
|
|
|
glBlendFunc(CC_BLEND_SRC, CC_BLEND_DST);
|
|
|
|
|
|
|
|
// is this chepear than saving/restoring color state ?
|
|
|
|
// XXX: There is no need to restore the color to (255,255,255,255). Objects should use the color
|
|
|
|
// XXX: that they need
|
|
|
|
// glColor4ub( 255, 255, 255, 255);
|
|
|
|
|
|
|
|
// restore default GL state
|
|
|
|
glEnableClientState(GL_COLOR_ARRAY);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// CCAtlasNode - RGBA protocol
|
|
|
|
|
2010-07-20 13:49:13 +08:00
|
|
|
ccColor3B CCAtlasNode:: getColor()
|
2010-07-19 16:45:53 +08:00
|
|
|
{
|
2010-07-20 13:49:13 +08:00
|
|
|
if(m_bIsOpacityModifyRGB)
|
2010-07-19 16:45:53 +08:00
|
|
|
{
|
|
|
|
return m_tColorUnmodified;
|
|
|
|
}
|
2010-07-08 10:26:58 +08:00
|
|
|
return m_tColor;
|
|
|
|
}
|
|
|
|
|
|
|
|
void CCAtlasNode::setColor(ccColor3B color3)
|
|
|
|
{
|
2010-07-19 16:45:53 +08:00
|
|
|
m_tColor = m_tColorUnmodified = color3;
|
|
|
|
|
2010-07-20 13:49:13 +08:00
|
|
|
if( m_bIsOpacityModifyRGB )
|
2010-07-19 16:45:53 +08:00
|
|
|
{
|
|
|
|
m_tColor.r = color3.r * m_cOpacity/255;
|
|
|
|
m_tColor.g = color3.g * m_cOpacity/255;
|
|
|
|
m_tColor.b = color3.b * m_cOpacity/255;
|
|
|
|
}
|
2010-07-08 10:26:58 +08:00
|
|
|
}
|
|
|
|
|
2010-07-20 13:49:13 +08:00
|
|
|
GLubyte CCAtlasNode::getOpacity()
|
2010-07-19 16:45:53 +08:00
|
|
|
{
|
|
|
|
return m_cOpacity;
|
|
|
|
}
|
2010-07-08 10:26:58 +08:00
|
|
|
|
|
|
|
void CCAtlasNode::setOpacity(GLubyte opacity)
|
|
|
|
{
|
|
|
|
m_cOpacity = opacity;
|
|
|
|
|
2010-07-19 16:45:53 +08:00
|
|
|
// special opacity for premultiplied textures
|
2010-07-20 13:49:13 +08:00
|
|
|
if( m_bIsOpacityModifyRGB )
|
2010-12-23 11:19:56 +08:00
|
|
|
this->setColor(m_tColorUnmodified);
|
2010-07-19 16:45:53 +08:00
|
|
|
}
|
|
|
|
|
2010-07-20 13:49:13 +08:00
|
|
|
void CCAtlasNode::setIsOpacityModifyRGB(bool bValue)
|
2010-07-19 16:45:53 +08:00
|
|
|
{
|
|
|
|
ccColor3B oldColor = this->m_tColor;
|
2010-07-20 13:49:13 +08:00
|
|
|
m_bIsOpacityModifyRGB = bValue;
|
2010-07-19 16:45:53 +08:00
|
|
|
this->m_tColor = oldColor;
|
|
|
|
}
|
|
|
|
|
2010-07-20 13:49:13 +08:00
|
|
|
bool CCAtlasNode::getIsOpacityModifyRGB()
|
2010-07-19 16:45:53 +08:00
|
|
|
{
|
2010-07-20 13:49:13 +08:00
|
|
|
return m_bIsOpacityModifyRGB;
|
2010-07-19 16:45:53 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void CCAtlasNode::updateOpacityModifyRGB()
|
|
|
|
{
|
2010-07-20 13:49:13 +08:00
|
|
|
m_bIsOpacityModifyRGB = m_pTextureAtlas->getTexture()->getHasPremultipliedAlpha();
|
2010-07-19 16:45:53 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// CCAtlasNode - CocosNodeTexture protocol
|
|
|
|
|
2010-07-20 13:49:13 +08:00
|
|
|
ccBlendFunc CCAtlasNode::getBlendFunc()
|
|
|
|
{
|
|
|
|
return m_tBlendFunc;
|
|
|
|
}
|
|
|
|
|
|
|
|
void CCAtlasNode::setBlendFunc(ccBlendFunc blendFunc)
|
|
|
|
{
|
|
|
|
m_tBlendFunc = blendFunc;
|
|
|
|
}
|
|
|
|
|
2010-07-19 16:45:53 +08:00
|
|
|
void CCAtlasNode::updateBlendFunc()
|
|
|
|
{
|
|
|
|
if( ! m_pTextureAtlas->getTexture()->getHasPremultipliedAlpha() ) {
|
|
|
|
m_tBlendFunc.src = GL_SRC_ALPHA;
|
|
|
|
m_tBlendFunc.dst = GL_ONE_MINUS_SRC_ALPHA;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void CCAtlasNode::setTexture(CCTexture2D *texture)
|
|
|
|
{
|
|
|
|
m_pTextureAtlas->setTexture(texture);
|
|
|
|
this->updateBlendFunc();
|
|
|
|
this->updateOpacityModifyRGB();
|
|
|
|
}
|
|
|
|
|
2010-07-20 13:49:13 +08:00
|
|
|
CCTexture2D * CCAtlasNode::getTexture()
|
2010-07-19 16:45:53 +08:00
|
|
|
{
|
|
|
|
return m_pTextureAtlas->getTexture();
|
2010-08-04 15:46:12 +08:00
|
|
|
}
|
2010-07-08 10:26:58 +08:00
|
|
|
|
2010-09-04 18:06:26 +08:00
|
|
|
void CCAtlasNode::setTextureAtlas(CCTextureAtlas* var)
|
|
|
|
{
|
2010-09-27 18:19:10 +08:00
|
|
|
CCX_SAFE_RETAIN(var);
|
2010-09-06 13:52:57 +08:00
|
|
|
CCX_SAFE_RELEASE(m_pTextureAtlas);
|
2010-09-04 18:06:26 +08:00
|
|
|
m_pTextureAtlas = var;
|
|
|
|
}
|
|
|
|
CCTextureAtlas * CCAtlasNode::getTextureAtlas()
|
|
|
|
{
|
|
|
|
return m_pTextureAtlas;
|
|
|
|
}
|
|
|
|
|
2010-08-04 15:46:12 +08:00
|
|
|
} // namespace cocos2d
|