From 472f280108a6c5fca158c3f4436269ae40bf548c Mon Sep 17 00:00:00 2001 From: trotFunky Date: Tue, 24 Sep 2019 09:34:53 +0200 Subject: [PATCH] Base program with rotating pyramids --- .gitignore | 2 + CMakeLists.txt | 22 +++++++++ src/main.cpp | 121 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 145 insertions(+) create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 src/main.cpp diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..822dd55 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +cmake-build-*/ +.idea/ diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..b47a9b3 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,22 @@ +cmake_minimum_required(VERSION 3.14) +project(tests_opengl) + +set(CMAKE_CXX_STANDARD 14) + +find_package(OpenGL REQUIRED) +find_package(GLUT REQUIRED) + +if(NOT ${OPENGL_GLU_FOUND}) + message(FATAL_ERROR "Glu not installed!") +endif() + +add_executable(tests_opengl + src/main.cpp) + +target_link_libraries(tests_opengl + ${OPENGL_LIBRARIES} + ${GLUT_LIBRARIES}) + +target_include_directories(tests_opengl PRIVATE + ${OPENGL_INCLUDE_DIR} + ${GLUT_INCLUDE_DIR}) \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..cb2b7c4 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,121 @@ +#include "GL/glut.h" + + +volatile unsigned long long int timer_ticks = 0; + +/// Displays a square based pyramid from a base position, height and side length +/// \param x X coordinate of the center +/// \param y Y coordinate of the center +/// \param z Z coordinate of the center +/// \param c Side length of the square +/// \param h Height of the pyramid +void display_pyramid(float x, float y, float z, float c, float h) +{ + glBegin(GL_TRIANGLES); + + // First side + glColor3f(1,0,0); + + // Summit + glVertex3f(x,y+h,z); + glVertex3f(x+c/2,y,z+c/2); + glVertex3f(x-c/2,y,z+c/2); + + // Second side + glColor3f(0,1,0); + + glVertex3f(x,y+h,z); + glVertex3f(x+c/2,y,z+c/2); + glVertex3f(x+c/2,y,z-c/2); + + // Third side + glColor3f(0,0,1); + + glVertex3f(x,y+h,z); + glVertex3f(x-c/2,y,z+c/2); + glVertex3f(x-c/2,y,z-c/2); + + // Fourth side + glColor3f(1,1,0); + + glVertex3f(x,y+h,z); + glVertex3f(x-c/2,y,z-c/2); + glVertex3f(x+c/2,y,z-c/2); + + glEnd(); + // Bottom + glBegin(GL_QUADS); + + glColor3f(0,1,1); + glVertex3f(x-c/2,y,z-c/2); + glVertex3f(x-c/2,y,z+c/2); + glVertex3f(x+c/2,y,z+c/2); + glVertex3f(x+c/2,y,z-c/2); + + glEnd(); +} + +/// Draw a pyramid rotated around its axis +void display_rotating_pyramid(float x, float y, float z, float c, float h, float alpha) +{ + glPushMatrix(); + glTranslatef(x,0,z); + glRotatef(alpha,0,1,0); + glTranslatef(-x,0,-z); + display_pyramid(x,y,z,c,h); + glPopMatrix(); +} + +void display() +{ + float angleY = 1*timer_ticks; + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glMatrixMode(GL_PROJECTION); + // Prepare view + glLoadIdentity(); + gluPerspective(60,(double)glutGet(GLUT_WINDOW_WIDTH)/(double)glutGet(GLUT_WINDOW_HEIGHT),10,30000); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + gluLookAt(10, 10, 10, + 0, 0, 1, + 0, 1, 0); + + + display_rotating_pyramid(0,-2,0,2,4,angleY); + display_rotating_pyramid(3,-2,0,1,5,angleY); + display_rotating_pyramid(-2,-2,4,3,2,angleY); + + glutSwapBuffers(); +} + +void update_angle(int value) +{ + timer_ticks++; + glutTimerFunc(50,update_angle,0); +} + +int main(int argc, char** argv) +{ + glutInit(&argc,argv); + // Generate window with GLUT + glutInitDisplayMode(GLUT_RGB| GLUT_DEPTH | GLUT_DOUBLE); + glutCreateWindow("Hello"); + + // Init OpenGL + glClearColor(0,0,0,1); + glClearDepth(1.0); +// glEnable(GL_LIGHTING); +// glEnable(GL_LIGHT0); + glEnable(GL_DEPTH_TEST); + + glViewport(0,0,glutGet(GLUT_WINDOW_WIDTH),glutGet(GLUT_WINDOW_HEIGHT)); + + glutIdleFunc(display); + glutTimerFunc(50,update_angle,0); + + // Enters main loop, managed by GLUT + glutMainLoop(); + return 0; +}