lua integration
This commit is contained in:
		
							parent
							
								
									d5788228f6
								
							
						
					
					
						commit
						86f6203efc
					
				
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -1,2 +1,2 @@ | |||||||
| *.o | *.o | ||||||
| core/couch | couch | ||||||
|  | |||||||
							
								
								
									
										16
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								Makefile
									
									
									
									
									
								
							| @ -1,2 +1,14 @@ | |||||||
| all: | include common.mk | ||||||
| 	$(MAKE) -C core | 
 | ||||||
|  | CORE_SRC = $(wildcard core/*.cpp) | ||||||
|  | CORE_OBJ = $(CORE_SRC:.cpp=.o) | ||||||
|  | 
 | ||||||
|  | all: couch | ||||||
|  | couch: $(CORE_OBJ) scripting/couch_wrap.o | ||||||
|  | 	$(CXX) $(LIBS) -o $@ $^ | ||||||
|  | 
 | ||||||
|  | $(CORE_OBJ): %.o: %.cpp | ||||||
|  | 	$(MAKE) -C core $(notdir $@) | ||||||
|  | 
 | ||||||
|  | scripting/couch_wrap.o: scripting/couch.i | ||||||
|  | 	$(MAKE) -C scripting $(notdir $@) | ||||||
|  | |||||||
| @ -1,3 +1,3 @@ | |||||||
| CXX = g++ | CXX := g++ | ||||||
| CXXFLAGS = `pkg-config --cflags gl glew glfw3 guile-2.2` -g | CXXFLAGS := `pkg-config --cflags gl glew glfw3 lua` -fPIC -g | ||||||
| LIBS = `pkg-config --libs gl glew glfw3 guile-2.2` | LIBS := `pkg-config --libs gl glew glfw3 lua` | ||||||
|  | |||||||
| @ -1,12 +1,35 @@ | |||||||
| #include "Ball.h" | #include "Ball.h" | ||||||
| 
 | 
 | ||||||
| Ball::Ball() { | Ball::Ball() { | ||||||
|  |   // It's a cube really
 | ||||||
|  |   // Front
 | ||||||
|  |   vertices.push_back(Vertex(1.0f, 1.0f, 1.0f)); | ||||||
|  |   vertices.push_back(Vertex(1.0f, -1.0f, 1.0f)); | ||||||
|  |   vertices.push_back(Vertex(-1.0f, 1.0f, 1.0f)); | ||||||
|  |   vertices.push_back(Vertex(-1.0f, -1.0f, 1.0f)); | ||||||
|  |   // Back
 | ||||||
|   vertices.push_back(Vertex(1.0f, 1.0f, -1.0f)); |   vertices.push_back(Vertex(1.0f, 1.0f, -1.0f)); | ||||||
|   vertices.push_back(Vertex(1.0f, -1.0f, -1.0f)); |   vertices.push_back(Vertex(1.0f, -1.0f, -1.0f)); | ||||||
|   vertices.push_back(Vertex(-1.0f, 1.0f, -1.0f)); |   vertices.push_back(Vertex(-1.0f, 1.0f, -1.0f)); | ||||||
|   vertices.push_back(Vertex(-1.0f, -1.0f, -1.0f)); |   vertices.push_back(Vertex(-1.0f, -1.0f, -1.0f)); | ||||||
| 
 | 
 | ||||||
|  |   //Front
 | ||||||
|   indices.push_back(Index(0, 1, 2)); |   indices.push_back(Index(0, 1, 2)); | ||||||
|   indices.push_back(Index(1, 2, 3)); |   indices.push_back(Index(1, 2, 3)); | ||||||
|  |   //Back
 | ||||||
|  |   indices.push_back(Index(4, 5, 6)); | ||||||
|  |   indices.push_back(Index(5, 6, 7)); | ||||||
|  |   // Top
 | ||||||
|  |   indices.push_back(Index(0, 4, 6)); | ||||||
|  |   indices.push_back(Index(0, 2, 6)); | ||||||
|  |   // Bottom
 | ||||||
|  |   indices.push_back(Index(1, 3, 7)); | ||||||
|  |   indices.push_back(Index(1, 5, 7)); | ||||||
|  |   // Left side
 | ||||||
|  |   indices.push_back(Index(0, 1, 5)); | ||||||
|  |   indices.push_back(Index(0, 4, 5)); | ||||||
|  |   // Right side
 | ||||||
|  |   indices.push_back(Index(2, 3, 7)); | ||||||
|  |   indices.push_back(Index(2, 6, 7)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										17
									
								
								core/Camera.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								core/Camera.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,17 @@ | |||||||
|  | #include "Camera.h" | ||||||
|  | 
 | ||||||
|  | Camera::Camera() { | ||||||
|  |   if (!currentCamera) { | ||||||
|  |     currentCamera = this; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void Camera::MakeCurrent() { | ||||||
|  |   currentCamera = this; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | Camera*Camera::GetCurrentCamera() { | ||||||
|  |   return currentCamera; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | Camera *Camera::currentCamera = nullptr; | ||||||
							
								
								
									
										16
									
								
								core/Camera.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								core/Camera.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,16 @@ | |||||||
|  | #ifndef CAMERA_H | ||||||
|  | #define CAMERA_H | ||||||
|  | 
 | ||||||
|  | #include "Transform.h" | ||||||
|  | 
 | ||||||
|  | class Camera { | ||||||
|  | public: | ||||||
|  |   Camera(); | ||||||
|  |   Transform transform; | ||||||
|  |   void MakeCurrent(); | ||||||
|  |   static Camera *GetCurrentCamera(); | ||||||
|  | private: | ||||||
|  |   static Camera *currentCamera; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | #endif /* CAMERA_H */ | ||||||
| @ -1,8 +1,8 @@ | |||||||
| include ../common.mk | include ../common.mk | ||||||
| 
 | 
 | ||||||
|  | CXXFLAGS := $(CXXFLAGS) -DLUA_SCRIPTING | ||||||
|  | 
 | ||||||
| SOURCES = $(wildcard *.cpp) | SOURCES = $(wildcard *.cpp) | ||||||
| OBJS = $(SOURCES:.cpp=.o) | OBJS = $(SOURCES:.cpp=.o) | ||||||
| 
 | 
 | ||||||
| all: couch | all: $(OBJS) | ||||||
| couch: $(OBJS) |  | ||||||
| 	$(CXX) $(LIBS) -o $@ $^ |  | ||||||
|  | |||||||
| @ -1,6 +1,8 @@ | |||||||
| #ifndef MESH_H | #ifndef MESH_H | ||||||
| #define MESH_H | #define MESH_H | ||||||
| 
 | 
 | ||||||
|  | #include <list> | ||||||
|  | 
 | ||||||
| #include "types.h" | #include "types.h" | ||||||
| #include "Vertex.h" | #include "Vertex.h" | ||||||
| #include "Index.h" | #include "Index.h" | ||||||
| @ -19,4 +21,6 @@ private: | |||||||
|   Id VAO, VBO, EBO; |   Id VAO, VBO, EBO; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | typedef std::list<Mesh*> MeshList; | ||||||
|  | 
 | ||||||
| #endif /* MESH_H */ | #endif /* MESH_H */ | ||||||
|  | |||||||
| @ -7,3 +7,7 @@ Transform::Transform() { | |||||||
| Transform::Transform(Vector3 position) { | Transform::Transform(Vector3 position) { | ||||||
|   this->position = position; |   this->position = position; | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | void Transform::Translate(cfloat x, cfloat y, cfloat z) { | ||||||
|  |   position = position + Vector3(x, y, z); | ||||||
|  | } | ||||||
|  | |||||||
| @ -7,6 +7,7 @@ struct Transform { | |||||||
|   Transform(); |   Transform(); | ||||||
|   Transform(Vector3 position); |   Transform(Vector3 position); | ||||||
|   Vector3 position; |   Vector3 position; | ||||||
|  |   void Translate(cfloat x, cfloat y, cfloat z); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| #endif /* TRANSFORM_H */ | #endif /* TRANSFORM_H */ | ||||||
|  | |||||||
| @ -1,21 +1,45 @@ | |||||||
|  | // C++ includes
 | ||||||
| #include <iostream> | #include <iostream> | ||||||
| 
 | 
 | ||||||
|  | #ifdef LUA_SCRIPTING | ||||||
|  | // Lua includes
 | ||||||
|  | extern "C" { | ||||||
|  | #include <lua.h> | ||||||
|  | #include <lualib.h> | ||||||
|  | #include <lauxlib.h>   | ||||||
|  | } | ||||||
|  | #endif // LUA_SCRIPTING
 | ||||||
|  | 
 | ||||||
|  | // OpenGL Includes
 | ||||||
| #include <GL/glew.h> | #include <GL/glew.h> | ||||||
| #include <GLFW/glfw3.h> | #include <GLFW/glfw3.h> | ||||||
| 
 |  | ||||||
| #include <glm/gtc/matrix_transform.hpp> | #include <glm/gtc/matrix_transform.hpp> | ||||||
| 
 | 
 | ||||||
| #include "types.h" | #include "types.h" | ||||||
| 
 | 
 | ||||||
| #include "Shader.h" | #include "Shader.h" | ||||||
| #include "Ball.h" | #include "Ball.h" | ||||||
|  | #include "Camera.h" | ||||||
| 
 | 
 | ||||||
| Window *window; | Window *window; | ||||||
| 
 | 
 | ||||||
| const int width = 800; | const int width = 800; | ||||||
| const int height = 600; | const int height = 600; | ||||||
| 
 | 
 | ||||||
|  | MeshList meshes; | ||||||
|  | 
 | ||||||
|  | void AddMeshToList(Mesh &mesh) { | ||||||
|  |   meshes.push_front(&mesh); | ||||||
|  | } | ||||||
|  | #ifdef LUA_SCRIPTING | ||||||
|  | 
 | ||||||
|  | extern "C" int luaopen_couch(lua_State* L); | ||||||
|  | 
 | ||||||
|  | #endif // LUA_SCRIPTING
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| int main() { | int main() { | ||||||
|  | 
 | ||||||
|   int err; |   int err; | ||||||
|   glfwInit(); |   glfwInit(); | ||||||
|   glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); |   glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); | ||||||
| @ -38,29 +62,70 @@ int main() { | |||||||
| 
 | 
 | ||||||
|   glViewport(0, 0, width, height); |   glViewport(0, 0, width, height); | ||||||
| 
 | 
 | ||||||
|  | #ifdef LUA_SCRIPTING | ||||||
|  |   lua_State *L; | ||||||
|  |   L = luaL_newstate(); | ||||||
|  |   luaopen_base(L); | ||||||
|  |   luaopen_couch(L); | ||||||
|  |   if (luaL_loadfile(L, "main.lua") == 0){ | ||||||
|  |     lua_call(L, 0, 0); | ||||||
|  |     lua_getglobal(L, "init"); | ||||||
|  |     lua_call(L, 0, 0); | ||||||
|  |   } else { | ||||||
|  |     std::cerr << "Could not find main.lua" << std::endl; | ||||||
|  |     return 1; | ||||||
|  |   } | ||||||
|  | #endif // LUA_SCRIPTING
 | ||||||
|  | 
 | ||||||
|  |   Camera defaultCamera; | ||||||
|  |    | ||||||
|   Shader shader("shaders/flat.vert", "shaders/flat.frag"); |   Shader shader("shaders/flat.vert", "shaders/flat.frag"); | ||||||
|   shader.Use(); |   shader.Use(); | ||||||
|    |    | ||||||
|   Ball ball; |  | ||||||
|   ball.SetupMesh(); |  | ||||||
| 
 |  | ||||||
|   Matrix projection = glm::perspective(glm::radians(45.0f), 800.0f/600.0f, 0.1f, 100.0f); |   Matrix projection = glm::perspective(glm::radians(45.0f), 800.0f/600.0f, 0.1f, 100.0f); | ||||||
|   shader.UpdateProjection(projection); |   shader.UpdateProjection(projection); | ||||||
|   Matrix view(1.0f); | 
 | ||||||
|   shader.UpdateView(view); |   double lastTime = glfwGetTime(); | ||||||
|  |   double delta = 0.0; | ||||||
| 
 | 
 | ||||||
|   while(!glfwWindowShouldClose(window)) { |   while(!glfwWindowShouldClose(window)) { | ||||||
|     glClearColor(0.5f, 0.5f, 0.5f, 1.0f); |     glClearColor(0.5f, 0.5f, 0.5f, 1.0f); | ||||||
|     glClear(GL_COLOR_BUFFER_BIT); |     glClear(GL_COLOR_BUFFER_BIT); | ||||||
| 
 | 
 | ||||||
|     Matrix model(1.0f); | 
 | ||||||
|     model = glm::translate(model, ball.transform.position); |     Matrix view(1.0f); | ||||||
|     shader.UpdateModel(model); |     Camera *camera = Camera::GetCurrentCamera(); | ||||||
|     ball.Draw(); |     view = glm::translate(view, -camera->transform.position); | ||||||
|  |     shader.UpdateView(view); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifdef LUA_SCRIPTING | ||||||
|  |     lua_getglobal(L, "update"); | ||||||
|  |     lua_pushnumber(L, delta); | ||||||
|  |     lua_call(L, 1, 0); | ||||||
|  | #endif // LUA_SCRIPTING
 | ||||||
|  | 
 | ||||||
|  |     for (Mesh *mesh : meshes) { | ||||||
|  |       Matrix model(1.0f); | ||||||
|  |       model = glm::translate(model, mesh->transform.position); | ||||||
|  |       shader.UpdateModel(model); | ||||||
|  |       mesh->Draw(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|      |      | ||||||
|     glfwSwapBuffers(window); |     glfwSwapBuffers(window); | ||||||
|     glfwPollEvents(); |     glfwPollEvents(); | ||||||
|  | 
 | ||||||
|  |     double curTime = glfwGetTime(); | ||||||
|  |     delta = curTime - lastTime; | ||||||
|  |     lastTime = curTime; | ||||||
|   } |   } | ||||||
|  | 
 | ||||||
|  | #ifdef LUA_SCRIPTING | ||||||
|  | 
 | ||||||
|  |   lua_close(L); | ||||||
|  | 
 | ||||||
|  | #endif // LUA_SCRIPTING
 | ||||||
|    |    | ||||||
|   glfwDestroyWindow(window); |   glfwDestroyWindow(window); | ||||||
|   glfwTerminate(); |   glfwTerminate(); | ||||||
|  | |||||||
							
								
								
									
										14
									
								
								main.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								main.lua
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | |||||||
|  | local ball | ||||||
|  | local camera | ||||||
|  | 
 | ||||||
|  | function init() | ||||||
|  |    camera = couch.Camera() | ||||||
|  |    camera:MakeCurrent() | ||||||
|  |    ball = couch.Ball() | ||||||
|  |    ball:SetupMesh() | ||||||
|  |    couch.AddMeshToList(ball) | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | function update(delta) | ||||||
|  |    camera.transform:Translate(0.0, 0.0, 1.0 * delta); | ||||||
|  | end | ||||||
| @ -5,7 +5,7 @@ | |||||||
| - GLEW to wrangle extensions | - GLEW to wrangle extensions | ||||||
| - GLFW3 for handling windows and whatnot | - GLFW3 for handling windows and whatnot | ||||||
| - Targets Windows, Linux | - Targets Windows, Linux | ||||||
| - Guile with GOOPS as scripting language | - ~~Guile with GOOPS as scripting language~~ Lua is the scripting language with Guile as a strech goal | ||||||
| - No editor planned | - No editor planned | ||||||
| 
 | 
 | ||||||
| ## Roadmap | ## Roadmap | ||||||
|  | |||||||
							
								
								
									
										2
									
								
								scripting/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								scripting/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,2 @@ | |||||||
|  | couch_wrap.cpp | ||||||
|  | couch_wrap.o | ||||||
							
								
								
									
										12
									
								
								scripting/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								scripting/Makefile
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,12 @@ | |||||||
|  | include ../common.mk | ||||||
|  | 
 | ||||||
|  | SWIG := swig | ||||||
|  | SWIG_OPTS := -lua | ||||||
|  | 
 | ||||||
|  | all: couch_wrap.o | ||||||
|  | 
 | ||||||
|  | couch_wrap.o: couch_wrap.cpp | ||||||
|  | 	$(CXX) $(CXXFLAGS) -I../core -c -o $@ $^ | ||||||
|  | 
 | ||||||
|  | couch_wrap.cpp: couch.i | ||||||
|  | 	$(SWIG) -c++ $(SWIG_OPTS) -I../core -o $@ $^ | ||||||
							
								
								
									
										20
									
								
								scripting/couch.i
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								scripting/couch.i
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,20 @@ | |||||||
|  | %module couch | ||||||
|  | 
 | ||||||
|  | %typemap(in) cfloat { | ||||||
|  |   $1 = (cfloat) lua_tonumber(L, $input); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | %{ | ||||||
|  | #include "types.h" | ||||||
|  | #include "Transform.h" | ||||||
|  | #include "Mesh.h" | ||||||
|  | #include "Ball.h" | ||||||
|  | #include "Camera.h" | ||||||
|  | extern void AddMeshToList(Mesh &mesh); | ||||||
|  | %} | ||||||
|  | %include "types.h" | ||||||
|  | %include "Transform.h" | ||||||
|  | %include "Mesh.h" | ||||||
|  | %include "Ball.h" | ||||||
|  | %include "Camera.h" | ||||||
|  | extern void AddMeshToList(Mesh &mesh); | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Dane Johnson
						Dane Johnson