Merge pull request #14715 from liamcindy/v3_textureCache

update for 3D object render, revert old changes
This commit is contained in:
XiaoYang 2015-12-18 21:22:31 +08:00
commit 593a619dc8
15 changed files with 98 additions and 117 deletions

View File

@ -133,7 +133,6 @@ Mesh::Mesh()
, _blendDirty(true)
, _force2DQueue(false)
, _texFile("")
, _enableCheckTexture(false)
{
}
@ -282,7 +281,7 @@ void Mesh::setTexture(Texture2D* tex)
setTexture(tex, NTextureData::Usage::Diffuse);
}
void Mesh::setTexture(Texture2D* tex, NTextureData::Usage usage)
void Mesh::setTexture(Texture2D* tex, NTextureData::Usage usage, bool cacheFileName)
{
// Texture must be saved for future use
// it doesn't matter if the material is already set or not
@ -307,6 +306,7 @@ void Mesh::setTexture(Texture2D* tex, NTextureData::Usage usage)
}
bindMeshCommand();
if (cacheFileName)
_texFile = tex->getPath();
}
else if (usage == NTextureData::Usage::Normal) // currently only diffuse and normal are supported
@ -382,9 +382,6 @@ void Mesh::draw(Renderer* renderer, float globalZOrder, const Mat4& transform, u
if (isTransparent)
flags |= Node::FLAGS_RENDER_AS_3D;
if (_enableCheckTexture)
this->checkTexture();
_meshCommand.init(globalZ,
_material,
getVertexBuffer(),
@ -706,39 +703,4 @@ GLuint Mesh::getIndexBuffer() const
{
return _meshIndexData->getIndexBuffer()->getVBO();
}
void Mesh::checkTexture()
{
Texture2D* cacheTex = nullptr;
auto& texture = _textures[NTextureData::Usage::Diffuse];
if (Director::getInstance()->getTextureCache()->isDirty())
{
cacheTex = Director::getInstance()->getTextureCache()->getTextureForKey(_texFile);
if (cacheTex == nullptr)
{
cacheTex = getDummyTexture();
}
}
else if (texture != nullptr && !texture->isValid())
{
cacheTex = getDummyTexture();
}
if (cacheTex != nullptr && texture != cacheTex)
{
CC_SAFE_RETAIN(cacheTex);
CC_SAFE_RELEASE(texture);
texture = cacheTex;
if (_material) {
auto technique = _material->_currentTechnique;
for (auto& pass : technique->_passes)
{
pass->setTexture(texture);
}
}
bindMeshCommand();
}
}
NS_CC_END

View File

@ -109,8 +109,9 @@ public:
* set texture
* @param tex texture to be set
* @param usage Usage of this texture
* @param whether refresh the cache file name
*/
void setTexture(Texture2D* tex, NTextureData::Usage usage);
void setTexture(Texture2D* tex, NTextureData::Usage usage,bool cacheFileName = true);
/**
* set texture
* @param texPath texture path
@ -224,19 +225,7 @@ public:
*/
void setForce2DQueue(bool force2D) { _force2DQueue = force2D; }
/**
* check texture
*/
void checkTexture();
/**
* set enable check texture, check texture each frame if enable is true. It is false by default
*/
void setEnableCheckTexture(bool enableCheckTexture) { _enableCheckTexture = enableCheckTexture; }
/**
* check texture each frame?
*/
bool enableCheckTexture() const { return _enableCheckTexture; }
std::string getTextureFileName(){ return _texFile; }
CC_CONSTRUCTOR_ACCESS:
@ -280,7 +269,6 @@ protected:
std::vector<float> _spotLightUniformRangeInverseValues;
std::string _texFile;
bool _enableCheckTexture;
};
// end of 3d group

View File

@ -328,9 +328,6 @@ void Director::drawScene()
{
calculateMPF();
}
if (_textureCache != nullptr)
_textureCache->setDirty(false);
}
void Director::calculateDeltaTime()

View File

@ -406,10 +406,6 @@ public:
/** Get a shader program from the texture.*/
GLProgram* getGLProgram() const;
/** Set if the texture is valid, when it been set as false, it will display as default "file missing texture" */
void setValid(bool valid) { _valid = valid; }
bool isValid() const { return _valid; }
std::string getPath()const { return _filePath; }
public:

View File

@ -59,7 +59,6 @@ TextureCache::TextureCache()
: _loadingThread(nullptr)
, _needQuit(false)
, _asyncRefCount(0)
, _dirty(false)
{
}
@ -496,8 +495,7 @@ void TextureCache::removeTexture(Texture2D* texture)
for( auto it=_textures.cbegin(); it!=_textures.cend(); /* nothing */ ) {
if( it->second == texture ) {
texture->setValid(false);
texture->autorelease();
it->second->release();
_textures.erase(it++);
break;
} else
@ -516,8 +514,7 @@ void TextureCache::removeTextureForKey(const std::string &textureKeyName)
}
if( it != _textures.end() ) {
it->second->setValid(false);
(it->second)->autorelease();
it->second->release();
_textures.erase(it);
}
}
@ -626,7 +623,6 @@ void TextureCache::renameTextureWithKey(const std::string srcName, const std::st
tex->initWithImage(image);
_textures.insert(std::make_pair(fullpath, tex));
_textures.erase(it);
this->setDirty(true);
}
CC_SAFE_DELETE(image);
}

View File

@ -204,9 +204,6 @@ public:
*/
const std::string getTextureFilePath(Texture2D* texture)const;
void setDirty(bool dirty) { _dirty = dirty; }
bool isDirty() const { return _dirty; }
/** Reload texture from a new file.
* This function is mainly for editor, won't suggest use it in game for performance reason.
*
@ -242,8 +239,6 @@ protected:
int _asyncRefCount;
std::unordered_map<std::string, Texture2D*> _textures;
bool _dirty;
};
#if CC_ENABLE_CACHE_TEXTURE_DATA

View File

@ -43,6 +43,7 @@ Particle3DQuadRender::Particle3DQuadRender()
, _glProgramState(nullptr)
, _indexBuffer(nullptr)
, _vertexBuffer(nullptr)
, _texFile("")
{
}
@ -60,6 +61,7 @@ Particle3DQuadRender* Particle3DQuadRender::create(const std::string& texFile)
auto ret = new (std::nothrow)Particle3DQuadRender();
if (ret && ret->initQuadRender(texFile))
{
ret->_texFile = texFile;
ret->autorelease();
}
else
@ -187,6 +189,8 @@ bool Particle3DQuadRender::initQuadRender( const std::string& texFile )
_texture = tex;
glProgram = GLProgramCache::getInstance()->getGLProgram(GLProgram::SHADER_3D_PARTICLE_TEXTURE);
}
else
_texture = nullptr;
}
auto glProgramState = GLProgramState::create(glProgram);
glProgramState->retain();
@ -213,6 +217,11 @@ bool Particle3DQuadRender::initQuadRender( const std::string& texFile )
return true;
}
void Particle3DQuadRender::reset()
{
this->initQuadRender(_texFile);
}
//////////////////////////////////////////////////////////////////////////////
Particle3DModelRender::Particle3DModelRender()
: _spriteSize(Vec3::ONE)
@ -284,6 +293,14 @@ void Particle3DModelRender::render(Renderer* renderer, const Mat4 &transform, Pa
}
}
void Particle3DModelRender::reset()
{
for (auto iter : _spriteList){
iter->release();
}
_spriteList.clear();
}
// MARK: Particle3DRender
Particle3DRender::Particle3DRender()

View File

@ -73,6 +73,8 @@ public:
void copyAttributesTo (Particle3DRender *render);
virtual void reset(){}
CC_CONSTRUCTOR_ACCESS:
Particle3DRender();
virtual ~Particle3DRender();
@ -94,6 +96,7 @@ public:
virtual void render(Renderer* renderer, const Mat4 &transform, ParticleSystem3D* particleSystem) override;
virtual void reset()override;
CC_CONSTRUCTOR_ACCESS:
Particle3DQuadRender();
virtual ~Particle3DQuadRender();
@ -118,6 +121,7 @@ protected:
std::vector<posuvcolor> _posuvcolors; //vertex data
std::vector<unsigned short> _indexData; //index data
std::string _texFile;
};
// particle render for Sprite3D
@ -128,6 +132,7 @@ public:
virtual void render(Renderer* renderer, const Mat4 &transform, ParticleSystem3D* particleSystem) override;
virtual void reset()override;
CC_CONSTRUCTOR_ACCESS:
Particle3DModelRender();
virtual ~Particle3DModelRender();

View File

@ -204,6 +204,10 @@ public:
* set particle render, can set your own particle render
*/
void setRender(Particle3DRender* render);
/**
* return particle render
*/
Particle3DRender* getRender(){ return _render; }
/**
* add particle affector
*/

View File

@ -733,21 +733,15 @@ void PUBillboardChain::setBlendFunc(const BlendFunc& blendFunc)
}
GLuint PUBillboardChain::getTextureName()
{
if (Director::getInstance()->getTextureCache()->isDirty())
{
if (Director::getInstance()->getTextureCache()->getTextureForKey(_texFile) == nullptr)
{
_texture = nullptr;
this->init("");
}
else
this->init(_texFile);
}
else if (_texture != nullptr && !_texture->isValid())
else if (_texture == nullptr)
{
_texture = nullptr;
this->init("");
this->init(_texFile);
}
if (_texture == nullptr)

View File

@ -244,7 +244,7 @@ void PUParticle3DQuadRender::render(Renderer* renderer, const Mat4 &transform, P
_stateBlock->setBlendFunc(particleSystem->getBlendFunc());
GLuint texId = this->getTextureName();
GLuint texId = (_texture ? _texture->getName() : 0);
_meshCommand->init(0,
texId,
_glProgramState,
@ -525,6 +525,14 @@ PUParticle3DModelRender* PUParticle3DModelRender::clone()
return mr;
}
void PUParticle3DModelRender::reset()
{
for (auto iter : _spriteList){
iter->release();
}
_spriteList.clear();
}
PUParticle3DEntityRender::PUParticle3DEntityRender()
: _meshCommand(nullptr)
@ -564,6 +572,8 @@ bool PUParticle3DEntityRender::initRender( const std::string &texFile )
_texture = tex;
glProgram = GLProgramCache::getInstance()->getGLProgram(GLProgram::SHADER_3D_PARTICLE_TEXTURE);
}
else
_texture = nullptr;
}
auto glProgramState = GLProgramState::create(glProgram);
glProgramState->retain();
@ -587,35 +597,16 @@ bool PUParticle3DEntityRender::initRender( const std::string &texFile )
return true;
}
GLuint PUParticle3DEntityRender::getTextureName()
{
if (Director::getInstance()->getTextureCache()->isDirty())
{
if (Director::getInstance()->getTextureCache()->getTextureForKey(_texFile) == nullptr)
{
_texture = nullptr;
this->initRender("");
}
else
this->initRender(_texFile);
}
else if (_texture != nullptr && !_texture->isValid())
{
_texture = nullptr;
this->initRender("");
}
if (_texture == nullptr)
return 0;
return _texture->getName();
}
void PUParticle3DEntityRender::copyAttributesTo(PUParticle3DEntityRender *render)
{
PURender::copyAttributesTo(render);
}
void PUParticle3DEntityRender::reset()
{
this->initRender(_texFile);
}
PUParticle3DBoxRender::PUParticle3DBoxRender()
{
autoRotate = false;
@ -725,7 +716,7 @@ void PUParticle3DBoxRender::render( Renderer* renderer, const Mat4 &transform, P
_vertexBuffer->updateVertices(&_vertices[0], vertexindex/* * sizeof(_posuvcolors[0])*/, 0);
_indexBuffer->updateIndices(&_indices[0], index/* * sizeof(unsigned short)*/, 0);
GLuint texId = this->getTextureName();
GLuint texId = (_texture ? _texture->getName() : 0);
_stateBlock->setBlendFunc(_particleSystem->getBlendFunc());
_meshCommand->init(0,
texId,
@ -889,8 +880,7 @@ void PUSphereRender::render( Renderer* renderer, const Mat4 &transform, Particle
_vertexBuffer->updateVertices(&_vertices[0], vertexindex/* * sizeof(_posuvcolors[0])*/, 0);
_indexBuffer->updateIndices(&_indices[0], index/* * sizeof(unsigned short)*/, 0);
GLuint texId = this->getTextureName();
GLuint texId = (_texture ? _texture->getName() : 0);
_stateBlock->setBlendFunc(particleSystem->getBlendFunc());
_meshCommand->init(
0,

View File

@ -65,7 +65,7 @@ class CC_DLL PUParticle3DEntityRender : public PURender
{
public:
void copyAttributesTo(PUParticle3DEntityRender *render);
virtual void reset()override;
CC_CONSTRUCTOR_ACCESS:
PUParticle3DEntityRender();
virtual ~PUParticle3DEntityRender();
@ -73,8 +73,6 @@ CC_CONSTRUCTOR_ACCESS:
protected:
bool initRender(const std::string &texFile);
GLuint getTextureName();
protected:
struct VertexInfo
@ -189,6 +187,7 @@ public:
virtual PUParticle3DModelRender* clone() override;
void copyAttributesTo(PUParticle3DModelRender *render);
virtual void reset()override;
CC_CONSTRUCTOR_ACCESS:
PUParticle3DModelRender();
virtual ~PUParticle3DModelRender();

View File

@ -21,6 +21,7 @@
#include "ExtensionDeprecated.h"
// Particle System, include Particle Universe Particle System
#include "Particle3D/CCParticle3DRender.h"
#include "Particle3D/CCParticleSystem3D.h"
#include "Particle3D/PU/CCPUParticleSystem3D.h"

View File

@ -2602,6 +2602,7 @@ Sprite3DPropertyTest::Sprite3DPropertyTest()
_sprite->setPosition(20.f, 0.f);
_sprite->setRotation3D(Vec3(0, 180, 0));
_meshTex = _sprite->getMesh()->getTexture();
_texFile = _meshTex->getPath();
addChild(_sprite);
setCameraMask(2);
@ -2616,11 +2617,14 @@ Sprite3DPropertyTest::Sprite3DPropertyTest()
auto item1 = MenuItemLabel::create(label1, CC_CALLBACK_1(Sprite3DPropertyTest::printMeshName, this));
auto label2 = Label::createWithTTF(ttfConfig, "Remove Used Texture");
auto item2 = MenuItemLabel::create(label2, CC_CALLBACK_1(Sprite3DPropertyTest::removeUsedTexture, this));
auto label3 = Label::createWithTTF(ttfConfig, "Reset");
auto item3 = MenuItemLabel::create(label3, CC_CALLBACK_1(Sprite3DPropertyTest::resetTexture, this));
item1->setPosition(Vec2(VisibleRect::left().x + 100, VisibleRect::bottom().y + item1->getContentSize().height * 4));
item2->setPosition(Vec2(VisibleRect::left().x + 100, VisibleRect::bottom().y + item1->getContentSize().height * 5));
item3->setPosition(Vec2(VisibleRect::left().x + 100, VisibleRect::bottom().y + item1->getContentSize().height * 6));
auto pMenu1 = Menu::create(item1, item2, nullptr);
auto pMenu1 = Menu::create(item1, item2, item3,nullptr);
pMenu1->setPosition(Vec2(0, 0));
this->addChild(pMenu1, 10);
@ -2654,5 +2658,34 @@ void Sprite3DPropertyTest::removeUsedTexture(cocos2d::Ref* sender)
if (_meshTex != nullptr)
{
TextureCache::getInstance()->removeTexture(_meshTex);
this->refreshSpriteRender();
}
}
void Sprite3DPropertyTest::resetTexture(cocos2d::Ref* sender)
{
if (_meshTex != nullptr)
{
_meshTex = TextureCache::getInstance()->addImage(_texFile);
this->refreshSpriteRender();
}
}
void Sprite3DPropertyTest::refreshSpriteRender()
{
Vector<Mesh*> meshes = _sprite->getMeshes();
for (Mesh* mesh : meshes)
{
std::string file = mesh->getTextureFileName();
Texture2D* cacheTex = Director::getInstance()->getTextureCache()->getTextureForKey(file);
if (cacheTex == nullptr)
{
unsigned char data[] = { 255, 0, 0, 255 };//1*1 red picture
Image * image = new (std::nothrow) Image();
image->initWithRawData(data, sizeof(data), 1, 1, sizeof(unsigned char));
cacheTex = Director::getInstance()->getTextureCache()->addImage(image, "/dummyTexture");
image->release();
}
mesh->setTexture(cacheTex, cocos2d::NTextureData::Usage::Diffuse, false);
}
}

View File

@ -606,9 +606,13 @@ public:
void printMeshName(cocos2d::Ref* sender);
void removeUsedTexture(cocos2d::Ref* sender);
void resetTexture(cocos2d::Ref* sender);
void refreshSpriteRender();
protected:
cocos2d::Sprite3D* _sprite;
cocos2d::Texture2D* _meshTex;
std::string _texFile;
};
#endif