Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion engine/includes/components/renderable.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class ENGINE_EXPORT Renderable : public NativeBehaviour {
virtual void setMaterial(Material *material);

int32_t materialsCount() const;
MaterialInstance *materialInstance(int index) const;
virtual MaterialInstance *materialInstance(int index);

protected:
virtual Mesh *meshToDraw(int instance);
Expand Down
5 changes: 4 additions & 1 deletion engine/includes/components/spriterender.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,8 @@ class ENGINE_EXPORT SpriteRender : public Renderable {

void setMaterial(Material *material) override;

MaterialInstance *materialInstance(int index) override;

private:
Mesh *meshToDraw(int instance) override;

Expand Down Expand Up @@ -94,7 +96,8 @@ class ENGINE_EXPORT SpriteRender : public Renderable {

bool m_useCustom;

bool m_dirty;
bool m_dirtyMesh;
bool m_dirtyMaterial;

};

Expand Down
14 changes: 12 additions & 2 deletions engine/includes/components/textrender.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@ class ENGINE_EXPORT TextRender : public Renderable {
A_PROPERTYEX(Vector4, color, TextRender::color, TextRender::setColor, "editor=Color"),
A_PROPERTY(bool, wordWrap, TextRender::wordWrap, TextRender::setWordWrap),
A_PROPERTY(Vector2, size, TextRender::size, TextRender::setSize),
A_PROPERTY(bool, kerning, TextRender::kerning, TextRender::setKerning)
A_PROPERTY(bool, kerning, TextRender::kerning, TextRender::setKerning),
A_PROPERTY(int, layer, TextRender::layer, TextRender::setLayer)
)
A_NOMETHODS()

Expand Down Expand Up @@ -55,7 +56,12 @@ class ENGINE_EXPORT TextRender : public Renderable {
bool kerning() const;
void setKerning(const bool kerning);

int layer() const;
void setLayer(int layer);

private:
MaterialInstance *materialInstance(int index) override;

Mesh *meshToDraw(int instance) override;

AABBox localBound() const override;
Expand Down Expand Up @@ -85,13 +91,17 @@ class ENGINE_EXPORT TextRender : public Renderable {

int m_alignment;

int m_priority;

float m_fontWeight;

bool m_kerning;

bool m_wrap;

bool m_dirty;
bool m_dirtyMesh;

bool m_dirtyMaterial;

};

Expand Down
2 changes: 2 additions & 0 deletions engine/includes/resources/material.h
Original file line number Diff line number Diff line change
Expand Up @@ -302,6 +302,8 @@ class ENGINE_EXPORT MaterialInstance {
void setTransform(Transform *transform);
void setTransform(const Matrix4 &transform);

int32_t finalPriority() const;

int32_t priority() const;
void setPriority(int32_t priority);

Expand Down
14 changes: 8 additions & 6 deletions engine/src/components/renderable.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,13 @@ Renderable::~Renderable() {
AABBox Renderable::bound() const {
AABBox bb = localBound();
Transform *t = transform();
uint32_t hash = t->hash();
if(hash != m_transformHash || m_localBox != bb) {
m_localBox = bb;
m_worldBox = m_localBox * t->worldTransform();
m_transformHash = hash;
if(t) {
uint32_t hash = t->hash();
if(hash != m_transformHash || m_localBox != bb) {
m_localBox = bb;
m_worldBox = m_localBox * t->worldTransform();
m_transformHash = hash;
}
}
return m_worldBox;
}
Expand Down Expand Up @@ -89,7 +91,7 @@ int32_t Renderable::materialsCount() const {
/*!
Returns a Material instance with \a index assigned to this Renderable.
*/
MaterialInstance *Renderable::materialInstance(int index) const {
MaterialInstance *Renderable::materialInstance(int index) {
if(m_materials.size() > index) {
return m_materials[index];
}
Expand Down
74 changes: 33 additions & 41 deletions engine/src/components/spriterender.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
#include "components/spriterender.h"
#include "components/actor.h"
#include "components/transform.h"

#include "resources/material.h"
#include "resources/mesh.h"
Expand Down Expand Up @@ -40,9 +38,9 @@ SpriteRender::SpriteRender() :
m_mesh(PipelineContext::defaultPlane()),
m_customMesh(Engine::objectCreate<Mesh>()),
m_drawMode(Simple),
m_priority(0),
m_useCustom(false),
m_dirty(true) {
m_dirtyMesh(true),
m_dirtyMaterial(true) {

}

Expand All @@ -58,7 +56,7 @@ SpriteRender::~SpriteRender() {
\internal
*/
Mesh *SpriteRender::meshToDraw(int instance) {
if(m_dirty) {
if(m_dirtyMesh) {
m_useCustom = false;
if(m_sheet) {
int hash = Mathf::hashString(m_item);
Expand All @@ -80,14 +78,32 @@ Mesh *SpriteRender::meshToDraw(int instance) {
m_mesh = PipelineContext::defaultPlane();
}

m_dirty = false;
m_dirtyMesh = false;
}

return (m_useCustom) ? m_customMesh : m_mesh;
}
/*!
\internal
*/
MaterialInstance *SpriteRender::materialInstance(int index) {
if(m_dirtyMaterial && !m_materials.empty()) {
MaterialInstance *inst = m_materials.front();
if(inst) {
inst->setTexture(gTexture, texture());
inst->setVector4(gColor, &m_color);
inst->setTransform(transform());
inst->setPriority(m_priority);

m_dirtyMaterial = false;
}
}

return Renderable::materialInstance(index);
}
/*!
\internal
*/
AABBox SpriteRender::localBound() const {
if(m_useCustom) {
return m_customMesh->bound();
Expand Down Expand Up @@ -119,18 +135,15 @@ void SpriteRender::setSprite(Sprite *sheet) {
if(m_sheet) {
m_sheet->subscribe(&SpriteRender::spriteUpdated, this);

m_dirty = true;
if(!m_materials.empty() && m_sheet->state() == Resource::Ready) {
m_materials[0]->setTexture(gTexture, m_sheet->page());
}
m_dirtyMesh = m_dirtyMaterial = true;
}
}
}
/*!
Returns current assigned texture.
*/
Texture *SpriteRender::texture() const {
if(m_sheet) {
if(m_sheet && m_sheet->state() == Resource::Ready) {
return m_sheet->page();
}

Expand All @@ -151,10 +164,7 @@ void SpriteRender::setTexture(Texture *texture) {
m_texture->incRef();
}

m_dirty = true;
if(!m_materials.empty()) {
m_materials[0]->setTexture(gTexture, m_texture);
}
m_dirtyMesh = m_dirtyMaterial = true;
}
}
/*!
Expand All @@ -169,9 +179,7 @@ Vector4 SpriteRender::color() const {
void SpriteRender::setColor(const Vector4 &color) {
m_color = color;

for(auto it : m_materials) {
it->setVector4(gColor, &m_color);
}
m_dirtyMaterial = true;
}
/*!
Returns the current item name of sprite from the sprite sheet.
Expand All @@ -185,7 +193,7 @@ TString SpriteRender::item() const {
void SpriteRender::setItem(const TString &item) {
if(m_item != item) {
m_item = item;
m_dirty = true;
m_dirtyMesh = true;
}
}
/*!
Expand Down Expand Up @@ -214,7 +222,7 @@ int SpriteRender::drawMode() const {
void SpriteRender::setDrawMode(int mode) {
if(m_drawMode != mode) {
m_drawMode = mode;
m_dirty = true;
m_dirtyMesh = true;
}
}
/*!
Expand All @@ -229,33 +237,23 @@ int SpriteRender::layer() const {
void SpriteRender::setLayer(int layer) {
m_priority = layer;

for(auto it : m_materials) {
it->setPriority(m_priority);
}
m_dirtyMaterial = true;
}
/*!
\internal
*/
void SpriteRender::setMaterial(Material *material) {
Renderable::setMaterial(material);

for(auto it : m_materials) {
it->setTexture(gTexture, texture());
it->setVector4(gColor, &m_color);
it->setTransform(transform());
}
m_dirtyMaterial = true;
}
/*!
\internal
*/
void SpriteRender::setMaterialsList(const std::list<Material *> &materials) {
Renderable::setMaterialsList(materials);

for(auto it : m_materials) {
it->setTexture(gTexture, texture());
it->setVector4(gColor, &m_color);
it->setTransform(transform());
}
m_dirtyMaterial = true;
}
/*!
\internal
Expand All @@ -271,17 +269,11 @@ void SpriteRender::spriteUpdated(int state, void *ptr) {

switch(state) {
case Resource::Ready: {
if(!p->m_materials.empty()) {
p->m_materials[0]->setTexture(gTexture, p->m_sheet->page());
}
p->m_dirty = true;
p->m_dirtyMesh = p->m_dirtyMaterial = true;
} break;
case Resource::ToBeDeleted: {
p->m_sheet = nullptr;
if(!p->m_materials.empty()) {
p->m_materials[0]->setTexture(gTexture, nullptr);
}
p->m_dirty = true;
p->m_dirtyMesh = p->m_dirtyMaterial = true;
} break;
default: break;
}
Expand Down
Loading
Loading