Can draw a triangle
This commit is contained in:
parent
e97b3a24c4
commit
4d5b548ffe
6 changed files with 229 additions and 4 deletions
46
.kdev4/testgame.kdev4
Normal file
46
.kdev4/testgame.kdev4
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
[CMake]
|
||||||
|
Build Directory Count=1
|
||||||
|
Current Build Directory Index=0
|
||||||
|
ProjectRootRelative=./
|
||||||
|
|
||||||
|
[CMake][CMake Build Directory 0]
|
||||||
|
Build Directory Path=file:///usr/home/morten/projects/testgame/build
|
||||||
|
Build Type=Debug
|
||||||
|
CMake Binary=file:///usr/local/bin/cmake
|
||||||
|
Environment Profile=
|
||||||
|
Extra Arguments=
|
||||||
|
Install Directory=
|
||||||
|
|
||||||
|
[CustomDefinesAndIncludes][ProjectPath0]
|
||||||
|
Defines=\x00\x00\x00\x00
|
||||||
|
Includes=\x00\x00\x00\x01\x00\x00\x00H\x00/\x00u\x00s\x00r\x00/\x00h\x00o\x00m\x00e\x00/\x00m\x00o\x00r\x00t\x00e\x00n\x00/\x00p\x00r\x00o\x00j\x00e\x00c\x00t\x00s\x00/\x00t\x00e\x00s\x00t\x00g\x00a\x00m\x00e\x00/\x00.
|
||||||
|
Path=.
|
||||||
|
|
||||||
|
[Defines And Includes][Compiler]
|
||||||
|
Name=GCC
|
||||||
|
Path=gcc
|
||||||
|
Type=GCC
|
||||||
|
|
||||||
|
[Launch]
|
||||||
|
Launch Configurations=Launch Configuration 0
|
||||||
|
|
||||||
|
[Launch][Launch Configuration 0]
|
||||||
|
Configured Launch Modes=execute
|
||||||
|
Configured Launchers=nativeAppLauncher
|
||||||
|
Name=testgame
|
||||||
|
Type=Native Application
|
||||||
|
|
||||||
|
[Launch][Launch Configuration 0][Data]
|
||||||
|
Arguments=
|
||||||
|
Dependencies=@Variant(\x00\x00\x00\t\x00\x00\x00\x00\x01\x00\x00\x00\x0b\x00\x00\x00\x00\x02\x00\x00\x00\x10\x00t\x00e\x00s\x00t\x00g\x00a\x00m\x00e\x00\x00\x00\x10\x00t\x00e\x00s\x00t\x00g\x00a\x00m\x00e)
|
||||||
|
Dependency Action=Build
|
||||||
|
EnvironmentGroup=
|
||||||
|
Executable=file:///usr/home/morten/projects/testgame/
|
||||||
|
External Terminal=konsole --noclose --workdir %workdir -e %exe
|
||||||
|
Project Target=testgame,testgame
|
||||||
|
Use External Terminal=false
|
||||||
|
Working Directory=
|
||||||
|
isExecutable=false
|
||||||
|
|
||||||
|
[Project]
|
||||||
|
VersionControlSupport=kdevgit
|
|
@ -1,6 +1,13 @@
|
||||||
cmake_minimum_required(VERSION 2.6)
|
cmake_minimum_required(VERSION 2.6)
|
||||||
project(testgame)
|
project(testgame)
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -I..")
|
||||||
add_executable(testgame main.cpp)
|
set(CMAKE_LD_FLAGS "${CMAKE_LD_FLAGS} -L/usr/local/bin")
|
||||||
|
add_executable(testgame main.cpp renderer/main.cpp)
|
||||||
|
INCLUDE(FindPkgConfig)
|
||||||
|
PKG_SEARCH_MODULE(SDL2 REQUIRED sdl2)
|
||||||
|
INCLUDE_DIRECTORIES(${SDL2_INCLUDE_DIRS})
|
||||||
|
find_library(SDL SDL2)
|
||||||
|
find_library(GLEW GLEW)
|
||||||
|
find_library(GL GL)
|
||||||
|
TARGET_LINK_LIBRARIES(testgame ${SDL} ${GLEW} ${GL})
|
||||||
install(TARGETS testgame RUNTIME DESTINATION bin)
|
install(TARGETS testgame RUNTIME DESTINATION bin)
|
||||||
|
|
112
main.cpp
112
main.cpp
|
@ -1,6 +1,116 @@
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <main.h>
|
||||||
|
#include <SDL.h>
|
||||||
|
#include <GL/glew.h>
|
||||||
|
using namespace std;
|
||||||
|
bool TestGame::init()
|
||||||
|
{
|
||||||
|
GLint compile_ok = GL_FALSE, link_ok = GL_FALSE;
|
||||||
|
//Compile Vertex shader
|
||||||
|
GLuint vs = glCreateShader(GL_VERTEX_SHADER);
|
||||||
|
const char *vs_source =
|
||||||
|
//"#version 100\n" // OpenGL ES 2.0
|
||||||
|
"#version 120\n" // OpenGL 2.1
|
||||||
|
"attribute vec2 coord2d; "
|
||||||
|
"void main(void) { "
|
||||||
|
" gl_Position = vec4(coord2d, 0.0, 1.0); "
|
||||||
|
"}";
|
||||||
|
glShaderSource(vs, 1, &vs_source, NULL);
|
||||||
|
glCompileShader(vs);
|
||||||
|
glGetShaderiv(vs, GL_COMPILE_STATUS, &compile_ok);
|
||||||
|
if (!compile_ok) {
|
||||||
|
cerr << "Error in vertex shader" << endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
//Compile Fragment shader
|
||||||
|
GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);
|
||||||
|
const char *fs_source =
|
||||||
|
//"#version 100\n" // OpenGL ES 2.0
|
||||||
|
"#version 120\n" // OpenGL 2.1
|
||||||
|
"void main(void) { "
|
||||||
|
" gl_FragColor[0] = 0.0; "
|
||||||
|
" gl_FragColor[1] = 0.0; "
|
||||||
|
" gl_FragColor[2] = 1.0; "
|
||||||
|
"}";
|
||||||
|
glShaderSource(fs, 1, &fs_source, NULL);
|
||||||
|
glCompileShader(fs);
|
||||||
|
glGetShaderiv(fs, GL_COMPILE_STATUS, &compile_ok);
|
||||||
|
if (!compile_ok) {
|
||||||
|
cerr << "Error in fragment shader" << endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
//Linking
|
||||||
|
program = glCreateProgram();
|
||||||
|
glAttachShader(program, vs);
|
||||||
|
glAttachShader(program, fs);
|
||||||
|
glLinkProgram(program);
|
||||||
|
glGetProgramiv(program, GL_LINK_STATUS, &link_ok);
|
||||||
|
if (!link_ok) {
|
||||||
|
cerr << "Error in glLinkProgram" << endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const char* attribute_name = "coord2d";
|
||||||
|
attribute_coord2d = glGetAttribLocation(program, attribute_name);
|
||||||
|
if (attribute_coord2d == -1) {
|
||||||
|
cerr << "Could not bind attribute " << attribute_name << endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
void TestGame::stop()
|
||||||
|
{
|
||||||
|
//To be written
|
||||||
|
}
|
||||||
|
bool TestGame::tick()
|
||||||
|
{
|
||||||
|
SDL_Event ev;
|
||||||
|
while (SDL_PollEvent(&ev)) {
|
||||||
|
if (ev.type == SDL_QUIT)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
render();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
void TestGame::render()
|
||||||
|
{
|
||||||
|
//Clear Background
|
||||||
|
glClearColor(1.0, 1.0, 1.0, 1.0);
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
|
glUseProgram(program);
|
||||||
|
glEnableVertexAttribArray(attribute_coord2d);
|
||||||
|
GLfloat triangle_vertices[] = {
|
||||||
|
0.0, 0.8,
|
||||||
|
-0.8, -0.8,
|
||||||
|
0.8, -0.8,
|
||||||
|
};
|
||||||
|
// Describe our vertices array to OpenGL (it can't guess its format automatically)
|
||||||
|
glVertexAttribPointer(
|
||||||
|
attribute_coord2d, // attribute
|
||||||
|
2, // number of elements per vertex, here (x,y)
|
||||||
|
GL_FLOAT, // the type of each element
|
||||||
|
GL_FALSE, // take our values as-is
|
||||||
|
0, // no extra data between each position
|
||||||
|
triangle_vertices // pointer to the C array
|
||||||
|
);
|
||||||
|
|
||||||
|
// Push each element in buffer_vertices to the vertex shader
|
||||||
|
glDrawArrays(GL_TRIANGLES, 0, 3);
|
||||||
|
|
||||||
|
glDisableVertexAttribArray(attribute_coord2d);
|
||||||
|
|
||||||
|
// Display the result
|
||||||
|
SDL_GL_SwapWindow(window);
|
||||||
|
}
|
||||||
|
TestGame::~TestGame()
|
||||||
|
{
|
||||||
|
glDeleteProgram(program);
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
std::cout << "Hello, world!" << std::endl;
|
TestGame game;
|
||||||
|
game.start();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
15
main.h
Normal file
15
main.h
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
#include <renderer/main.h>
|
||||||
|
#include <GL/glew.h>
|
||||||
|
class TestGame: public MainClass {
|
||||||
|
private:
|
||||||
|
GLuint program;
|
||||||
|
GLint attribute_coord2d;
|
||||||
|
auto render() -> void;
|
||||||
|
protected:
|
||||||
|
virtual auto tick() -> bool;
|
||||||
|
virtual auto init() -> bool;
|
||||||
|
public:
|
||||||
|
TestGame(): MainClass(640,480) {};
|
||||||
|
virtual ~TestGame();
|
||||||
|
virtual auto stop() -> void;
|
||||||
|
};
|
30
renderer/main.cpp
Normal file
30
renderer/main.cpp
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
#include <renderer/main.h>
|
||||||
|
#include <iostream>
|
||||||
|
#include <GL/glew.h>
|
||||||
|
using namespace std;
|
||||||
|
MainClass::MainClass(int width, int height)
|
||||||
|
{
|
||||||
|
SDL_Init(SDL_INIT_VIDEO);
|
||||||
|
window = SDL_CreateWindow("Testgame", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, SDL_WINDOW_RESIZABLE | SDL_WINDOW_OPENGL);
|
||||||
|
SDL_GL_CreateContext(window);
|
||||||
|
}
|
||||||
|
void MainClass::start()
|
||||||
|
{
|
||||||
|
/* Extension wrangler initialising */
|
||||||
|
GLenum glew_status = glewInit();
|
||||||
|
if (glew_status != GLEW_OK) {
|
||||||
|
cerr << "Error: glewInit: " << glewGetErrorString(glew_status) << endl;
|
||||||
|
throw nullptr;
|
||||||
|
}
|
||||||
|
if(!init()) {
|
||||||
|
cerr << "Error: could not init game!" << endl;
|
||||||
|
throw nullptr;
|
||||||
|
}
|
||||||
|
while(tick());
|
||||||
|
stop();
|
||||||
|
}
|
||||||
|
MainClass::~MainClass()
|
||||||
|
{
|
||||||
|
SDL_DestroyWindow(window);
|
||||||
|
SDL_Quit();
|
||||||
|
}
|
17
renderer/main.h
Normal file
17
renderer/main.h
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
#ifndef __RENDERER_MAIN_H
|
||||||
|
#define __RENDERER_MAIN_H
|
||||||
|
#include <SDL.h>
|
||||||
|
class MainClass {
|
||||||
|
private:
|
||||||
|
MainClass() {};
|
||||||
|
protected:
|
||||||
|
SDL_Window* window;
|
||||||
|
virtual auto tick() -> bool = 0;
|
||||||
|
virtual auto init() -> bool = 0;
|
||||||
|
public:
|
||||||
|
MainClass(int width, int height);
|
||||||
|
virtual ~MainClass();
|
||||||
|
virtual auto start() -> void;
|
||||||
|
virtual auto stop() -> void =0;
|
||||||
|
};
|
||||||
|
#endif
|
Loading…
Reference in a new issue