meshes and colors
This commit is contained in:
		
							parent
							
								
									8d8a90f29a
								
							
						
					
					
						commit
						3192682853
					
				
							
								
								
									
										1
									
								
								.idea/Helium-Engine.iml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										1
									
								
								.idea/Helium-Engine.iml
									
									
									
										generated
									
									
									
								
							| @ -8,5 +8,6 @@ | ||||
|     <orderEntry type="inheritedJdk" /> | ||||
|     <orderEntry type="sourceFolder" forTests="false" /> | ||||
|     <orderEntry type="library" name="lwjgl-release-3.2" level="project" /> | ||||
|     <orderEntry type="library" name="snakeyaml-1.9" level="project" /> | ||||
|   </component> | ||||
| </module> | ||||
							
								
								
									
										9
									
								
								.idea/libraries/snakeyaml_1_9.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								.idea/libraries/snakeyaml_1_9.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | ||||
| <component name="libraryTable"> | ||||
|   <library name="snakeyaml-1.9"> | ||||
|     <CLASSES> | ||||
|       <root url="jar://$USER_HOME$/Downloads/snakeyaml-1.9.jar!/" /> | ||||
|     </CLASSES> | ||||
|     <JAVADOC /> | ||||
|     <SOURCES /> | ||||
|   </library> | ||||
| </component> | ||||
							
								
								
									
										59
									
								
								resources/objects/plane.mesh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								resources/objects/plane.mesh
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,59 @@ | ||||
| 
 | ||||
| type: color | ||||
| vertices: | ||||
|   - | ||||
|     vertex: | ||||
|       - -20 | ||||
|       - -0.5000001 | ||||
|       - 20 | ||||
|     texture: | ||||
|       - 0 | ||||
|       - 0 | ||||
|     color: | ||||
|       - 0 | ||||
|       - 0 | ||||
|       - 1 | ||||
|   - | ||||
|     vertex: | ||||
|       - -20 | ||||
|       - -0.5000001 | ||||
|       - -20 | ||||
|     texture: | ||||
|       - 0 | ||||
|       - 1 | ||||
|     color: | ||||
|       - 0 | ||||
|       - 0 | ||||
|       - 1 | ||||
|   - | ||||
|     vertex: | ||||
|       - 20 | ||||
|       - -0.5000001 | ||||
|       - -20 | ||||
|     texture: | ||||
|       - 1 | ||||
|       - 1 | ||||
|     color: | ||||
|       - 1 | ||||
|       - 0 | ||||
|       - 1 | ||||
|   - | ||||
|     vertex: | ||||
|       - 20 | ||||
|       - -0.5000001 | ||||
|       - 20 | ||||
|     texture: | ||||
|       - 1 | ||||
|       - 0 | ||||
|     color: | ||||
|       - 1 | ||||
|       - 0 | ||||
|       - 1 | ||||
| cull: | ||||
|   - 0 | ||||
|   - 1 | ||||
|   - 3 | ||||
|   - 3 | ||||
|   - 1 | ||||
|   - 2 | ||||
| texture: "resources/textures/thonk.png" | ||||
| @ -1,11 +1,7 @@ | ||||
| abstract public class Game { | ||||
| 	abstract public void setup() throws Exception; | ||||
| 	abstract public void loop() throws Exception; | ||||
| 	abstract public void close() throws Exception; | ||||
| 
 | ||||
| 	public void run() throws Exception { | ||||
| 		setup(); | ||||
| 		loop(); | ||||
| 	} | ||||
| public interface Game { | ||||
| 	void setup() throws Exception; | ||||
| 	void loop() throws Exception; | ||||
| 	void close() throws Exception; | ||||
| 	void run() throws Exception; | ||||
| 
 | ||||
| } | ||||
|  | ||||
| @ -3,13 +3,15 @@ import org.hl.engine.io.Display; | ||||
| import org.hl.engine.io.Input; | ||||
| import org.hl.engine.math.lalg.Vector3f; | ||||
| import org.hl.engine.math.lalg.Vector2f; | ||||
| import org.hl.engine.objects.FirstPersonCamera; | ||||
| import org.hl.engine.objects.GameObject; | ||||
| import org.hl.engine.objects.ThirdPersonCamera; | ||||
| import org.hl.engine.utils.FileUtils; | ||||
| import org.lwjgl.glfw.GLFW; | ||||
| 
 | ||||
| import java.io.IOException; | ||||
| 
 | ||||
| 
 | ||||
| public class Test extends Game { | ||||
| public class Test implements Game { | ||||
| 	// Defining original parts of the game | ||||
| 	public final static int WIDTH = 1280, HEIGHT = 760; | ||||
| 	public final String windowName = "Game!"; | ||||
| @ -18,18 +20,7 @@ public class Test extends Game { | ||||
| 	public Renderer renderer; | ||||
| 	public Shader shader; | ||||
| 
 | ||||
| 	public Mesh plane = new Mesh(new Vertex[] { | ||||
| 			new Vertex(new Vector3f(-20, -0.5000001f, 20), new Vector2f(0, 0)), | ||||
| 			new Vertex(new Vector3f(-20, -0.5000001f, -20), new Vector2f(0, 1)), | ||||
| 			new Vertex(new Vector3f(20, -0.5000001f, -20), new Vector2f(1, 1)), | ||||
| 			new Vertex(new Vector3f(20, -0.5000001f, 20), new Vector2f(1, 0)), | ||||
| 	}, new int[] { | ||||
| 			0, 1, 3, | ||||
| 			3, 1, 2 | ||||
| 
 | ||||
| 	}, new Material(new Texture("resources/textures/thonk.png"))); | ||||
| 
 | ||||
| 	public Mesh mesh = new Mesh(new Vertex[] { | ||||
| 	public Mesh cube = new Mesh(new Vertex[] { | ||||
| 			//Back face | ||||
| 			new Vertex(new Vector3f(-0.5f,  0.5f, -0.5f), new Vector2f(0.0f, 0.0f)), | ||||
| 			new Vertex(new Vector3f(-0.5f, -0.5f, -0.5f), new Vector2f(0.0f, 1.0f)), | ||||
| @ -89,15 +80,24 @@ public class Test extends Game { | ||||
| 			//Bottom face | ||||
| 			20, 21, 23, | ||||
| 			23, 21, 22 | ||||
| 	}, new Material(new Texture("resources/textures/b.png"))); | ||||
| 	}, new Material(new Texture("resources/textures/b.png")), "texture"); | ||||
| 
 | ||||
| 	public boolean lockToggle = false; | ||||
| 
 | ||||
| 	public GameObject testObject = new GameObject(mesh, new Vector3f(0, 0, 0 ), new Vector3f(0, 0, 0), new Vector3f(1, 1, 1)); | ||||
| 	public GameObject[] gameObjects = new GameObject[500]; | ||||
| 
 | ||||
| 	public GameObject testingPlane = new GameObject(plane, new Vector3f(0, 0, 0 ), new Vector3f(0, 0, 0), new Vector3f(1, 1, 1)); | ||||
| 	public GameObject cubeObject = new GameObject(cube, new Vector3f(0, 0, 0 ), new Vector3f(0, 0, 0), new Vector3f(1, 1, 1)); | ||||
| 
 | ||||
| 	//public GameObject planeObject = new GameObject(plane, new Vector3f(0, 0, 0 ), new Vector3f(0, 0, 0), new Vector3f(1, 1, 1)); | ||||
| 
 | ||||
| 	public GameObject planeObject = new GameObject("resources/objects/plane.mesh", new Vector3f(0, 0, 0 ), new Vector3f(0, 0, 0), new Vector3f(1, 1, 1)); | ||||
| 
 | ||||
| 
 | ||||
| 	public ThirdPersonCamera camera = new ThirdPersonCamera(new Vector3f(0, 0, 5), new Vector3f(0, 0, 0), cubeObject, 0.5f, 5, 0.1f, 20f, true, true, true); | ||||
| 
 | ||||
| 	public Test() throws Exception { | ||||
| 	} | ||||
| 
 | ||||
| 	public FirstPersonCamera camera = new FirstPersonCamera(new Vector3f(0, 0, 1), new Vector3f(0, 0, 0), 0.05f, 0.15f); | ||||
| 
 | ||||
| 	public void run() throws Exception { | ||||
| 		setup(); | ||||
| @ -109,7 +109,7 @@ public class Test extends Game { | ||||
| 
 | ||||
| 	} | ||||
| 
 | ||||
| 	public void loop(){ | ||||
| 	public void loop() throws Exception { | ||||
| 
 | ||||
| 
 | ||||
| 		//First updating | ||||
| @ -119,8 +119,10 @@ public class Test extends Game { | ||||
| 			camera.update(); | ||||
| 		} | ||||
| 		if (i.buttonPress(GLFW.GLFW_MOUSE_BUTTON_LEFT)) { | ||||
| 			lockToggle = !lockToggle; | ||||
| 			display.mouseState(lockToggle); | ||||
| 			if (!lockToggle) { | ||||
| 				lockToggle = true; | ||||
| 				display.mouseState(true); | ||||
| 			} | ||||
| 		} else if (i.isKeyDown(GLFW.GLFW_KEY_ESCAPE)) { | ||||
| 			lockToggle = false; | ||||
| 			display.mouseState(lockToggle); | ||||
| @ -133,19 +135,27 @@ public class Test extends Game { | ||||
| 		// Now Render! | ||||
| 
 | ||||
| 
 | ||||
| 		// rendering the mesh | ||||
| 		renderer.renderMesh(testObject, camera); | ||||
| 		renderer.renderMesh(testingPlane, camera); | ||||
| 		// rendering the cube and plane | ||||
| 		renderer.renderMesh(cubeObject, camera); | ||||
| 		renderer.renderMesh(planeObject, camera); | ||||
| 		//swap buffers so the new one will appear | ||||
| 
 | ||||
| 		for (GameObject gameObject : gameObjects) { | ||||
| 			renderer.renderMesh(gameObject, camera); | ||||
| 		} | ||||
| 
 | ||||
| 		display.swapBuffers(); | ||||
| 	} | ||||
| 
 | ||||
| 
 | ||||
| 	public void setup() throws Exception { | ||||
| 
 | ||||
| 		//First, set up the display | ||||
| 		display = new Display(WIDTH, HEIGHT, windowName, 70, 0.1f, 1000f); | ||||
| 		display.create(); | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 		// Open the shaders | ||||
| 		shader = new Shader(Shader.VERTEXSHADER, Shader.FRAGSHADER); | ||||
| 
 | ||||
| @ -155,13 +165,21 @@ public class Test extends Game { | ||||
| 		// Changing the background color | ||||
| 		display.setBackgroundColor(0.53f, .81f, 0.92f); | ||||
| 
 | ||||
| 		// Creating / displaying the mesh | ||||
| 		mesh.create(); | ||||
| 		plane.create(); | ||||
| 		// Creating / displaying the cube and plane | ||||
| 		planeObject.create(); | ||||
| 
 | ||||
| 		// Creating the shader | ||||
| 		shader.create(); | ||||
| 
 | ||||
| 
 | ||||
| 		for (int i = 0; i < gameObjects.length; i ++) { | ||||
| 			gameObjects[i] = new GameObject(cube, new Vector3f( (float)Math.random()*50 - 25 , (float)Math.random()*50, (float)Math.random()*50 - 25), new Vector3f(0, 0, 0), new Vector3f(1, 1, 1)); | ||||
| 		} | ||||
| 
 | ||||
| 		for (GameObject gameObject : gameObjects) { | ||||
| 			gameObject.create(); | ||||
| 		} | ||||
| 
 | ||||
| 		// Creating the input | ||||
| 
 | ||||
| 		i = new Input(display); | ||||
| @ -174,9 +192,12 @@ public class Test extends Game { | ||||
| 	public void close() { | ||||
| 		// Removing everything | ||||
| 		display.destroy(); | ||||
| 		mesh.destroy(); | ||||
| 		shader.destroy(); | ||||
| 		plane.destroy(); | ||||
| 		cubeObject.destroy(); | ||||
| 		planeObject.destroy(); | ||||
| 		for (GameObject gameObject : gameObjects) { | ||||
| 			gameObject.destroy(); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	public static void main(String[] args) throws Exception { | ||||
|  | ||||
| @ -15,12 +15,19 @@ public class Mesh { | ||||
| 	private int[] indices; | ||||
| 	private int vertexArrayObject, positionBufferObject, indicesBufferObject, colorBufferObject, textureBufferObject; | ||||
| 	private Material material; | ||||
| 	private boolean type; | ||||
| 
 | ||||
| 	// A group of vertices combined based on the indexes | ||||
| 	public Mesh(Vertex[] vertices, int[] indices, Material material) { | ||||
| 	public Mesh(Vertex[] vertices, int[] indices, Material material, String type) throws Exception { | ||||
| 		this.vertices = vertices; | ||||
| 		this.indices = indices; | ||||
| 		this.material = material; | ||||
| 		if (!type.equals("texture") && !type.equals("color")) { | ||||
| 			throw new Exception("Type must be either texture or color. "); | ||||
| 		} | ||||
| 		this.type = type.equals("texture"); | ||||
| 
 | ||||
| 
 | ||||
| 	} | ||||
| 
 | ||||
| 
 | ||||
| @ -140,4 +147,8 @@ public class Mesh { | ||||
| 
 | ||||
| 		return bufferID; | ||||
| 	} | ||||
| 
 | ||||
| 	public boolean isType() { | ||||
| 		return type; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @ -34,6 +34,7 @@ public class Renderer { | ||||
| 
 | ||||
| 		shader.bind(); | ||||
| 
 | ||||
| 		shader.setUniform("type", object.getMesh().isType()); | ||||
| 		shader.setUniform("projection", display.getProjectionMatrix()); | ||||
| 		shader.setUniform("view", Matrix4f.view(camera.getPosition(), camera.getRotation())); | ||||
| 		shader.setUniform("model", Matrix4f.transform(object.getPosition(), object.getRotation(), object.getScale())); | ||||
|  | ||||
| @ -11,17 +11,23 @@ public class Vertex { | ||||
| 	private Vector3f position; | ||||
| 	private Vector3f color; | ||||
| 	private Vector2f textureCoords; | ||||
| 
 | ||||
| 
 | ||||
| 	public Vertex (Vector3f position, Vector3f color, Vector2f textureCoords) { | ||||
| 		this.position = position; | ||||
| 		this.color = color; | ||||
| 		this.textureCoords = textureCoords; | ||||
| 	} | ||||
| 	private boolean type; | ||||
| 
 | ||||
| 	public Vertex(Vector3f position, Vector2f textureCoords) { | ||||
| 		this.position = position; | ||||
| 		this.color = new Vector3f(1.0F, 1.0F, 1.0F); | ||||
| 		this.textureCoords = textureCoords; | ||||
| 		this.color = new Vector3f(1, 1, 1); | ||||
| 	} | ||||
| 
 | ||||
| 	public Vertex(Vector3f position, Vector3f color) { | ||||
| 		this.position = position; | ||||
| 		this.color = color; | ||||
| 		this.textureCoords = new Vector2f(0, 0); | ||||
| 	} | ||||
| 
 | ||||
| 	public Vertex(Vector3f position, Vector3f color, Vector2f textureCoords) { | ||||
| 		this.position = position; | ||||
| 		this.color = color; | ||||
| 		this.textureCoords = textureCoords; | ||||
| 	} | ||||
| 
 | ||||
| @ -38,4 +44,7 @@ public class Vertex { | ||||
| 		return textureCoords; | ||||
| 	} | ||||
| 
 | ||||
| 	public boolean isType() { | ||||
| 		return type; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @ -138,9 +138,13 @@ public class Display { | ||||
| 			//System.exit(1); | ||||
| 			throw new Exception("Failed to initialize GLFW! "); | ||||
| 		} | ||||
| 
 | ||||
| 		glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); | ||||
| 		glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1); | ||||
| 		if(System.getProperty("os.name").contains("Mac")) { | ||||
| 			glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); | ||||
| 			glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); | ||||
| 		} else { | ||||
| 			glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); | ||||
| 			glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1); | ||||
| 		} | ||||
| 		glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL11.GL_TRUE); | ||||
| 		glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); | ||||
| 
 | ||||
|  | ||||
| @ -16,7 +16,7 @@ public class Camera { | ||||
| 		return position; | ||||
| 	} | ||||
| 
 | ||||
| 	public void setPosition(Vector3f position) { | ||||
| 	public void setPosition(Vector3f position) throws Exception { | ||||
| 		this.position = position; | ||||
| 	} | ||||
| 
 | ||||
| @ -24,7 +24,7 @@ public class Camera { | ||||
| 		return rotation; | ||||
| 	} | ||||
| 
 | ||||
| 	public void setRotation(Vector3f rotation) { | ||||
| 	public void setRotation(Vector3f rotation) throws Exception { | ||||
| 		this.rotation = rotation; | ||||
| 	} | ||||
| 
 | ||||
|  | ||||
| @ -25,7 +25,7 @@ public class FirstPersonCamera extends Camera { | ||||
| 		this.i = i; | ||||
| 	} | ||||
| 
 | ||||
| 	public void update () { | ||||
| 	public void update () throws Exception { | ||||
| 
 | ||||
| 		newMouseX = i.getMouseX(); | ||||
| 		newMouseY = i.getMouseY(); | ||||
|  | ||||
							
								
								
									
										19
									
								
								src/org/hl/engine/objects/FixedCamera.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								src/org/hl/engine/objects/FixedCamera.java
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,19 @@ | ||||
| package org.hl.engine.objects; | ||||
| 
 | ||||
| import org.hl.engine.math.lalg.Vector3f; | ||||
| 
 | ||||
| public class FixedCamera extends Camera { | ||||
| 	public FixedCamera(Vector3f position, Vector3f rotation) { | ||||
| 		super(position, rotation); | ||||
| 	} | ||||
| 
 | ||||
| 	@Override | ||||
| 	public void setRotation(Vector3f rotation) throws Exception { | ||||
| 		throw new Exception("You cannot rotate a fixed camera! "); | ||||
| 	} | ||||
| 
 | ||||
| 	@Override | ||||
| 	public void setPosition(Vector3f rotation) throws Exception { | ||||
| 		throw new Exception("You cannot move a fixed camera! "); | ||||
| 	} | ||||
| } | ||||
| @ -1,7 +1,20 @@ | ||||
| package org.hl.engine.objects; | ||||
| 
 | ||||
| import org.hl.engine.graphics.Material; | ||||
| import org.hl.engine.graphics.Mesh; | ||||
| import org.hl.engine.graphics.Texture; | ||||
| import org.hl.engine.graphics.Vertex; | ||||
| import org.hl.engine.math.lalg.Vector2f; | ||||
| import org.hl.engine.math.lalg.Vector3f; | ||||
| import org.hl.engine.objects.yloaders.YMesh; | ||||
| import org.hl.engine.objects.yloaders.YPoint; | ||||
| import org.yaml.snakeyaml.Yaml; | ||||
| import org.yaml.snakeyaml.constructor.Constructor; | ||||
| 
 | ||||
| import java.io.FileInputStream; | ||||
| import java.io.FileNotFoundException; | ||||
| import java.util.Objects; | ||||
| 
 | ||||
| 
 | ||||
| public class GameObject { | ||||
| 	private Vector3f position, rotation, scale; | ||||
| @ -14,6 +27,65 @@ public class GameObject { | ||||
| 		this.mesh = mesh; | ||||
| 	} | ||||
| 
 | ||||
| 	public GameObject(String meshFileName, Vector3f position, Vector3f rotation, Vector3f scale) throws Exception { | ||||
| 		if (!meshFileName.endsWith(".mesh")) { | ||||
| 			throw new Exception("Wrong file type! "); | ||||
| 		} | ||||
| 		Yaml yaml = new Yaml(); | ||||
| 		FileInputStream inputStream = new FileInputStream(meshFileName); | ||||
| 		YMesh yMesh = yaml.loadAs(inputStream, YMesh.class); | ||||
| 		Integer[] cull = yMesh.getCull().toArray(new Integer[yMesh.getCull().size()]); | ||||
| 		String type = yMesh.getType(); | ||||
| 		String texture = yMesh.getTexture(); | ||||
| 		YPoint[] vertices = yMesh.getVertices().toArray(new YPoint[yMesh.getVertices().size()]); | ||||
| 		Vertex[] meshFormat = new Vertex[vertices.length]; | ||||
| 
 | ||||
| 		for (YPoint vertex : vertices) { | ||||
| 			if (vertex.getVertex().size() != 3) { | ||||
| 				throw new Exception("Incorrect number of coordinates. "); | ||||
| 			} | ||||
| 			if (vertex.getColor().size() != 3) { | ||||
| 				throw new Exception("Incorrect number of color values. "); | ||||
| 			} | ||||
| 			if (vertex.getTexture().size() != 2) { | ||||
| 				throw new Exception("Incorrect number of texture coordinates. "); | ||||
| 			} | ||||
| 		} | ||||
| 		if (!type.equals("texture") && !type.equals("color")) { | ||||
| 			throw new Exception("Incorrect type. Type can only be texture or color. "); | ||||
| 		} | ||||
| 
 | ||||
| 		for (int i = 0; i < vertices.length; i ++) { | ||||
| 			Vertex value = new Vertex( | ||||
| 					new Vector3f(vertices[i].getVertex().get(0), vertices[i].getVertex().get(1), vertices[i].getVertex().get(2)), | ||||
| 					new Vector3f(vertices[i].getColor().get(0), vertices[i].getColor().get(1), vertices[i].getColor().get(2)), | ||||
| 					new Vector2f(vertices[i].getTexture().get(0), vertices[i].getTexture().get(1)) | ||||
| 
 | ||||
| 			); | ||||
| 			meshFormat[i] = value; | ||||
| 
 | ||||
| 		} | ||||
| 		int[] indices = new int[cull.length]; | ||||
| 		for (int j = 0; j < cull.length; j ++) { | ||||
| 			indices[j] = cull[j]; | ||||
| 		} | ||||
| 
 | ||||
| 		this.mesh = new Mesh(meshFormat, indices, new Material(new Texture(texture)), type); | ||||
| 		this.position = position; | ||||
| 		this.scale = scale; | ||||
| 		this.rotation = rotation; | ||||
| 
 | ||||
| 	} | ||||
| 
 | ||||
| 
 | ||||
| 	public void create() { | ||||
| 		mesh.create(); | ||||
| 	} | ||||
| 
 | ||||
| 	public void destroy() { | ||||
| 		mesh.destroy(); | ||||
| 	} | ||||
| 
 | ||||
| 	public Vector3f getPosition() { | ||||
| 		return position; | ||||
| 	} | ||||
| @ -41,4 +113,20 @@ public class GameObject { | ||||
| 	public void setScale(Vector3f scale) { | ||||
| 		this.scale = scale; | ||||
| 	} | ||||
| 
 | ||||
| 	@Override | ||||
| 	public boolean equals(Object o) { | ||||
| 		if (this == o) return true; | ||||
| 		if (o == null || getClass() != o.getClass()) return false; | ||||
| 		GameObject that = (GameObject) o; | ||||
| 		return Objects.equals(getPosition(), that.getPosition()) && | ||||
| 				Objects.equals(getRotation(), that.getRotation()) && | ||||
| 				Objects.equals(getScale(), that.getScale()) && | ||||
| 				Objects.equals(getMesh(), that.getMesh()); | ||||
| 	} | ||||
| 
 | ||||
| 	@Override | ||||
| 	public int hashCode() { | ||||
| 		return Objects.hash(getPosition(), getRotation(), getScale(), getMesh()); | ||||
| 	} | ||||
| } | ||||
|  | ||||
							
								
								
									
										128
									
								
								src/org/hl/engine/objects/ThirdPersonCamera.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										128
									
								
								src/org/hl/engine/objects/ThirdPersonCamera.java
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,128 @@ | ||||
| package org.hl.engine.objects; | ||||
| 
 | ||||
| import org.hl.engine.io.Input; | ||||
| import org.hl.engine.math.lalg.Vector3f; | ||||
| import org.lwjgl.glfw.GLFW; | ||||
| 
 | ||||
| public class ThirdPersonCamera extends Camera { | ||||
| 
 | ||||
| 	private GameObject object; | ||||
| 	private Input i; | ||||
| 	private float distance; | ||||
| 	private float angle = 0; | ||||
| 	private float horizAngle = 0; | ||||
| 	private float vertAngle = 0; | ||||
| 	private float moveSpeed; | ||||
| 	private float sensitivity; | ||||
| 	private float near; | ||||
| 	private float far; | ||||
| 	private boolean clickToMove; | ||||
| 	private boolean clickToZoom; | ||||
| 	private boolean zoomEnabled; | ||||
| 
 | ||||
| 	private double oldMouseX, oldMouseY = 0; | ||||
| 	private double newMouseX, newMouseY; | ||||
| 
 | ||||
| 	public ThirdPersonCamera(Vector3f position, Vector3f rotation, GameObject object, float sensitivity, float distance, float near, float far, boolean clickToMove, boolean clickToZoom, boolean zoomEnabled) { | ||||
| 		super(position, rotation); | ||||
| 		this.object = object; | ||||
| 		this.sensitivity = sensitivity; | ||||
| 		this.clickToMove = clickToMove; | ||||
| 		this.clickToZoom = clickToZoom; | ||||
| 		this.zoomEnabled = zoomEnabled; | ||||
| 		this.near = near; | ||||
| 		this.far = far; | ||||
| 		this.distance = distance; | ||||
| 	} | ||||
| 
 | ||||
| 	public void create(Input i) throws Exception { | ||||
| 
 | ||||
| 		this.i = i; | ||||
| 		setRotation(getRotation()); | ||||
| 		setPosition(getPosition()); | ||||
| 	} | ||||
| 
 | ||||
| 
 | ||||
| 	public void update() throws Exception { | ||||
| 
 | ||||
| 		near = 0.1f; | ||||
| 
 | ||||
| 		newMouseX = i.getMouseX(); | ||||
| 		newMouseY = i.getMouseY(); | ||||
| 
 | ||||
| 
 | ||||
| 		float dx = (float) ((float)newMouseX - oldMouseX); | ||||
| 		float dy = (float) ((float)newMouseY - oldMouseY); | ||||
| 
 | ||||
| 		if (clickToMove && clickToZoom) { | ||||
| 			if (i.isButtonDown(GLFW.GLFW_MOUSE_BUTTON_LEFT)) { | ||||
| 				vertAngle -= dy * sensitivity; | ||||
| 				horizAngle += dx * sensitivity; | ||||
| 			} | ||||
| 
 | ||||
| 			if (i.isButtonDown(GLFW.GLFW_MOUSE_BUTTON_RIGHT) && zoomEnabled) { | ||||
| 				if (distance > 0) { | ||||
| 					distance += dy * sensitivity; | ||||
| 				} else { | ||||
| 					distance = near; | ||||
| 				} | ||||
| 			} | ||||
| 		} else if (clickToMove) { | ||||
| 
 | ||||
| 			if (i.isButtonDown(GLFW.GLFW_MOUSE_BUTTON_LEFT)) { | ||||
| 				vertAngle -= dy * sensitivity; | ||||
| 				horizAngle += dx * sensitivity; | ||||
| 			} | ||||
| 			if (zoomEnabled) { | ||||
| 				if (distance > 0) { | ||||
| 					distance += dy * sensitivity; | ||||
| 				} else { | ||||
| 					distance = near; | ||||
| 				} | ||||
| 			} | ||||
| 
 | ||||
| 		} else if (clickToZoom) { | ||||
| 
 | ||||
| 			vertAngle -= dy * sensitivity; | ||||
| 			horizAngle += dx * sensitivity; | ||||
| 
 | ||||
| 			if (i.isButtonDown(GLFW.GLFW_MOUSE_BUTTON_RIGHT) && zoomEnabled) { | ||||
| 				if (distance > 0) { | ||||
| 					distance += dy * sensitivity; | ||||
| 				} else { | ||||
| 					distance = near; | ||||
| 				} | ||||
| 			} | ||||
| 
 | ||||
| 		} else { | ||||
| 
 | ||||
| 			vertAngle -= dy * sensitivity; | ||||
| 			horizAngle += dx * sensitivity; | ||||
| 			if (zoomEnabled) { | ||||
| 				if (distance > 0) { | ||||
| 					distance += dy * sensitivity; | ||||
| 				} else { | ||||
| 					distance = near; | ||||
| 				} | ||||
| 			} | ||||
| 
 | ||||
| 		} | ||||
| 
 | ||||
| 
 | ||||
| 		oldMouseX = newMouseX; | ||||
| 		oldMouseY = newMouseY; | ||||
| 
 | ||||
| 		float horizDistance = (float) (distance * Math.cos(Math.toRadians(vertAngle))); | ||||
| 		float vertDistance = (float) (distance * Math.sin(Math.toRadians(vertAngle))); | ||||
| 
 | ||||
| 		float xOffset = (float) (horizDistance * Math.sin(Math.toRadians(-horizAngle))); | ||||
| 		float zOffset = (float) (horizDistance * Math.cos(Math.toRadians(-horizAngle))); | ||||
| 
 | ||||
| 		setPosition(new Vector3f(object.getPosition().getX() + xOffset, object.getPosition().getY() - vertDistance, object.getPosition().getZ() + zOffset)); | ||||
| 		setRotation(new Vector3f(-vertAngle, horizAngle,0)); | ||||
| 
 | ||||
| 		i.reset(); | ||||
| 
 | ||||
| 
 | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										9
									
								
								src/org/hl/engine/objects/TopDownCamera.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								src/org/hl/engine/objects/TopDownCamera.java
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | ||||
| package org.hl.engine.objects; | ||||
| 
 | ||||
| import org.hl.engine.math.lalg.Vector3f; | ||||
| 
 | ||||
| public class TopDownCamera extends FixedCamera { | ||||
| 	public TopDownCamera(Vector3f position) { | ||||
| 		super(position, new Vector3f(90, 0, 0)); | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										42
									
								
								src/org/hl/engine/objects/yloaders/YMesh.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								src/org/hl/engine/objects/yloaders/YMesh.java
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,42 @@ | ||||
| package org.hl.engine.objects.yloaders ; | ||||
| 
 | ||||
| import java.util.ArrayList; | ||||
| 
 | ||||
| public class YMesh implements java.io.Serializable { | ||||
| 	private String type; | ||||
| 	private ArrayList<YPoint> vertices; | ||||
| 	private ArrayList<Integer> cull; | ||||
| 	private String texture; | ||||
| 
 | ||||
| 	public String getType() { | ||||
| 		return type; | ||||
| 	} | ||||
| 
 | ||||
| 	public void setType(String type) { | ||||
| 		this.type = type; | ||||
| 	} | ||||
| 
 | ||||
| 	public ArrayList<YPoint> getVertices() { | ||||
| 		return vertices; | ||||
| 	} | ||||
| 
 | ||||
| 	public void setVertices(ArrayList<YPoint> vertices) { | ||||
| 		this.vertices = vertices; | ||||
| 	} | ||||
| 
 | ||||
| 	public ArrayList<Integer> getCull() { | ||||
| 		return cull; | ||||
| 	} | ||||
| 
 | ||||
| 	public void setCull(ArrayList<Integer> cull) { | ||||
| 		this.cull = cull; | ||||
| 	} | ||||
| 
 | ||||
| 	public String getTexture() { | ||||
| 		return texture; | ||||
| 	} | ||||
| 
 | ||||
| 	public void setTexture(String texture) { | ||||
| 		this.texture = texture; | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										33
									
								
								src/org/hl/engine/objects/yloaders/YPoint.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								src/org/hl/engine/objects/yloaders/YPoint.java
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,33 @@ | ||||
| package org.hl.engine.objects.yloaders; | ||||
| 
 | ||||
| import java.util.ArrayList; | ||||
| 
 | ||||
| public class YPoint implements java.io.Serializable  { | ||||
| 	private ArrayList<Float> vertex; | ||||
| 	private ArrayList<Float> texture; | ||||
| 	private ArrayList<Float> color; | ||||
| 
 | ||||
| 	public ArrayList<Float> getVertex() { | ||||
| 		return vertex; | ||||
| 	} | ||||
| 
 | ||||
| 	public void setVertex(ArrayList<Float> vertex) { | ||||
| 		this.vertex = vertex; | ||||
| 	} | ||||
| 
 | ||||
| 	public ArrayList<Float> getTexture() { | ||||
| 		return texture; | ||||
| 	} | ||||
| 
 | ||||
| 	public void setTexture(ArrayList<Float> texture) { | ||||
| 		this.texture = texture; | ||||
| 	} | ||||
| 
 | ||||
| 	public ArrayList<Float> getColor() { | ||||
| 		return color; | ||||
| 	} | ||||
| 
 | ||||
| 	public void setColor(ArrayList<Float> color) { | ||||
| 		this.color = color; | ||||
| 	} | ||||
| } | ||||
| @ -2,11 +2,16 @@ | ||||
| 
 | ||||
| in vec3 passColor; | ||||
| in vec2 passTextureCoord; | ||||
| uniform int type; | ||||
| 
 | ||||
| out vec4 outColor; | ||||
| 
 | ||||
| uniform sampler2D tex; | ||||
| 
 | ||||
| void main() { | ||||
| 	outColor = texture(tex, passTextureCoord); | ||||
| 	if (type == 1) { | ||||
| 		outColor = texture(tex, passTextureCoord); | ||||
| 	} else { | ||||
| 		outColor = vec4(passColor, 1.0); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @ -7,15 +7,18 @@ layout(location = 2) in vec2 textureCoord; | ||||
| uniform mat4 model; | ||||
| uniform mat4 view; | ||||
| uniform mat4 projection; | ||||
| uniform int type; | ||||
| 
 | ||||
| layout(location = 0) out vec3 passColor; | ||||
| layout(location = 1) out vec2 passTextureCoord; | ||||
| layout(location = 2) out int passType; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| void main() { | ||||
| 	gl_Position =  projection * view  * model *  vec4(position, 1.0); | ||||
| 	passColor = color; | ||||
| 	passType = type; | ||||
| 
 | ||||
| 	passTextureCoord = textureCoord; | ||||
| } | ||||
		Reference in New Issue
	
	Block a user