Merge branch 'v3' into v3-winrt-ogg

This commit is contained in:
Dale Stammen 2015-06-05 16:03:54 -07:00
commit d4c9a81908
12 changed files with 67 additions and 67 deletions

View File

@ -283,6 +283,9 @@ void Mesh::setTexture(Texture2D* tex)
auto technique = _material->_currentTechnique;
for(auto& pass: technique->_passes)
{
// FIXME: Ideally it should use glProgramState->setUniformTexture()
// and set CC_Texture0 that way. But trying to it, will trigger
// another bug
pass->setTexture(tex);
}
}

View File

@ -606,8 +606,8 @@ void Sprite3D::setTexture(const std::string& texFile)
void Sprite3D::setTexture(Texture2D* texture)
{
for (auto& state : _meshes) {
state->setTexture(texture);
for (auto mesh: _meshes) {
mesh->setTexture(texture);
}
}
AttachNode* Sprite3D::getAttachNode(const std::string& boneName)

View File

@ -359,7 +359,7 @@ GLProgramState* GLProgramState::getOrCreateWithShaders(const std::string& vertex
GLProgramState::GLProgramState()
: _uniformAttributeValueDirty(true)
, _textureUnitIndex(1)
, _textureUnitIndex(4) // first 4 textures unites are reserved for CC_Texture0-3
, _vertexAttribsFlags(0)
, _glprogram(nullptr)
, _nodeBinding(nullptr)

View File

@ -198,9 +198,7 @@ bool Material::parsePass(Technique* technique, Properties* passProperties)
while (space)
{
const char* name = space->getNamespace();
if (strcmp(name, "sampler") == 0)
parseSampler(pass, space);
else if (strcmp(name, "shader") == 0)
if (strcmp(name, "shader") == 0)
parseShader(pass, space);
else if (strcmp(name, "renderState") == 0)
parseRenderState(pass, space);
@ -216,10 +214,12 @@ bool Material::parsePass(Technique* technique, Properties* passProperties)
}
// cocos2d-x doesn't support Samplers yet. But will be added soon
bool Material::parseSampler(Pass* pass, Properties* textureProperties)
bool Material::parseSampler(GLProgramState* glProgramState, Properties* samplerProperties)
{
CCASSERT(samplerProperties->getId(), "Sampler must have an id. The id is the uniform name");
// required
auto filename = textureProperties->getString("path");
auto filename = samplerProperties->getString("path");
auto texture = Director::getInstance()->getTextureCache()->addImage(filename);
if (!texture) {
@ -234,14 +234,14 @@ bool Material::parseSampler(Pass* pass, Properties* textureProperties)
// mipmap
bool usemipmap = false;
const char* mipmap = getOptionalString(textureProperties, "mipmap", "false");
const char* mipmap = getOptionalString(samplerProperties, "mipmap", "false");
if (mipmap && strcasecmp(mipmap, "true")==0) {
texture->generateMipmap();
usemipmap = true;
}
// valid options: REPEAT, CLAMP
const char* wrapS = getOptionalString(textureProperties, "wrapS", "CLAMP_TO_EDGE");
const char* wrapS = getOptionalString(samplerProperties, "wrapS", "CLAMP_TO_EDGE");
if (strcasecmp(wrapS, "REPEAT")==0)
texParams.wrapS = GL_REPEAT;
else if(strcasecmp(wrapS, "CLAMP_TO_EDGE")==0)
@ -251,7 +251,7 @@ bool Material::parseSampler(Pass* pass, Properties* textureProperties)
// valid options: REPEAT, CLAMP
const char* wrapT = getOptionalString(textureProperties, "wrapT", "CLAMP_TO_EDGE");
const char* wrapT = getOptionalString(samplerProperties, "wrapT", "CLAMP_TO_EDGE");
if (strcasecmp(wrapT, "REPEAT")==0)
texParams.wrapT = GL_REPEAT;
else if(strcasecmp(wrapT, "CLAMP_TO_EDGE")==0)
@ -261,7 +261,7 @@ bool Material::parseSampler(Pass* pass, Properties* textureProperties)
// valid options: NEAREST, LINEAR, NEAREST_MIPMAP_NEAREST, LINEAR_MIPMAP_NEAREST, NEAREST_MIPMAP_LINEAR, LINEAR_MIPMAP_LINEAR
const char* minFilter = getOptionalString(textureProperties, "minFilter", usemipmap ? "LINEAR_MIPMAP_NEAREST" : "LINEAR");
const char* minFilter = getOptionalString(samplerProperties, "minFilter", usemipmap ? "LINEAR_MIPMAP_NEAREST" : "LINEAR");
if (strcasecmp(minFilter, "NEAREST")==0)
texParams.minFilter = GL_NEAREST;
else if(strcasecmp(minFilter, "LINEAR")==0)
@ -278,7 +278,7 @@ bool Material::parseSampler(Pass* pass, Properties* textureProperties)
CCLOG("Invalid minFilter: %s", minFilter);
// valid options: NEAREST, LINEAR
const char* magFilter = getOptionalString(textureProperties, "magFilter", "LINEAR");
const char* magFilter = getOptionalString(samplerProperties, "magFilter", "LINEAR");
if (strcasecmp(magFilter, "NEAREST")==0)
texParams.magFilter = GL_NEAREST;
else if(strcasecmp(magFilter, "LINEAR")==0)
@ -289,7 +289,7 @@ bool Material::parseSampler(Pass* pass, Properties* textureProperties)
texture->setTexParameters(texParams);
}
pass->_textures.pushBack(texture);
glProgramState->setUniformTexture(samplerProperties->getId(), texture);
return true;
}
@ -321,7 +321,16 @@ bool Material::parseShader(Pass* pass, Properties* shaderProperties)
property = shaderProperties->getNextProperty();
}
// glProgramState->updateUniformsAndAttributes();
auto space = shaderProperties->getNextNamespace();
while (space)
{
const char* name = space->getNamespace();
if (strcmp(name, "sampler") == 0)
{
parseSampler(glProgramState, space);
}
space = shaderProperties->getNextNamespace();
}
}
return true;

View File

@ -133,8 +133,8 @@ protected:
bool parseProperties(Properties* properties);
bool parseTechnique(Properties* properties);
bool parsePass(Technique* technique, Properties* properties);
bool parseSampler(Pass* pass, Properties* properties);
bool parseShader(Pass* pass, Properties* properties);
bool parseSampler(GLProgramState* glProgramState, Properties* properties);
bool parseUniform(GLProgramState* programState, Properties* properties, const char* uniformName);
bool parseRenderState(RenderState* renderState, Properties* properties);

View File

@ -129,7 +129,7 @@ uint32_t Pass::getHash() const
{
if (_hashDirty || _state->isDirty()) {
uint32_t glProgram = (uint32_t)_glProgramState->getGLProgram()->getProgram();
uint32_t textureid = (uint32_t)_textures.at(0)->getName();
uint32_t textureid = _texture ? _texture->getName() : -1;
uint32_t stateblockid = _state->getHash();
_hash = glProgram ^ textureid ^ stateblockid;

View File

@ -58,7 +58,7 @@ enum
RenderState::RenderState()
: _textures()
: _texture(nullptr)
, _hash(0)
, _hashDirty(true)
, _parent(nullptr)
@ -102,32 +102,27 @@ std::string RenderState::getName() const
}
const Vector<Texture2D*>& RenderState::getTextures() const
{
return _textures;
}
void RenderState::setTexture(Texture2D* texture)
{
if (_textures.size() > 0)
_textures.replace(0, texture);
else
_textures.pushBack(texture);
if (_texture != texture)
{
CC_SAFE_RELEASE(_texture);
_texture = texture;
CC_SAFE_RETAIN(_texture);
}
}
Texture2D* RenderState::getTexture() const
{
if (_textures.size() > 0)
return _textures.at(0);
return nullptr;
return _texture;
}
void RenderState::bind(Pass* pass)
{
CC_ASSERT(pass);
if (_textures.size() > 0)
GL::bindTexture2D(_textures.at(0)->getName());
if (_texture)
GL::bindTexture2D(_texture->getName());
// Get the combined modified state bits for our RenderState hierarchy.
long stateOverrideBits = _state ? _state->_bits : 0;
@ -193,7 +188,8 @@ void RenderState::cloneInto(RenderState* renderState) const
}
renderState->_name = _name;
renderState->_textures = _textures;
renderState->_texture = _texture;
CC_SAFE_RETAIN(renderState->_texture);
// weak ref. don't retain
renderState->_parent = _parent;
}

View File

@ -31,7 +31,6 @@
#include <functional>
#include <cstdint>
#include "renderer/CCTexture2D.h"
#include "platform/CCPlatformMacros.h"
#include "base/CCRef.h"
#include "base/ccTypes.h"
@ -65,14 +64,12 @@ public:
std::string getName() const;
const Vector<Texture2D*>& getTextures() const;
/** Replaces the texture that is at the front of _textures array.
Added to be backwards compatible.
/** Texture that will use in the CC_Texture0 uniform.
Added to be backwards compatible. Use Samplers from .material instead.
*/
void setTexture(Texture2D* texture);
/** Returns the texture that is at the front of the _textures array.
/** Returns the texture that is going to be used for CC_Texture0.
Added to be backwards compatible.
*/
Texture2D* getTexture() const;
@ -413,7 +410,7 @@ protected:
// name, for filtering
std::string _name;
Vector<Texture2D*> _textures;
Texture2D* _texture;
};
NS_CC_END

View File

@ -22,19 +22,20 @@ material spaceship
// renderState:
// resposinble for depth buffer, cullface, stencil, blending, etc.
// shader:
// responsible for the vertex and frag shaders, and its uniforms
// sampler:
// responsible for setting the texture and its parameters
// responsible for the vertex and frag shaders, and its uniforms, including the samplers
pass 0
{
shader
{
vertexShader = Shaders3D/3d_position_tex.vert
fragmentShader = Shaders3D/3d_color_tex.frag
}
sampler 0
{
path = Sprite3DTest/boss.png
// sampler:
// responsible for setting the texture and its parameters
// the Id of the sampler is the uniform name
sampler u_sampler0
{
path = Sprite3DTest/boss.png
}
}
}
}
@ -61,10 +62,6 @@ material spaceship
OutLineColor = 1,1,0
OutlineWidth = 0.04
}
sampler 0
{
path = Sprite3DTest/boss.png
}
}
// 2nd pass:
@ -85,10 +82,6 @@ material spaceship
OutLineColor = 0,0,1
OutlineWidth = 0.02
}
sampler 0
{
path = Sprite3DTest/boss.png
}
}
// 3rd pass
// Renders the model "normally"
@ -99,10 +92,10 @@ material spaceship
{
vertexShader = Shaders3D/3d_position_tex.vert
fragmentShader = Shaders3D/3d_color_tex.frag
}
sampler 0
{
path = Sprite3DTest/boss.png
sampler u_sampler0
{
path = Sprite3DTest/boss.png
}
}
}
}
@ -118,10 +111,10 @@ material spaceship
defines = MAX_POINT_LIGHT_NUM 1;MAX_SPOT_LIGHT_NUM 1;MAX_DIRECTIONAL_LIGHT_NUM 1
vertexShader = Shaders3D/3d_position_normal_tex.vert
fragmentShader = Shaders3D/3d_color_normal_tex.frag
}
sampler 0
{
path = Sprite3DTest/boss.png
sampler u_sampler0
{
path = Sprite3DTest/boss.png
}
}
}
}

View File

@ -43,6 +43,7 @@ varying vec3 v_normal;
#endif
uniform vec4 u_color;
uniform sampler2D u_sampler0;
vec3 computeLighting(vec3 normalVector, vec3 lightDirection, vec3 lightColor, float attenuation)
{
@ -101,9 +102,9 @@ void main(void)
#endif
#if ((MAX_DIRECTIONAL_LIGHT_NUM > 0) || (MAX_POINT_LIGHT_NUM > 0) || (MAX_SPOT_LIGHT_NUM > 0))
gl_FragColor = texture2D(CC_Texture0, TextureCoordOut) * u_color * combinedColor;
gl_FragColor = texture2D(u_sampler0, TextureCoordOut) * u_color * combinedColor;
#else
gl_FragColor = texture2D(CC_Texture0, TextureCoordOut) * u_color;
gl_FragColor = texture2D(u_sampler0, TextureCoordOut) * u_color;
#endif
}

View File

@ -4,9 +4,10 @@ varying mediump vec2 TextureCoordOut;
varying vec2 TextureCoordOut;
#endif
uniform vec4 u_color;
uniform sampler2D u_sampler0;
void main(void)
{
gl_FragColor = texture2D(CC_Texture0, TextureCoordOut) * u_color;
gl_FragColor = texture2D(u_sampler0, TextureCoordOut) * u_color;
}

View File

@ -8,6 +8,6 @@ void main(void)
vec4 normalproj = CC_MVPMatrix * vec4(a_normal, 0);
normalproj = normalize(normalproj);
pos.xy += normalproj.xy * (OutlineWidth * (pos.z * 0.5 + 0.5));
gl_Position = pos;
}