void Sprite3D::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) { GLProgramState* programstate = getGLProgramState(); Color4F color(getDisplayedColor()); color.a = getDisplayedOpacity() / 255.0f; GLuint textureID = _texture ? _texture->getName() : 0; _meshCommand.init(_globalZOrder, textureID, programstate, _blend, _mesh->getVertexBuffer(), _mesh->getIndexBuffer(), (GLenum)_mesh->getPrimitiveType(), (GLenum)_mesh->getIndexFormat(), _mesh->getIndexCount(), transform); _meshCommand.setCullFaceEnabled(true); _meshCommand.setDepthTestEnabled(true); if (_skin) { _meshCommand.setMatrixPaletteSize((int)_skin->getMatrixPaletteSize()); _meshCommand.setMatrixPalette(_skin->getMatrixPalette()); } //support tint and fade _meshCommand.setDisplayColor(Vec4(color.r, color.g, color.b, color.a)); Director::getInstance()->getRenderer()->addCommand(&_meshCommand); }
void Sprite3D::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) { if (_skeleton) _skeleton->updateBoneMatrix(); Color4F color(getDisplayedColor()); color.a = getDisplayedOpacity() / 255.0f; int i = 0; for (auto& mesh : _meshes) { if (!mesh->isVisible()) { i++; continue; } auto programstate = mesh->getGLProgramState(); auto& meshCommand = mesh->getMeshCommand(); GLuint textureID = mesh->getTexture() ? mesh->getTexture()->getName() : 0; meshCommand.init(_globalZOrder, textureID, programstate, _blend, mesh->getVertexBuffer(), mesh->getIndexBuffer(), mesh->getPrimitiveType(), mesh->getIndexFormat(), mesh->getIndexCount(), transform); auto skin = mesh->getSkin(); if (skin) { meshCommand.setMatrixPaletteSize((int)skin->getMatrixPaletteSize()); meshCommand.setMatrixPalette(skin->getMatrixPalette()); } //support tint and fade meshCommand.setDisplayColor(Vec4(color.r, color.g, color.b, color.a)); meshCommand.setTransparent(mesh->_isTransparent); renderer->addCommand(&meshCommand); } }
void Sprite3D::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) { if (_skeleton) _skeleton->updateBoneMatrix(); Color4F color(getDisplayedColor()); color.a = getDisplayedOpacity() / 255.0f; //check light and determine the shader used const auto& lights = Director::getInstance()->getRunningScene()->getLights(); bool usingLight = false; for (const auto light : lights) { usingLight = ((unsigned int)light->getLightFlag() & _lightMask) > 0; if (usingLight) break; } if (usingLight != _shaderUsingLight) genGLProgramState(usingLight); int i = 0; for (auto& mesh : _meshes) { if (!mesh->isVisible()) { i++; continue; } auto programstate = mesh->getGLProgramState(); auto& meshCommand = mesh->getMeshCommand(); GLuint textureID = mesh->getTexture() ? mesh->getTexture()->getName() : 0; meshCommand.init(_globalZOrder, textureID, programstate, _blend, mesh->getVertexBuffer(), mesh->getIndexBuffer(), mesh->getPrimitiveType(), mesh->getIndexFormat(), mesh->getIndexCount(), transform); meshCommand.setLightMask(_lightMask); auto skin = mesh->getSkin(); if (skin) { meshCommand.setMatrixPaletteSize((int)skin->getMatrixPaletteSize()); meshCommand.setMatrixPalette(skin->getMatrixPalette()); } //support tint and fade meshCommand.setDisplayColor(Vec4(color.r, color.g, color.b, color.a)); meshCommand.setTransparent(mesh->_isTransparent); renderer->addCommand(&meshCommand); } }
void Sprite3D::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) { #if CC_USE_CULLING // camera clipping if(Camera::getVisitingCamera() && !Camera::getVisitingCamera()->isVisibleInFrustum(&this->getAABB())) return; #endif if (_skeleton) _skeleton->updateBoneMatrix(); Color4F color(getDisplayedColor()); color.a = getDisplayedOpacity() / 255.0f; //check light and determine the shader used const auto& scene = Director::getInstance()->getRunningScene(); // Don't override GLProgramState if using manually set Material if (_usingAutogeneratedGLProgram && scene) { const auto lights = scene->getLights(); bool usingLight = false; for (const auto light : lights) { usingLight = ((unsigned int)light->getLightFlag() & _lightMask) > 0; if (usingLight) break; } if (usingLight != _shaderUsingLight) { genGLProgramState(usingLight); } } for (auto mesh: _meshes) { mesh->draw(renderer, _globalZOrder, transform, flags, _lightMask, Vec4(color.r, color.g, color.b, color.a), _forceDepthWrite); } }
void Sprite3D::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) { #if CC_USE_CULLING // camera clipping if(!Camera::getVisitingCamera()->isVisibleInFrustum(&this->getAABB())) return; #endif if (_skeleton) _skeleton->updateBoneMatrix(); Color4F color(getDisplayedColor()); color.a = getDisplayedOpacity() / 255.0f; //check light and determine the shader used const auto& scene = Director::getInstance()->getRunningScene(); if (scene) { const auto& lights = scene->getLights(); bool usingLight = false; for (const auto light : lights) { usingLight = ((unsigned int)light->getLightFlag() & _lightMask) > 0; if (usingLight) break; } if (usingLight != _shaderUsingLight) genGLProgramState(usingLight); } int i = 0; for (auto& mesh : _meshes) { if (!mesh->isVisible()) { i++; continue; } auto programstate = mesh->getGLProgramState(); auto& meshCommand = mesh->getMeshCommand(); #if (!defined NDEBUG) || (defined CC_MODEL_VIEWER) GLuint textureID = 0; if(mesh->getTexture()) { textureID = mesh->getTexture()->getName(); }else { //let the mesh use a dummy texture instead of the missing or crashing texture file auto texture = getDummyTexture(); mesh->setTexture(texture); textureID = texture->getName(); } #else GLuint textureID = mesh->getTexture() ? mesh->getTexture()->getName() : 0; #endif float globalZ = _globalZOrder; bool isTransparent = (mesh->_isTransparent || color.a < 1.f); if (isTransparent && Camera::getVisitingCamera()) { // use the view matrix for Applying to recalculating transparent mesh's Z-Order const auto& viewMat = Camera::getVisitingCamera()->getViewMatrix(); //fetch the Z from the result matrix globalZ = -(viewMat.m[2] * transform.m[12] + viewMat.m[6] * transform.m[13] + viewMat.m[10] * transform.m[14] + viewMat.m[14]); } meshCommand.init(globalZ, textureID, programstate, _blend, mesh->getVertexBuffer(), mesh->getIndexBuffer(), mesh->getPrimitiveType(), mesh->getIndexFormat(), mesh->getIndexCount(), transform, flags); meshCommand.setLightMask(_lightMask); auto skin = mesh->getSkin(); if (skin) { meshCommand.setMatrixPaletteSize((int)skin->getMatrixPaletteSize()); meshCommand.setMatrixPalette(skin->getMatrixPalette()); } //support tint and fade meshCommand.setDisplayColor(Vec4(color.r, color.g, color.b, color.a)); if (_forceDepthWrite) { meshCommand.setDepthWriteEnabled(true); } meshCommand.setTransparent(isTransparent); renderer->addCommand(&meshCommand); } }
void MeshCommand::setLightUniforms() { Director *director = Director::getInstance(); auto scene = director->getRunningScene(); const auto& conf = Configuration::getInstance(); int maxDirLight = conf->getMaxSupportDirLightInShader(); int maxPointLight = conf->getMaxSupportPointLightInShader(); int maxSpotLight = conf->getMaxSupportSpotLightInShader(); auto &lights = scene->getLights(); auto glProgram = _glProgramState->getGLProgram(); if (_glProgramState->getVertexAttribsFlags() & (1 << GLProgram::VERTEX_ATTRIB_NORMAL)) { resetLightUniformValues(); GLint enabledDirLightNum = 0; GLint enabledPointLightNum = 0; GLint enabledSpotLightNum = 0; Vec3 ambientColor; for (const auto& light : lights) { bool useLight = light->isEnabled() && ((unsigned int)light->getLightFlag() & _lightMask); if (useLight) { float intensity = light->getIntensity(); switch (light->getLightType()) { case LightType::DIRECTIONAL: { if(enabledDirLightNum < maxDirLight) { auto dirLight = static_cast<DirectionLight *>(light); Vec3 dir = dirLight->getDirectionInWorld(); dir.normalize(); const Color3B &col = dirLight->getDisplayedColor(); s_dirLightUniformColorValues[enabledDirLightNum] = Vec3(col.r / 255.0f * intensity, col.g / 255.0f * intensity, col.b / 255.0f * intensity); s_dirLightUniformDirValues[enabledDirLightNum] = dir; ++enabledDirLightNum; } } break; case LightType::POINT: { if(enabledPointLightNum < maxPointLight) { auto pointLight = static_cast<PointLight *>(light); Mat4 mat= pointLight->getNodeToWorldTransform(); const Color3B &col = pointLight->getDisplayedColor(); s_pointLightUniformColorValues[enabledPointLightNum] = Vec3(col.r / 255.0f * intensity, col.g / 255.0f * intensity, col.b / 255.0f * intensity); s_pointLightUniformPositionValues[enabledPointLightNum] = Vec3(mat.m[12], mat.m[13], mat.m[14]); s_pointLightUniformRangeInverseValues[enabledPointLightNum] = 1.0f / pointLight->getRange(); ++enabledPointLightNum; } } break; case LightType::SPOT: { if(enabledSpotLightNum < maxSpotLight) { auto spotLight = static_cast<SpotLight *>(light); Vec3 dir = spotLight->getDirectionInWorld(); dir.normalize(); Mat4 mat= light->getNodeToWorldTransform(); const Color3B &col = spotLight->getDisplayedColor(); s_spotLightUniformColorValues[enabledSpotLightNum] = Vec3(col.r / 255.0f * intensity, col.g / 255.0f * intensity, col.b / 255.0f * intensity); s_spotLightUniformPositionValues[enabledSpotLightNum] = Vec3(mat.m[12], mat.m[13], mat.m[14]); s_spotLightUniformDirValues[enabledSpotLightNum] = dir; s_spotLightUniformInnerAngleCosValues[enabledSpotLightNum] = spotLight->getCosInnerAngle(); s_spotLightUniformOuterAngleCosValues[enabledSpotLightNum] = spotLight->getCosOuterAngle(); s_spotLightUniformRangeInverseValues[enabledSpotLightNum] = 1.0f / spotLight->getRange(); ++enabledSpotLightNum; } } break; case LightType::AMBIENT: { auto ambLight = static_cast<AmbientLight *>(light); const Color3B &col = ambLight->getDisplayedColor(); ambientColor += Vec3(col.r / 255.0f * intensity, col.g / 255.0f * intensity, col.b / 255.0f * intensity); } break; default: break; } } } if (0 < maxDirLight) { glProgram->setUniformLocationWith3fv((GLint)glProgram->getUniformLocationForName(s_dirLightUniformColorName), (GLfloat*)(&s_dirLightUniformColorValues[0]), (unsigned int)s_dirLightUniformColorValues.size()); glProgram->setUniformLocationWith3fv((GLint)glProgram->getUniformLocationForName(s_dirLightUniformDirName), (GLfloat*)(&s_dirLightUniformDirValues[0]), (unsigned int)s_dirLightUniformDirValues.size()); } if (0 < maxPointLight) { glProgram->setUniformLocationWith3fv((GLint)glProgram->getUniformLocationForName(s_pointLightUniformColorName), (GLfloat*)(&s_pointLightUniformColorValues[0]), (unsigned int)s_pointLightUniformColorValues.size()); glProgram->setUniformLocationWith3fv((GLint)glProgram->getUniformLocationForName(s_pointLightUniformPositionName), (GLfloat*)(&s_pointLightUniformPositionValues[0]), (unsigned int)s_pointLightUniformPositionValues.size()); glProgram->setUniformLocationWith1fv((GLint)glProgram->getUniformLocationForName(s_pointLightUniformRangeInverseName), (GLfloat*)(&s_pointLightUniformRangeInverseValues[0]), (unsigned int)s_pointLightUniformRangeInverseValues.size()); } if (0 < maxSpotLight) { glProgram->setUniformLocationWith3fv((GLint)glProgram->getUniformLocationForName(s_spotLightUniformColorName), (GLfloat*)(&s_spotLightUniformColorValues[0]), (unsigned int)s_spotLightUniformColorValues.size()); glProgram->setUniformLocationWith3fv((GLint)glProgram->getUniformLocationForName(s_spotLightUniformPositionName), (GLfloat*)(&s_spotLightUniformPositionValues[0]), (unsigned int)s_spotLightUniformPositionValues.size()); glProgram->setUniformLocationWith3fv((GLint)glProgram->getUniformLocationForName(s_spotLightUniformDirName), (GLfloat*)(&s_spotLightUniformDirValues[0]), (unsigned int)s_spotLightUniformDirValues.size()); glProgram->setUniformLocationWith1fv((GLint)glProgram->getUniformLocationForName(s_spotLightUniformInnerAngleCosName), (GLfloat*)(&s_spotLightUniformInnerAngleCosValues[0]), (unsigned int)s_spotLightUniformInnerAngleCosValues.size()); glProgram->setUniformLocationWith1fv((GLint)glProgram->getUniformLocationForName(s_spotLightUniformOuterAngleCosName), (GLfloat*)(&s_spotLightUniformOuterAngleCosValues[0]), (unsigned int)s_spotLightUniformOuterAngleCosValues.size()); glProgram->setUniformLocationWith1fv((GLint)glProgram->getUniformLocationForName(s_spotLightUniformRangeInverseName), (GLfloat*)(&s_spotLightUniformRangeInverseValues[0]), (unsigned int)s_spotLightUniformRangeInverseValues.size()); } glProgram->setUniformLocationWith3f(glProgram->getUniformLocationForName(s_ambientLightUniformColorName), ambientColor.x, ambientColor.y, ambientColor.z); } else // normal does not exist { Vec3 ambient(0.0f, 0.0f, 0.0f); bool hasAmbient; for (const auto& light : lights) { if (light->getLightType() == LightType::AMBIENT) { bool useLight = light->isEnabled() && ((unsigned int)light->getLightFlag() & _lightMask); if (useLight) { hasAmbient = true; const Color3B &col = light->getDisplayedColor(); ambient.x += col.r * light->getIntensity(); ambient.y += col.g * light->getIntensity(); ambient.z += col.b * light->getIntensity(); } } } if (hasAmbient) { ambient.x /= 255.f; ambient.y /= 255.f; ambient.z /= 255.f; } glProgram->setUniformLocationWith4f(glProgram->getUniformLocationForName("u_color"), _displayColor.x * ambient.x, _displayColor.y * ambient.y, _displayColor.z * ambient.z, _displayColor.w); } }