KRSprite objects now have their own shader, rather than sharing the "Flare" shader.
Implemented per-sprite alpha. --HG-- branch : nfb
This commit is contained in:
@@ -333,6 +333,7 @@ void KRLight::render(KRCamera *pCamera, std::vector<KRPointLight *> &point_light
|
||||
// Render light flare on transparency pass
|
||||
KRShader *pShader = getContext().getShaderManager()->getShader("flare", pCamera, point_lights, directional_lights, spot_lights, 0, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, renderPass);
|
||||
if(getContext().getShaderManager()->selectShader(*pCamera, pShader, viewport, getModelMatrix(), point_lights, directional_lights, spot_lights, 0, renderPass)) {
|
||||
pShader->setUniform(KRShader::KRENGINE_UNIFORM_MATERIAL_ALPHA, 1.0f);
|
||||
pShader->setUniform(KRShader::KRENGINE_UNIFORM_FLARE_SIZE, m_flareSize);
|
||||
m_pContext->getTextureManager()->selectTexture(0, m_pFlareTexture);
|
||||
m_pContext->getModelManager()->bindVBO(getContext().getModelManager()->KRENGINE_VBO_2D_SQUARE_VERTICES, getContext().getModelManager()->KRENGINE_VBO_2D_SQUARE_INDEXES, getContext().getModelManager()->KRENGINE_VBO_2D_SQUARE_ATTRIBS, true);
|
||||
|
||||
@@ -36,21 +36,15 @@ KRMeshQuad::KRMeshQuad(KRContext &context) : KRMesh(context, "__quad")
|
||||
{
|
||||
KRMesh::mesh_info mi;
|
||||
|
||||
mi.vertices.push_back(KRVector3(-1.0f, -1.0f, 0.0f));
|
||||
mi.vertices.push_back(KRVector3(1.0f, -1.0f, 0.0f));
|
||||
mi.vertices.push_back(KRVector3(-1.0f, 1.0f, 0.0f));
|
||||
mi.vertices.push_back(KRVector3(1.0f, 1.0f, 0.0f));
|
||||
|
||||
mi.vertices.push_back(KRVector3(1.0, 1.0, 1.0));
|
||||
mi.vertices.push_back(KRVector3(-1.0, 1.0, 1.0));
|
||||
mi.vertices.push_back(KRVector3(1.0,-1.0, 1.0));
|
||||
mi.vertices.push_back(KRVector3(-1.0,-1.0, 1.0));
|
||||
mi.vertices.push_back(KRVector3(-1.0,-1.0,-1.0));
|
||||
mi.vertices.push_back(KRVector3(-1.0, 1.0, 1.0));
|
||||
mi.vertices.push_back(KRVector3(-1.0, 1.0,-1.0));
|
||||
mi.vertices.push_back(KRVector3(1.0, 1.0, 1.0));
|
||||
mi.vertices.push_back(KRVector3(1.0, 1.0,-1.0));
|
||||
mi.vertices.push_back(KRVector3(1.0,-1.0, 1.0));
|
||||
mi.vertices.push_back(KRVector3(1.0,-1.0,-1.0));
|
||||
mi.vertices.push_back(KRVector3(-1.0,-1.0,-1.0));
|
||||
mi.vertices.push_back(KRVector3(1.0, 1.0,-1.0));
|
||||
mi.vertices.push_back(KRVector3(-1.0, 1.0,-1.0));
|
||||
mi.uva.push_back(KRVector2(0.0f, 0.0f));
|
||||
mi.uva.push_back(KRVector2(1.0f, 0.0f));
|
||||
mi.uva.push_back(KRVector2(0.0f, 1.0f));
|
||||
mi.uva.push_back(KRVector2(1.0f, 1.0f));
|
||||
|
||||
|
||||
mi.submesh_starts.push_back(0);
|
||||
|
||||
@@ -920,4 +920,9 @@ void KRNode::addBehavior(KRBehavior *behavior)
|
||||
m_behaviors.insert(behavior);
|
||||
behavior->__setNode(this);
|
||||
getScene().notify_sceneGraphModify(this);
|
||||
}
|
||||
}
|
||||
|
||||
std::set<KRBehavior *> &KRNode::getBehaviors()
|
||||
{
|
||||
return m_behaviors;
|
||||
}
|
||||
|
||||
@@ -227,6 +227,17 @@ private:
|
||||
|
||||
public:
|
||||
void addBehavior(KRBehavior *behavior);
|
||||
std::set<KRBehavior *> &getBehaviors();
|
||||
template <class T> T *getBehavior()
|
||||
{
|
||||
for(std::set<KRBehavior *>::iterator itr=m_behaviors.begin(); itr != m_behaviors.end(); itr++) {
|
||||
T *behavior = dynamic_cast<T *>(*itr);
|
||||
if(behavior) {
|
||||
return behavior;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
void removeFromOctreeNodes();
|
||||
void addToOctreeNode(KROctreeNode *octree_node);
|
||||
void childDeleted(KRNode *child_node);
|
||||
|
||||
@@ -28,7 +28,8 @@ KRSprite::KRSprite(KRScene &scene, std::string name) : KRNode(scene, name)
|
||||
{
|
||||
m_spriteTexture = "";
|
||||
m_pSpriteTexture = NULL;
|
||||
m_spriteSize = 0.0;
|
||||
m_spriteSize = 0.0f;
|
||||
m_spriteAlpha = 1.0f;
|
||||
}
|
||||
|
||||
KRSprite::~KRSprite()
|
||||
@@ -44,6 +45,7 @@ tinyxml2::XMLElement *KRSprite::saveXML( tinyxml2::XMLNode *parent)
|
||||
tinyxml2::XMLElement *e = KRNode::saveXML(parent);
|
||||
e->SetAttribute("sprite_size", m_spriteSize);
|
||||
e->SetAttribute("sprite_texture", m_spriteTexture.c_str());
|
||||
e->SetAttribute("sprite_alpha", m_spriteAlpha);
|
||||
return e;
|
||||
}
|
||||
|
||||
@@ -51,7 +53,10 @@ void KRSprite::loadXML(tinyxml2::XMLElement *e) {
|
||||
KRNode::loadXML(e);
|
||||
|
||||
if(e->QueryFloatAttribute("sprite_size", &m_spriteSize) != tinyxml2::XML_SUCCESS) {
|
||||
m_spriteSize = 0.0;
|
||||
m_spriteSize = 0.0f;
|
||||
}
|
||||
if(e->QueryFloatAttribute("sprite_alpha", &m_spriteAlpha) != tinyxml2::XML_SUCCESS) {
|
||||
m_spriteAlpha = 1.0f;
|
||||
}
|
||||
|
||||
const char *szSpriteTexture = e->Attribute("sprite_texture");
|
||||
@@ -73,6 +78,16 @@ void KRSprite::setSpriteSize(float sprite_size) {
|
||||
m_spriteSize = sprite_size;
|
||||
}
|
||||
|
||||
void KRSprite::setSpriteAlpha(float alpha)
|
||||
{
|
||||
m_spriteAlpha = alpha;
|
||||
}
|
||||
|
||||
float KRSprite::getSpriteAlpha() const
|
||||
{
|
||||
return m_spriteAlpha;
|
||||
}
|
||||
|
||||
KRAABB KRSprite::getBounds() {
|
||||
return KRAABB(KRVector3(-m_spriteSize), KRVector3(m_spriteSize), getModelMatrix());
|
||||
}
|
||||
@@ -84,7 +99,7 @@ void KRSprite::render(KRCamera *pCamera, std::vector<KRPointLight *> &point_ligh
|
||||
|
||||
|
||||
if(renderPass == KRNode::RENDER_PASS_ADDITIVE_PARTICLES) {
|
||||
if(m_spriteTexture.size() && m_spriteSize > 0.0f) {
|
||||
if(m_spriteTexture.size() && m_spriteSize > 0.0f && m_spriteAlpha > 0.0f) {
|
||||
|
||||
|
||||
if(!m_pSpriteTexture && m_spriteTexture.size()) {
|
||||
@@ -109,8 +124,9 @@ void KRSprite::render(KRCamera *pCamera, std::vector<KRPointLight *> &point_ligh
|
||||
GLDEBUG(glDepthRangef(0.0, 1.0));
|
||||
|
||||
// Render light sprite on transparency pass
|
||||
KRShader *pShader = getContext().getShaderManager()->getShader("flare", pCamera, point_lights, directional_lights, spot_lights, 0, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, renderPass);
|
||||
KRShader *pShader = getContext().getShaderManager()->getShader("sprite", pCamera, point_lights, directional_lights, spot_lights, 0, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, renderPass);
|
||||
if(getContext().getShaderManager()->selectShader(*pCamera, pShader, viewport, getModelMatrix(), point_lights, directional_lights, spot_lights, 0, renderPass)) {
|
||||
pShader->setUniform(KRShader::KRENGINE_UNIFORM_MATERIAL_ALPHA, m_spriteAlpha);
|
||||
pShader->setUniform(KRShader::KRENGINE_UNIFORM_FLARE_SIZE, m_spriteSize);
|
||||
m_pContext->getTextureManager()->selectTexture(0, m_pSpriteTexture);
|
||||
m_pContext->getModelManager()->bindVBO(getContext().getModelManager()->KRENGINE_VBO_2D_SQUARE_VERTICES, getContext().getModelManager()->KRENGINE_VBO_2D_SQUARE_INDEXES, getContext().getModelManager()->KRENGINE_VBO_2D_SQUARE_ATTRIBS, true);
|
||||
|
||||
@@ -24,6 +24,8 @@ public:
|
||||
|
||||
void setSpriteTexture(std::string sprite_texture);
|
||||
void setSpriteSize(float sprite_size);
|
||||
void setSpriteAlpha(float alpha);
|
||||
float getSpriteAlpha() const;
|
||||
|
||||
virtual void render(KRCamera *pCamera, std::vector<KRPointLight *> &point_lights, std::vector<KRDirectionalLight *> &directional_lights, std::vector<KRSpotLight *>&spot_lights, const KRViewport &viewport, KRNode::RenderPass renderPass);
|
||||
|
||||
@@ -34,6 +36,7 @@ protected:
|
||||
std::string m_spriteTexture;
|
||||
KRTexture *m_pSpriteTexture;
|
||||
float m_spriteSize;
|
||||
float m_spriteAlpha;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user