package com.uwsoft.editor.renderer.systems.render.logic; import com.badlogic.ashley.core.ComponentMapper; import com.badlogic.ashley.core.Entity; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.g2d.Batch; import com.badlogic.gdx.graphics.g2d.PolygonSpriteBatch; import com.badlogic.gdx.math.Vector2; import com.uwsoft.editor.renderer.components.DimensionsComponent; import com.uwsoft.editor.renderer.components.ShaderComponent; import com.uwsoft.editor.renderer.components.TextureRegionComponent; import com.uwsoft.editor.renderer.components.TintComponent; import com.uwsoft.editor.renderer.components.TransformComponent; import com.uwsoft.editor.renderer.systems.render.Overlap2dRenderer; public class TexturRegionDrawLogic implements Drawable { private ComponentMapper<TintComponent> tintComponentComponentMapper; private ComponentMapper<TextureRegionComponent> textureRegionMapper; private ComponentMapper<TransformComponent> transformMapper; private ComponentMapper<DimensionsComponent> dimensionsComponentComponentMapper; private ComponentMapper<ShaderComponent> shaderComponentMapper; public TexturRegionDrawLogic() { tintComponentComponentMapper = ComponentMapper.getFor(TintComponent.class); textureRegionMapper = ComponentMapper.getFor(TextureRegionComponent.class); transformMapper = ComponentMapper.getFor(TransformComponent.class); dimensionsComponentComponentMapper = ComponentMapper.getFor(DimensionsComponent.class); shaderComponentMapper = ComponentMapper.getFor(ShaderComponent.class); } @Override public void draw(Batch batch, Entity entity, float parentAlpha) { TextureRegionComponent entityTextureRegionComponent = textureRegionMapper.get(entity); if(shaderComponentMapper.has(entity)){ ShaderComponent shaderComponent = shaderComponentMapper.get(entity); if(shaderComponent.getShader() != null) { batch.setShader(shaderComponent.getShader()); batch.getShader().setUniformf("deltaTime", Gdx.graphics.getDeltaTime()); batch.getShader().setUniformf("time", Overlap2dRenderer.timeRunning); GL20 gl = Gdx.gl20; int error; if ((error = gl.glGetError()) != GL20.GL_NO_ERROR) { Gdx.app.log("opengl", "Error: " + error); Gdx.app.log("opengl", shaderComponent.getShader().getLog()); //throw new RuntimeException( ": glError " + error); } } } if(entityTextureRegionComponent.polygonSprite != null) { drawTiledPolygonSprite(batch, entity); } else { drawSprite(batch, entity, parentAlpha); } if(shaderComponentMapper.has(entity)){ batch.setShader(null); } } public void drawSprite(Batch batch, Entity entity, float parentAlpha) { TintComponent tintComponent = tintComponentComponentMapper.get(entity); TransformComponent entityTransformComponent = transformMapper.get(entity); TextureRegionComponent entityTextureRegionComponent = textureRegionMapper.get(entity); DimensionsComponent dimensionsComponent = dimensionsComponentComponentMapper.get(entity); batch.setColor(tintComponent.color.r, tintComponent.color.g, tintComponent.color.b, tintComponent.color.a * parentAlpha); batch.draw(entityTextureRegionComponent.region, entityTransformComponent.x, entityTransformComponent.y, entityTransformComponent.originX, entityTransformComponent.originY, dimensionsComponent.width, dimensionsComponent.height, entityTransformComponent.scaleX, entityTransformComponent.scaleY, entityTransformComponent.rotation); } public void drawPolygonSprite(Batch batch, Entity entity) { TintComponent tintComponent = tintComponentComponentMapper.get(entity); TransformComponent entityTransformComponent = transformMapper.get(entity); TextureRegionComponent entityTextureRegionComponent = textureRegionMapper.get(entity); DimensionsComponent dimensionsComponent = dimensionsComponentComponentMapper.get(entity); entityTextureRegionComponent.polygonSprite.setPosition(entityTransformComponent.x, entityTransformComponent.y); entityTextureRegionComponent.polygonSprite.setRotation(entityTransformComponent.rotation); entityTextureRegionComponent.polygonSprite.setOrigin(entityTransformComponent.originX, entityTransformComponent.originY); entityTextureRegionComponent.polygonSprite.setColor(tintComponent.color); entityTextureRegionComponent.polygonSprite.draw((PolygonSpriteBatch) batch); } public void drawTiledPolygonSprite(Batch batch, Entity entity) { batch.flush(); TintComponent tintComponent = tintComponentComponentMapper.get(entity); TransformComponent entityTransformComponent = transformMapper.get(entity); TextureRegionComponent entityTextureRegionComponent = textureRegionMapper.get(entity); DimensionsComponent dimensionsComponent = dimensionsComponentComponentMapper.get(entity); float ppwu = dimensionsComponent.width/entityTextureRegionComponent.region.getRegionWidth(); Vector2 atlasCoordsVector = new Vector2(entityTextureRegionComponent.region.getU(), entityTextureRegionComponent.region.getV()); Vector2 atlasSizeVector = new Vector2(entityTextureRegionComponent.region.getU2()-entityTextureRegionComponent.region.getU(), entityTextureRegionComponent.region.getV2()-entityTextureRegionComponent.region.getV()); batch.getShader().setUniformi("isRepeat", 1); batch.getShader().setUniformf("atlasCoord", atlasCoordsVector); batch.getShader().setUniformf("atlasSize", atlasSizeVector); //System.out.println(entityTransformComponent.originX); //batch.setColor(tintComponent.color); entityTextureRegionComponent.polygonSprite.setColor(tintComponent.color); entityTextureRegionComponent.polygonSprite.setOrigin(entityTransformComponent.originX * ppwu, entityTransformComponent.originY * ppwu); entityTextureRegionComponent.polygonSprite.setPosition(entityTransformComponent.x, entityTransformComponent.y); entityTextureRegionComponent.polygonSprite.setRotation(entityTransformComponent.rotation); entityTextureRegionComponent.polygonSprite.setScale(ppwu); entityTextureRegionComponent.polygonSprite.draw((PolygonSpriteBatch) batch); batch.flush(); batch.getShader().setUniformi("isRepeat", 0); } }