package info.u250.c2d.graphic.surfaces;
import info.u250.c2d.engine.Engine;
import com.badlogic.gdx.graphics.Mesh;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.Texture.TextureWrap;
/**
* Cure surfaces is a mesh group use the draw method FAN or STRIP of opengles .
* which defined some base points and draw them ordered ,
* @author lycying@gmail.com
*/
public abstract class CurveSurfaces implements com.badlogic.gdx.utils.Disposable{
/**
* The render interface rounding the method {@link CurveSurfaces#render(float)}, used to give more controls
* @author lycying@gmail.com
*/
public interface CurveSurfacesRender{
/** before render */
public void preRender(float delta);
/** after render */
public void postRender(float delta);
}
private CurveSurfacesRender bRender;
protected CurveSurfaces(){}
public void setbRender(CurveSurfacesRender bRender) {
this.bRender = bRender;
}
public SurfaceData data;
public Texture texture;
/**the main mesh used to draw */
public Mesh mesh;
public CurveSurfaces(SurfaceData data){
this.data = data;
this.build();
}
/**the main build method , we build the mesh and the texture and also the physical object
*/
public final void build(){
texture = Engine.resource(data.texture,Texture.class);
if(null!=this.texture){
this.texture.setWrap(TextureWrap.Repeat, TextureWrap.Repeat);
this.texture.setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear);
}
if(data.points.size>2 && this.texture !=null)this.doBuild();
}
/** to draw it */
public void render(float delta){
if(null!=bRender){
bRender.preRender(delta);
}
this.doRender(delta);
if(null!=bRender){
bRender.postRender(delta);
}
}
/**the draw method is implement at subclass */
protected abstract void doRender(float delta);
/**the build method is implement at subclass */
protected abstract void doBuild();
public void dispose(){
if(null!=mesh){
mesh.dispose();
mesh = null;
}
}
}