// Path: src/main/java/yk/senjin/LoadTickUnload.java
// public interface LoadTickUnload<T> {
//     void onLoad(T watch);
//     void onTick(T watch, float dt);
//     void onUnload();
// }
// 
// Path: src/main/java/yk/senjin/WatchReloadable.java
// public class WatchReloadable extends Simple3DWatch {
//     public TickingWatcher<Simple3DWatch> newWatcher;
//     private LoadTickUnload<Simple3DWatch> first;
//     private String path;
//     private Class[] classes;
// 
//     public WatchReloadable(LoadTickUnload<? extends Simple3DWatch> first, Class... classes) {
//         this.first = (LoadTickUnload<Simple3DWatch>) first;
//         this.path = "target/classes/";
//         this.classes = classes;
//     }
// 
//     public WatchReloadable(LoadTickUnload<? extends Simple3DWatch> first, String path, Class... classes) {
//         this.first = (LoadTickUnload<Simple3DWatch>) first;
//         this.path = path;
//         this.classes = classes;
//     }
// 
//     public WatchReloadable(int w, int h, LoadTickUnload<? extends Simple3DWatch> first, String path, Class... classes) {
//         super(w, h, true);
//         this.first = (LoadTickUnload<Simple3DWatch>) first;
//         this.path = path;
//         this.classes = classes;
//     }
// 
//     @Override
//     public void firstFrame() {
//         super.firstFrame();
//         newWatcher = new TickingWatcher<>(path, this, first, classes);
//     }
// 
//     @Override
//     public void tick(float dt) {
//         newWatcher.tick(this, dt);
//     }
// 
//     public Consumer<Integer> mouseDownListener;
//     public Consumer<Integer> mouseUpListener;
// 
//     @Override
//     public void onMousePressed(int button) {
//         super.onMousePressed(button);
//         if (mouseDownListener != null) mouseDownListener.accept(button);
//     }
// 
//     @Override
//     public void onMouseReleased(int button) {
//         super.onMouseReleased(button);
//         if (mouseUpListener != null) mouseUpListener.accept(button);
//     }
// }
// 
// Path: src/main/java/yk/senjin/DDDUtils.java
// public static float CUBE_POS_AND_COLOR[][][] = new float[][][]{
//         {
//                 {1, 0, 0},
//                 {-1, -1, 1},
//                 {1, -1, 1},
//                 {1, 1, 1},
//                 {-1, 1, 1},
//         },
// 
//         {
//                 {0, 1, 0},
//                 {-1, -1, -1},
//                 {-1, 1, -1},
//                 {1, 1, -1},
//                 {1, -1, -1},
//         },
// 
//         {
//                 {0, 0, 1},
//                 {-1, -1, -1},
//                 {-1, -1, 1},
//                 {-1, 1, 1},
//                 {-1, 1, -1},
//         },
// 
//         {
//                 {1, 1, 0},
//                 {1, -1, -1},
//                 {1, 1, -1},
//                 {1, 1, 1},
//                 {1, -1, 1},
//         },
// 
//         {
//                 {1, 0, 1},
//                 {-1, 1, -1},
//                 {-1, 1, 1},
//                 {1, 1, 1},
//                 {1, 1, -1},
//         },
// 
//         {
//                 {0, 1, 1},
//                 {-1, -1, -1},
//                 {1, -1, -1},
//                 {1, -1, 1},
//                 {-1, -1, 1},
//         }
// };


import yk.jcommon.collections.YList;
import yk.jcommon.fastgeom.Vec3f;
import yk.jcommon.utils.Rnd;
import yk.senjin.LoadTickUnload;
import yk.senjin.WatchReloadable;
import static org.lwjgl.opengl.GL11.*;
import static yk.jcommon.collections.YArrayList.al;
import static yk.senjin.DDDUtils.CUBE_POS_AND_COLOR;
package yk.senjin.education;



/**
 * Created with IntelliJ IDEA.
 * User: yuri
 * Date: 19/11/15
 * Time: 11:17
 */
public class BaseEdu3D implements LoadTickUnload<WatchReloadable> {
    public Rnd rnd = new Rnd();
    public Vec3f currentColor = Vec3f.v3(1, 1, 1);
    public YList<Vec3f> cubeColors = al();
    {
        setColor(1, 1, 1);
    }

    public void setColor(float r, float g, float b) {
        Vec3f c = new Vec3f(r, g, b);
        setColor(c);
    }

    public Vec3f randomVector3() {
        return new Vec3f(rnd.nextFloat(), rnd.nextFloat(), rnd.nextFloat());
    }

    public void setColor(Vec3f c) {
        cubeColors = al();
        cubeColors.add(c.mul(0.8f));
        cubeColors.add(c.mul(0.3f));
        cubeColors.add(c.mul(0.4f));
        cubeColors.add(c.mul(0.9f));
        cubeColors.add(c.mul(1.0f));
        cubeColors.add(c.mul(0.2f));
    }

    public void drawCube(float x, float y, float z) {
        glMatrixMode(GL_MODELVIEW);
        glPushMatrix();
        glTranslatef(x+0.5f, y+0.5f, z+0.5f);
        glBegin(GL_QUADS);
// Path: src/main/java/yk/senjin/LoadTickUnload.java
// public interface LoadTickUnload<T> {
//     void onLoad(T watch);
//     void onTick(T watch, float dt);
//     void onUnload();
// }
// 
// Path: src/main/java/yk/senjin/WatchReloadable.java
// public class WatchReloadable extends Simple3DWatch {
//     public TickingWatcher<Simple3DWatch> newWatcher;
//     private LoadTickUnload<Simple3DWatch> first;
//     private String path;
//     private Class[] classes;
// 
//     public WatchReloadable(LoadTickUnload<? extends Simple3DWatch> first, Class... classes) {
//         this.first = (LoadTickUnload<Simple3DWatch>) first;
//         this.path = "target/classes/";
//         this.classes = classes;
//     }
// 
//     public WatchReloadable(LoadTickUnload<? extends Simple3DWatch> first, String path, Class... classes) {
//         this.first = (LoadTickUnload<Simple3DWatch>) first;
//         this.path = path;
//         this.classes = classes;
//     }
// 
//     public WatchReloadable(int w, int h, LoadTickUnload<? extends Simple3DWatch> first, String path, Class... classes) {
//         super(w, h, true);
//         this.first = (LoadTickUnload<Simple3DWatch>) first;
//         this.path = path;
//         this.classes = classes;
//     }
// 
//     @Override
//     public void firstFrame() {
//         super.firstFrame();
//         newWatcher = new TickingWatcher<>(path, this, first, classes);
//     }
// 
//     @Override
//     public void tick(float dt) {
//         newWatcher.tick(this, dt);
//     }
// 
//     public Consumer<Integer> mouseDownListener;
//     public Consumer<Integer> mouseUpListener;
// 
//     @Override
//     public void onMousePressed(int button) {
//         super.onMousePressed(button);
//         if (mouseDownListener != null) mouseDownListener.accept(button);
//     }
// 
//     @Override
//     public void onMouseReleased(int button) {
//         super.onMouseReleased(button);
//         if (mouseUpListener != null) mouseUpListener.accept(button);
//     }
// }
// 
// Path: src/main/java/yk/senjin/DDDUtils.java
// public static float CUBE_POS_AND_COLOR[][][] = new float[][][]{
//         {
//                 {1, 0, 0},
//                 {-1, -1, 1},
//                 {1, -1, 1},
//                 {1, 1, 1},
//                 {-1, 1, 1},
//         },
// 
//         {
//                 {0, 1, 0},
//                 {-1, -1, -1},
//                 {-1, 1, -1},
//                 {1, 1, -1},
//                 {1, -1, -1},
//         },
// 
//         {
//                 {0, 0, 1},
//                 {-1, -1, -1},
//                 {-1, -1, 1},
//                 {-1, 1, 1},
//                 {-1, 1, -1},
//         },
// 
//         {
//                 {1, 1, 0},
//                 {1, -1, -1},
//                 {1, 1, -1},
//                 {1, 1, 1},
//                 {1, -1, 1},
//         },
// 
//         {
//                 {1, 0, 1},
//                 {-1, 1, -1},
//                 {-1, 1, 1},
//                 {1, 1, 1},
//                 {1, 1, -1},
//         },
// 
//         {
//                 {0, 1, 1},
//                 {-1, -1, -1},
//                 {1, -1, -1},
//                 {1, -1, 1},
//                 {-1, -1, 1},
//         }
// };


// Path: src/main/java/yk/senjin/education/BaseEdu3D.java
import yk.jcommon.collections.YList;
import yk.jcommon.fastgeom.Vec3f;
import yk.jcommon.utils.Rnd;
import yk.senjin.LoadTickUnload;
import yk.senjin.WatchReloadable;
import static org.lwjgl.opengl.GL11.*;
import static yk.jcommon.collections.YArrayList.al;
import static yk.senjin.DDDUtils.CUBE_POS_AND_COLOR;

package yk.senjin.education;



/**
 * Created with IntelliJ IDEA.
 * User: yuri
 * Date: 19/11/15
 * Time: 11:17
 */
public class BaseEdu3D implements LoadTickUnload<WatchReloadable> {
    public Rnd rnd = new Rnd();
    public Vec3f currentColor = Vec3f.v3(1, 1, 1);
    public YList<Vec3f> cubeColors = al();
    {
        setColor(1, 1, 1);
    }

    public void setColor(float r, float g, float b) {
        Vec3f c = new Vec3f(r, g, b);
        setColor(c);
    }

    public Vec3f randomVector3() {
        return new Vec3f(rnd.nextFloat(), rnd.nextFloat(), rnd.nextFloat());
    }

    public void setColor(Vec3f c) {
        cubeColors = al();
        cubeColors.add(c.mul(0.8f));
        cubeColors.add(c.mul(0.3f));
        cubeColors.add(c.mul(0.4f));
        cubeColors.add(c.mul(0.9f));
        cubeColors.add(c.mul(1.0f));
        cubeColors.add(c.mul(0.2f));
    }

    public void drawCube(float x, float y, float z) {
        glMatrixMode(GL_MODELVIEW);
        glPushMatrix();
        glTranslatef(x+0.5f, y+0.5f, z+0.5f);
        glBegin(GL_QUADS);
        for (int i1 = 0; i1 < CUBE_POS_AND_COLOR.length; i1++) {