1 module unecht.core.components.editor.grid;
2 
3 version(UEIncludeEditor):
4 
5 import std.array;
6 
7 import gl3n.linalg;
8 
9 import unecht.core.component;
10 import unecht.core.components.material;
11 import unecht.core.components.misc;
12 import unecht.core.components.renderer;
13 
14 import unecht.gl.vertexBufferObject;
15 import unecht.gl.vertexArrayObject;
16 
17 ///
18 final class UEEditorgridComponent : UEComponent {
19 
20 	mixin(UERegisterObject!());
21 
22 	override void onCreate() {
23 		super.onCreate;
24 		
25         import unecht.core.entity;
26         entity.layer = UELayer.editor;
27 
28 		auto renderer = entity.addComponent!UERenderer;
29 		auto mesh = entity.addComponent!UEMesh;
30 		
31 		renderer.mesh = mesh;
32 		auto material = renderer.material = this.entity.addComponent!UEMaterial;
33 
34 		mesh.vertexArrayObject = new GLVertexArrayObject();
35 		mesh.vertexArrayObject.bind();
36 
37         enum cellsize = 10;
38         enum cnt = 10;
39         enum size = cnt*cellsize;
40         enum sized2 = size/2;
41 
42         auto vertices = appender!(vec3[])();
43         vertices.reserve(cnt*cnt);
44         foreach(x; 0..cnt)
45         {
46             foreach(y; 0..cnt)
47             {
48                 vertices.put(vec3(x*cellsize - sized2,0,y*cellsize - sized2));
49             }
50         }
51 
52 		mesh.setVertexData(vertices.data);
53 
54         auto indices = appender!(uint[])();
55         indices.reserve(cnt*cnt*4);
56         foreach(x; 0..cnt)
57         {
58             foreach(y; 0..cnt)
59             {
60                 if(x<cnt-1)
61                 {
62                     indices.put(y*cnt + x);
63                     indices.put(y*cnt + x+1);
64                 }
65                 if(y<cnt-1)
66                 {
67                     indices.put(y*cnt + x);
68                     indices.put((y+1)*cnt + x);
69                 }
70             }
71         }
72 
73 		mesh.indexBuffer = new GLVertexBufferObject(indices.data);
74         mesh.indexBuffer.primitiveType = GLRenderPrimitive.lines;
75 		mesh.vertexArrayObject.unbind();
76 	}
77 
78     override void onUpdate() {
79         super.onUpdate;
80 
81         //TODO: change size depending on the distance of the editor cam
82         //this.sceneNode.scaling = this.sceneNode.scaling*1.1f;
83     }
84 }