Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //=============================================================================================
- // Szamitogepes grafika hazi feladat keret. Ervenyes 2017-tol.
- // A //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- // sorokon beluli reszben celszeru garazdalkodni, mert a tobbit ugyis toroljuk.
- // A beadott program csak ebben a fajlban lehet, a fajl 1 byte-os ASCII karaktereket tartalmazhat.
- // Tilos:
- // - mast "beincludolni", illetve mas konyvtarat hasznalni
- // - faljmuveleteket vegezni a printf-et kivéve
- // - new operatort hivni a lefoglalt adat korrekt felszabaditasa nelkul
- // - felesleges programsorokat a beadott programban hagyni
- // - felesleges kommenteket a beadott programba irni a forrasmegjelolest kommentjeit kiveve
- // ---------------------------------------------------------------------------------------------
- // A feladatot ANSI C++ nyelvu forditoprogrammal ellenorizzuk, a Visual Studio-hoz kepesti elteresekrol
- // es a leggyakoribb hibakrol (pl. ideiglenes objektumot nem lehet referencia tipusnak ertekul adni)
- // a hazibeado portal ad egy osszefoglalot.
- // ---------------------------------------------------------------------------------------------
- // A feladatmegoldasokban csak olyan OpenGL/GLUT fuggvenyek hasznalhatok, amelyek az oran a feladatkiadasig elhangzottak
- //
- // NYILATKOZAT
- // ---------------------------------------------------------------------------------------------
- // Nev : Kovács László
- // Neptun : JNH1DH
- // ---------------------------------------------------------------------------------------------
- // ezennel kijelentem, hogy a feladatot magam keszitettem, es ha barmilyen segitseget igenybe vettem vagy
- // mas szellemi termeket felhasznaltam, akkor a forrast es az atvett reszt kommentekben egyertelmuen jeloltem.
- // A forrasmegjeloles kotelme vonatkozik az eloadas foliakat es a targy oktatoi, illetve a
- // grafhazi doktor tanacsait kiveve barmilyen csatornan (szoban, irasban, Interneten, stb.) erkezo minden egyeb
- // informaciora (keplet, program, algoritmus, stb.). Kijelentem, hogy a forrasmegjelolessel atvett reszeket is ertem,
- // azok helyessegere matematikai bizonyitast tudok adni. Tisztaban vagyok azzal, hogy az atvett reszek nem szamitanak
- // a sajat kontribucioba, igy a feladat elfogadasarol a tobbi resz mennyisege es minosege alapjan szuletik dontes.
- // Tudomasul veszem, hogy a forrasmegjeloles kotelmenek megsertese eseten a hazifeladatra adhato pontokat
- // negativ elojellel szamoljak el es ezzel parhuzamosan eljaras is indul velem szemben.
- //=============================================================================================
- #define _USE_MATH_DEFINES
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- #include <vector>
- #if defined(__APPLE__)
- #include <GLUT/GLUT.h>
- #include <OpenGL/gl3.h>
- #include <OpenGL/glu.h>
- #else
- #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__)
- #include <windows.h>
- #endif
- #include <GL/glew.h> // must be downloaded
- #include <GL/freeglut.h> // must be downloaded unless you have an Apple
- #endif
- const unsigned int windowWidth = 600, windowHeight = 600;
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- // You are supposed to modify the code from here...
- // OpenGL major and minor versions
- int majorVersion = 3, minorVersion = 3;
- void getErrorInfo(unsigned int handle) {
- int logLen;
- glGetShaderiv(handle, GL_INFO_LOG_LENGTH, &logLen);
- if (logLen > 0) {
- char * log = new char[logLen];
- int written;
- glGetShaderInfoLog(handle, logLen, &written, log);
- printf("Shader log:\n%s", log);
- delete log;
- }
- }
- // check if shader could be compiled
- void checkShader(unsigned int shader, char * message) {
- int OK;
- glGetShaderiv(shader, GL_COMPILE_STATUS, &OK);
- if (!OK) {
- printf("%s!\n", message);
- getErrorInfo(shader);
- }
- }
- // check if shader could be linked
- void checkLinking(unsigned int program) {
- int OK;
- glGetProgramiv(program, GL_LINK_STATUS, &OK);
- if (!OK) {
- printf("Failed to link shader program!\n");
- getErrorInfo(program);
- }
- }
- // vertex shader in GLSL
- const char * vertexSource = R"(
- #version 330
- precision highp float;
- uniform mat4 MVP; // Model-View-Projection matrix in row-major format
- layout(location = 0) in vec2 vertexPosition; // Attrib Array 0
- layout(location = 1) in vec3 vertexColor; // Attrib Array 1
- out vec3 color; // output attribute
- void main() {
- color = vertexColor; // copy color from input to output
- gl_Position = vec4(vertexPosition.x, vertexPosition.y, 0, 1) * MVP; // transform to clipping space
- }
- )";
- // fragment shader in GLSL
- const char * fragmentSource = R"(
- #version 330
- precision highp float;
- in vec3 color; // variable input: interpolated color of vertex shader
- out vec4 fragmentColor; // output that goes to the raster memory as told by glBindFragDataLocation
- void main() {
- fragmentColor = vec4(color, 1); // extend RGB to RGBA
- }
- )";
- // row-major matrix 4x4
- struct mat4 {
- float m[4][4];
- public:
- mat4() {}
- mat4(float m00, float m01, float m02, float m03,
- float m10, float m11, float m12, float m13,
- float m20, float m21, float m22, float m23,
- float m30, float m31, float m32, float m33) {
- m[0][0] = m00; m[0][1] = m01; m[0][2] = m02; m[0][3] = m03;
- m[1][0] = m10; m[1][1] = m11; m[1][2] = m12; m[1][3] = m13;
- m[2][0] = m20; m[2][1] = m21; m[2][2] = m22; m[2][3] = m23;
- m[3][0] = m30; m[3][1] = m31; m[3][2] = m32; m[3][3] = m33;
- }
- mat4 operator*(const mat4& right) {
- mat4 result;
- for (int i = 0; i < 4; i++) {
- for (int j = 0; j < 4; j++) {
- result.m[i][j] = 0;
- for (int k = 0; k < 4; k++) result.m[i][j] += m[i][k] * right.m[k][j];
- }
- }
- return result;
- }
- operator float*() { return &m[0][0]; }
- };
- // 3D point in homogeneous coordinates
- struct vec4 {
- float v[4];
- vec4(float x = 0, float y = 0, float z = 0, float w = 1) {
- v[0] = x; v[1] = y; v[2] = z; v[3] = w;
- }
- vec4 operator*(const mat4& mat) {
- vec4 result;
- for (int j = 0; j < 4; j++) {
- result.v[j] = 0;
- for (int i = 0; i < 4; i++) result.v[j] += v[i] * mat.m[i][j];
- }
- return result;
- }
- vec4 operator*(const vec4& vec) {
- vec4 result;
- result = vec4(vec.v[0] + v[0], vec.v[1] + v[1], vec.v[2] + v[2], vec.v[3] + v[3]);
- return result;
- }
- };
- // 2D camera
- struct Camera {
- float wCx, wCy; // center in world coordinates
- float wWx, wWy; // width and height in world coordinates
- public:
- Camera() {
- Animate(0);
- }
- mat4 V() { // view matrix: translates the center to the origin
- return mat4(1, 0, 0, 0,
- 0, 1, 0, 0,
- 0, 0, 1, 0,
- -wCx, -wCy, 0, 1);
- }
- mat4 P() { // projection matrix: scales it to be a square of edge length 2
- return mat4(2 / wWx, 0, 0, 0,
- 0, 2 / wWy, 0, 0,
- 0, 0, 1, 0,
- 0, 0, 0, 1);
- }
- mat4 Vinv() { // inverse view matrix
- return mat4(1, 0, 0, 0,
- 0, 1, 0, 0,
- 0, 0, 1, 0,
- wCx, wCy, 0, 1);
- }
- mat4 Pinv() { // inverse projection matrix
- return mat4(wWx / 2, 0, 0, 0,
- 0, wWy / 2, 0, 0,
- 0, 0, 1, 0,
- 0, 0, 0, 1);
- }
- void Animate(float t) {
- wCx = 0; // 10 * cosf(t);
- wCy = 0;
- wWx = 20;
- wWy = 20;
- }
- };
- // 2D camera
- Camera camera;
- // handle of the shader program
- unsigned int shaderProgram;
- unsigned int z;
- class Terepasztal {
- float vertexData[4800];
- float vertexColors[14400];
- unsigned int vao;
- float k = -10.0f;
- float f = -10.0f;
- float up = 1.0f;
- int change = 0;
- mat4 cordm[3];
- public:
- float x(float u, float v) {
- float temp = 0.0f;
- for (int i = 0; i < 4; i++) {
- for (int j = 0; j < 4; j++) {
- temp += cordm[0].m[i][j] * B(i, u) * B(j, v);
- }
- }
- return temp;
- }
- float y(float u, float v) {
- float temp = 0.0f;
- for (int i = 0; i < 4; i++) {
- for (int j = 0; j < 4; j++) {
- temp += cordm[1].m[i][j] * B(i, u) * B(j, v);
- }
- }
- return temp;
- }
- float z(float u, float v) {
- float temp = 0.0f;
- for (int i = 0; i < 4; i++) {
- for (int j = 0; j < 4; j++) {
- temp += cordm[2].m[i][j] * B(i, u) * B(j, v);
- }
- }
- return temp;
- }
- float B(int i, float uv) {
- switch (i) {
- case 0: return((1 - uv)*(1 - uv)*(1 - uv));
- break;
- case 1: return((3 * uv)*((1 - uv)*(1 - uv)));
- break;
- case 2: return((3 * (uv*uv))*(1 - uv));
- break;
- case 3: return(uv * uv * uv);
- break;
- }
- }
- void Create() {
- cordm[0] = mat4(0.0f, 0.0f, 0.0f, 0.0f, 0.33f, 0.33f, 0.33f, 0.33f, 0.66f, 0.66f, 0.66f, 0.66f, 1.0f, 1.0f, 1.0f, 1.0f);
- cordm[1] = mat4(0.0f, 0.33f, 0.66f, 1.0f, 0.0f, 0.33f, 0.66f, 1.0f, 0.0f, 0.33f, 0.66f, 1.0f, 0.0f, 0.33f, 0.66f, 1.0f);
- cordm[2] = mat4(1.8f, 0.6f, 1.4f, 1.6f,
- 0.8f, 10.0f, 9.6f, 0.8f,
- 0.4f, 8.8f, 9.2f, 1.1f,
- 0.2f, 0.6f, 0.8f, 1.0f);
- for (int i = 0; i < 400; i++) {
- vertexData[12*i] = k;
- vertexData[12*i+1] = f;
- vertexData[12*i+2] = k;
- vertexData[12*i + 3] = f + 1.0f;
- vertexData[12*i + 4] = k+ 1.0f;
- vertexData[12*i + 5] = f;
- vertexData[12*i+6] = k;
- vertexData[12*i + 7] = f + 1.0f;
- vertexData[12*i + 8] = k + 1.0f;
- vertexData[12*i + 9] = f ;
- vertexData[12*i + 10] = k + 1.0f;
- vertexData[12*i + 11] = f + 1.0f;
- k = k + 1.0f;
- change++;
- if (change == 20) {
- k = -10.0f;
- change = 0;
- f = f + up;
- }
- }
- change = 0;
- k = 0.0f;
- f = 0.0f;
- for (int i = 0; i < 800; i++) {
- if (1 < (sqrt(z(k, f)*z(k, f)) / 10))
- vertexColors[18 * i] = 1;
- else
- vertexColors[18 * i] = sqrt(z(k, f)*z(k, f)) /10;
- vertexColors[18 * i + 1] = 0.21f;
- vertexColors[18 * i+2] = 0.32f;
- if (1 < sqrt(z(k, f + 0.05263157894736842105263157894737f)*z(k, f + 0.05263157894736842105263157894737f))/10)
- vertexColors[18 * i + 3] = 1;
- else
- vertexColors[18 * i + 3] = sqrt(z(k, f + 0.05263157894736842105263157894737f)*z(k, f + 0.05263157894736842105263157894737f))/10;
- vertexColors[18 * i + 4] = 0.21f;
- vertexColors[18 * i + 5] = 0.32f;
- if(1 < sqrt(z(k + 0.05263157894736842105263157894737f, f)*(z(k + 0.05263157894736842105263157894737f, f)))/10)
- vertexColors[18 * i+6] = 1;
- else
- vertexColors[18 * i + 6] = sqrt(z(k + 0.05263157894736842105263157894737f, f)*(z(k + 0.05263157894736842105263157894737f, f)))/10;
- vertexColors[18 * i + 7] = 0.21f;
- vertexColors[18 * i + 8] = 0.32f;
- if(1 < sqrt(z(k, f + 0.05263157894736842105263157894737f)* z(k, f + 0.05263157894736842105263157894737f))/10)
- vertexColors[18 * i + 9] = 1;
- else
- vertexColors[18 * i + 9] = sqrt(z(k, f + 0.05263157894736842105263157894737f)* z(k, f + 0.05263157894736842105263157894737f))/10;
- vertexColors[18 * i + 10] = 0.21f;
- vertexColors[18 * i + 11] = 0.32f;
- if(1 < sqrt(z(k + 0.05263157894736842105263157894737f, f)*z(k + 0.05263157894736842105263157894737f, f))/10)
- vertexColors[18 * i + 12] = 1 ;
- else
- vertexColors[18 * i + 12] = sqrt(z(k + 0.05263157894736842105263157894737f, f)*z(k + 0.05263157894736842105263157894737f, f))/10;
- vertexColors[18 * i + 13] = 0.21f;
- vertexColors[18 * i + 14] = 0.32f;
- if(1 < sqrt(z(k + 0.05263157894736842105263157894737f, f + 0.05263157894736842105263157894737f)*z(k + 0.05263157894736842105263157894737f, f + 0.05263157894736842105263157894737f))/10)
- vertexColors[18 * i+ 15] = 1;
- else
- vertexColors[18 * i + 15] = sqrt(z(k + 0.05263157894736842105263157894737f, f + 0.05263157894736842105263157894737f)*z(k + 0.05263157894736842105263157894737f, f + 0.05263157894736842105263157894737f))/10;
- vertexColors[18 * i + 16] = 0.21f;
- vertexColors[18 * i + 17] = 0.32f;
- k = k + 0.05263157894736842105263157894737f;
- change++;
- if (change == 20) {
- k = 0.0f;
- change = 0;
- f = f + 0.05263157894736842105263157894737f;
- }
- }
- glGenVertexArrays(1, &vao); // create 1 vertex array object
- glBindVertexArray(vao); // make it active
- unsigned int vbo[2]; // vertex buffer objects
- glGenBuffers(2, &vbo[0]); // Generate 2 vertex buffer objects
- // vertex coordinates: vbo[0] -> Attrib Array 0 -> vertexPosition of the vertex shader
- glBindBuffer(GL_ARRAY_BUFFER, vbo[0]); // make it active, it is an array
- glBufferData(GL_ARRAY_BUFFER, // copy to the GPU
- sizeof(vertexData), // number of the vbo in bytes
- vertexData, // address of the data array on the CPU
- GL_STATIC_DRAW); // copy to that part of the memory which is not modified
- // Map Attribute Array 0 to the current bound vertex buffer (vbo[0])
- glEnableVertexAttribArray(0);
- // Data organization of Attribute Array 0
- glVertexAttribPointer(0, // Attribute Array 0
- 2, GL_FLOAT, // components/attribute, component type
- GL_FALSE, // not in fixed point format, do not normalized
- 0, NULL); // stride and offset: it is tightly packed
- // vertex colors: vbo[1] -> Attrib Array 1 -> vertexColor of the vertex shader
- glBindBuffer(GL_ARRAY_BUFFER, vbo[1]); // make it active, it is an array
- glBufferData(GL_ARRAY_BUFFER, sizeof(vertexColors), vertexColors, GL_STATIC_DRAW); // copy to the GPU
- // Map Attribute Array 1 to the current bound vertex buffer (vbo[1])
- glEnableVertexAttribArray(1); // Vertex position
- // Data organization of Attribute Array 1
- glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, NULL); // Attribute Array 1, components/attribute, component type, normalize?, tightly packed
- }
- void Draw() {
- mat4 Mscale(1, 0, 0, 0,
- 0, 1, 0, 0,
- 0, 0, 0, 0,
- 0, 0, 0, 1); // model matrix
- mat4 Mtranslate(1, 0, 0, 0,
- 0, 1, 0, 0,
- 0, 0, 0, 0,
- 0, 0, 0, 1); // model matrix
- mat4 MVPTransform = Mscale * Mtranslate * camera.V() * camera.P();
- // set GPU uniform matrix variable MVP with the content of CPU variable MVPTransform
- int location = glGetUniformLocation(shaderProgram, "MVP");
- if (location >= 0) glUniformMatrix4fv(location, 1, GL_TRUE, MVPTransform); // set uniform variable MVP to the MVPTransform
- else printf("uniform MVP cannot be set\n");
- glBindVertexArray(vao); // make the vao and its vbos active playing the role of the data source
- glDrawArrays(GL_TRIANGLES, 0, 4800); // draw a single triangle with vertices defined in vao
- }
- };
- vec4 forgatas(vec4 irany, float szog) {
- szog *= 57.3f;
- printf("%f ", (cos(szog)*irany.v[0]) - (sin(szog)*irany.v[1]));
- return vec4(
- ((cos(szog)*irany.v[0]) - (sin(szog)*irany.v[1])),
- ((sin(szog)*irany.v[0]) + (cos(szog)*irany.v[1]))
- );
- }
- class Triangle {
- GLuint vao;
- GLuint vbo[2]; // vertex array object id
- float sx, sy; // scaling
- float wTx, wTy; // translation
- float vertexColors[18] = { 0, 1, 0, 0, 1, 0, 0, 1, 0 , 0, 1, 0, 0, 1, 0, 0, 1, 0 };
- float vertexCoords[12] = { -2.0f, -2.0f, 0.0f, 0.0f, 0.0f, -1.0f , 0.0f , -1.0f , 0.0f,0.0f, 2.0f , -2.0f };
- float forgx, forgx1, forgy, forgy1;
- long elteltido= 0;
- float vertexData[10000];
- float vertexDatas[1000];
- float ellapsedtime[1000];
- std::vector<vec4> cps; // control points
- std::vector<float> ts; // parameter (knot) values
- public:
- Triangle() {
- //Animate(0.0f , 0.0f , 0.0f , 0.0f , 0.0f);
- }
- void AddPoint(float cX, float cY) {
- AddControlPoint(vec4(cX, cY, 0, 1));
- }
- float Ld(int i, float t) {
- float Li = 0.0f;
- for (int j = 0; j < cps.size(); j++)
- if (j != i) Li += (1 / t - ts[j]);
- float Lf = 1.0f;
- for (int j = 0; j < cps.size(); j++)
- if (j != i) Lf *= ((t - ts[j]) - ts[i] / (ts[i] - ts[j]));
- return Li*Lf;
- }
- vec4 rd(float t) {
- vec4 rr(0, 0, 0, 1);
- for (int i = 0; i < cps.size(); i++) {
- vec4 temp(cps[i].v[0] * Ld(i, t), cps[i].v[1] * Ld(i, t), 0, cps[i].v[3] * Ld(i, t));
- vec4 mamma = rr;
- rr = vec4(mamma.v[0] + temp.v[0], mamma.v[1] + temp.v[1], 0, mamma.v[3] + temp.v[3]);
- }
- return rr;
- }
- float L(int i, float t) {
- float Li = 1.0f;
- for (int j = 0; j < cps.size(); j++)
- if (j != i) Li *= (t - ts[j]) / (ts[i] - ts[j]);
- return Li;
- }
- void AddControlPoint(vec4 cp) {
- float ti = cps.size(); // or something better
- cps.push_back(cp); ts.push_back(ti);
- }
- vec4 r(float t) {
- vec4 rr(0, 0, 0, 1);
- for (int i = 0; i < cps.size(); i++) {
- vec4 temp(cps[i].v[0] * L(i, t), cps[i].v[1] * L(i, t), 0, 1);
- vec4 mamma = rr;
- rr = vec4(mamma.v[0] + temp.v[0], mamma.v[1] + temp.v[1], 0, 1);
- }
- return rr;
- }
- int gettime(int i) {
- return ellapsedtime[i + 1] - ellapsedtime[i];
- }
- long elteltIdo() { return elteltido; }
- void Create() {
- glGenVertexArrays(1, &vao); // create 1 vertex array object
- glBindVertexArray(vao); // make it active
- unsigned int vbo[2]; // vertex buffer objects
- glGenBuffers(2, &vbo[0]); // Generate 2 vertex buffer objects
- // vertex coordinates: vbo[0] -> Attrib Array 0 -> vertexPosition of the vertex shader
- glBindBuffer(GL_ARRAY_BUFFER, vbo[0]); // make it active, it is an array
- glBindBuffer(GL_ARRAY_BUFFER, vbo[0]); // make it active, it is an array
- glBufferData(GL_ARRAY_BUFFER, // copy to the GPU
- sizeof(vertexCoords), // number of the vbo in bytes
- vertexCoords, // address of the data array on the CPU
- GL_STATIC_DRAW); // copy to that part of the memory which is not modified
- //printf("%f %f %f %f %f", vertexCoords[0], vertexCoords[1], vertexCoords[2], vertexCoords[3], vertexCoords[4]);
- glEnableVertexAttribArray(0);
- // Data organization of Attribute Array 0
- glVertexAttribPointer(0, // Attribute Array 0
- 2, GL_FLOAT, // components/attribute, component type
- GL_FALSE, // not in fixed point format, do not normalized
- 0, NULL); // stride and offset: it is tightly packed
- // vertex colors: vbo[1] -> Attrib Array 1 -> vertexColor of the vertex shader
- glBindBuffer(GL_ARRAY_BUFFER, vbo[1]); // make it active, it is an array
- // vertex data on the CPU
- glBufferData(GL_ARRAY_BUFFER, sizeof(vertexColors), vertexColors, GL_DYNAMIC_DRAW); // copy to the GPU
- // Map Attribute Array 1 to the current bound vertex buffer (vbo[1])
- glEnableVertexAttribArray(1); // Vertex position
- // Data organization of Attribute Array 1
- glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, NULL); // Attribute Array 1, components/attribute, component type, normalize?, tightly packed
- elteltido = glutGet(GLUT_ELAPSED_TIME);
- }
- void Animate(float t ) {
- if (elteltido != 0) {
- vec4 temp = r(t)* camera.Pinv() * camera.Vinv();
- sx = 1; // sinf(t);
- sy = 1; //cosf(t)
- wTx = temp.v[0]; // 4 * cosf(t / 2);
- wTy = temp.v[1]; // 4 * sinf(t / 2); // itt kell
- vec4 temp1 = rd(t);
- for (int i = 0; i < 6; i++) {
- vertexCoords[2 * i] = forgatas(vec4(vertexCoords[2 * i], vertexCoords[2 * i + 1], 0, 1), atan(temp1.v[1] / temp1.v[0])).v[0];
- vertexCoords[2 * i + 1] = forgatas(vec4(vertexCoords[2 * i], vertexCoords[2 * i + 1], 0, 1), atan(temp1.v[1] / temp1.v[0])).v[1];
- }
- }
- }
- void Draw() {
- // copy to that part of the memory which is not modified
- if (cps.size() > 0) {
- glBindBuffer(GL_ARRAY_BUFFER, vbo[0]); // make it active, it is an array
- glBindBuffer(GL_ARRAY_BUFFER, vbo[0]); // make it active, it is an array
- glBufferData(GL_ARRAY_BUFFER, // copy to the GPU
- sizeof(vertexCoords), // number of the vbo in bytes
- vertexCoords, // address of the data array on the CPU
- GL_STATIC_DRAW); // copy to that part of the memory which is not modified
- //printf("%f %f %f %f %f", vertexCoords[0], vertexCoords[1], vertexCoords[2], vertexCoords[3], vertexCoords[4]);
- mat4 Mscale(sx, 0, 0, 0,
- 0, sy, 0, 0,
- 0, 0, 0, 0,
- 0, 0, 0, 1); // model matrix
- mat4 Mtranslate(1, 0, 0, 0,
- 0, 1, 0, 0,
- 0, 0, 0, 0,
- wTx, wTy, 0, 1); // model matrix
- mat4 MVPTransform = Mscale * Mtranslate *camera.V() * camera.P();
- // set GPU uniform matrix variable MVP with the content of CPU variable MVPTransform
- int location = glGetUniformLocation(shaderProgram, "MVP");
- if (location >= 0) glUniformMatrix4fv(location, 1, GL_TRUE, MVPTransform); // set uniform variable MVP to the MVPTransform
- else printf("uniform MVP cannot be set\n");
- glBindVertexArray(vao); // make the vao and its vbos active playing the role of the data source
- glDrawArrays(GL_TRIANGLES, 0, 6); // draw a single triangle with vertices defined in vao
- }
- }
- };
- class LagrangeCurve {
- GLuint vao, vbo; // vertex array object, vertex buffer object
- int nVertices;
- int nVerticesl; // number of vertices
- std::vector<vec4> cps; // control points
- std::vector<float> ts; // parameter (knot) values
- float hossz = 0;
- public:
- float vertexData[10000];
- float vertexDatas[1000];
- float ellapsedtime[1000];
- LagrangeCurve() {
- nVertices = 0;
- }
- void Create() {
- glGenVertexArrays(1, &vao);
- glBindVertexArray(vao);
- glGenBuffers(1, &vbo); // Generate 1 vertex buffer object
- glBindBuffer(GL_ARRAY_BUFFER, vbo);
- // Enable the vertex attribute arrays
- glEnableVertexAttribArray(0); // attribute array 0
- glEnableVertexAttribArray(1); // attribute array 1
- // Map attribute array 0 to the vertex data of the interleaved vbo
- glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), reinterpret_cast<void*>(0)); // attribute array, components/attribute, component type, normalize?, stride, offset
- // Map attribute array 1 to the color data of the interleaved vbo
- glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), reinterpret_cast<void*>(2 * sizeof(float)));
- }
- float Ld(int i, float t) {
- float Li = 0.0f;
- for (int j = 0; j < cps.size(); j++)
- if (j != i) Li += (1 / t - ts[j]);
- float Lf = 1.0f;
- for (int j = 0; j < cps.size(); j++)
- if (j != i) Lf *= ((t - ts[j]) - ts[i] / (ts[i] - ts[j]));
- return Li*Lf;
- }
- vec4 rd(float t) {
- vec4 rr(0, 0, 0, 1);
- for (int i = 0; i < cps.size(); i++) {
- vec4 temp(cps[i].v[0] * Ld(i, t), cps[i].v[1] * Ld(i, t), 0, cps[i].v[3]*Ld(i,t));
- vec4 mamma = rr;
- rr = vec4(mamma.v[0] + temp.v[0], mamma.v[1] + temp.v[1], 0, mamma.v[3]+temp.v[3]);
- }
- return rr;
- }
- float L(int i, float t) {
- float Li = 1.0f;
- for (int j = 0; j < cps.size(); j++)
- if (j != i) Li *= (t - ts[j]) / (ts[i] - ts[j]);
- return Li;
- }
- void AddControlPoint(vec4 cp) {
- float ti = cps.size(); // or something better
- cps.push_back(cp); ts.push_back(ti);
- }
- vec4 r(float t) {
- vec4 rr(0, 0, 0, 1);
- for (int i = 0; i < cps.size(); i++) {
- vec4 temp(cps[i].v[0] * L(i, t), cps[i].v[1] * L(i, t), 0, 1);
- vec4 mamma = rr;
- rr = vec4(mamma.v[0] + temp.v[0], mamma.v[1] + temp.v[1], 0, 1);
- }
- return rr;
- }
- int gettime(int i) {
- return ellapsedtime[i + 1] - ellapsedtime[i];
- }
- void AddPoint(float cX, float cY) {
- glBindBuffer(GL_ARRAY_BUFFER, vbo);
- if (nVertices >= 20) return;
- AddControlPoint(vec4(cX, cY, glutGet(GLUT_ELAPSED_TIME) / 100.0f, 1));
- ellapsedtime[nVertices] = glutGet(GLUT_ELAPSED_TIME) / 1000.0f;
- if(nVertices > 1)ellapsedtime[nVertices - 1] = ellapsedtime[nVertices] - ellapsedtime[nVertices - 1];
- nVerticesl = 0;
- for (float t = 0; t < (cps.size() - 0.99); t += 0.01f) {
- vec4 temp = r(t) * camera.Pinv() * camera.Vinv();
- vec4 temp1 = rd(t);
- vertexDatas[2 * nVerticesl] = temp1.v[0]/temp1.v[3];
- vertexDatas[2 * nVerticesl+1] = temp1.v[1]/temp1.v[3];
- // fill interleaved data
- vertexData[5 * nVerticesl] = temp.v[0];
- vertexData[5 * nVerticesl + 1] = temp.v[1];
- vertexData[5 * nVerticesl + 2] = 1; // red
- vertexData[5 * nVerticesl + 3] = 1; // green
- vertexData[5 * nVerticesl + 4] = 1; // blue
- //printf("%f \n ", ellapsedtime[nVerticesl]);
- nVerticesl++;
- }
- nVertices++;
- if (nVertices > 1) { //hossz szamitas
- for (int i = 0; i < nVerticesl * 5 - 5; i = i + 5) {
- float temp = (sqrt(((vertexData[i] - vertexData[i + 5]) * (vertexData[i] - vertexData[i + 5])) + ((vertexData[i + 1] - vertexData[i + 6])*(vertexData[i + 1] - vertexData[i + 6]))));
- hossz = hossz + temp;
- }
- //printf("%f \n", hossz);
- }
- //copy data to GPU
- glBufferData(GL_ARRAY_BUFFER, nVerticesl * 5 * sizeof(float), vertexData, GL_DYNAMIC_DRAW);
- }
- void Draw() {
- if (nVertices > 0) {
- mat4 VPTransform = camera.V() * camera.P();
- int location = glGetUniformLocation(shaderProgram, "MVP");
- if (location >= 0) glUniformMatrix4fv(location, 1, GL_TRUE, VPTransform);
- else printf("uniform MVP cannot be set\n");
- glBindVertexArray(vao);
- glDrawArrays(GL_LINE_STRIP, 0, nVerticesl);
- }
- }
- };
- // The virtual world: collection of two objects
- LagrangeCurve lagrangeCurve;
- Terepasztal terepasztal;
- Triangle triangle;
- // Initialization, create an OpenGL context
- void onInitialization() {
- glViewport(0, 0, windowWidth, windowHeight);
- // Create objects by setting up their vertex data on the GPU
- lagrangeCurve.Create();
- terepasztal.Create();
- // Create vertex shader from string
- unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER);
- if (!vertexShader) {
- printf("Error in vertex shader creation\n");
- exit(1);
- }
- glShaderSource(vertexShader, 1, &vertexSource, NULL);
- glCompileShader(vertexShader);
- checkShader(vertexShader, "Vertex shader error");
- // Create fragment shader from string
- unsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
- if (!fragmentShader) {
- printf("Error in fragment shader creation\n");
- exit(1);
- }
- glShaderSource(fragmentShader, 1, &fragmentSource, NULL);
- glCompileShader(fragmentShader);
- checkShader(fragmentShader, "Fragment shader error");
- // Attach shaders to a single program
- shaderProgram = glCreateProgram();
- if (!shaderProgram) {
- printf("Error in shader program creation\n");
- exit(1);
- }
- glAttachShader(shaderProgram, vertexShader);
- glAttachShader(shaderProgram, fragmentShader);
- // Connect the fragmentColor to the frame buffer memory
- glBindFragDataLocation(shaderProgram, 0, "fragmentColor"); // fragmentColor goes to the frame buffer memory
- // program packaging
- glLinkProgram(shaderProgram);
- checkLinking(shaderProgram);
- // make this program run
- glUseProgram(shaderProgram);
- }
- void onExit() {
- glDeleteProgram(shaderProgram);
- printf("exit");
- }
- // Window has become invalid: Redraw
- void onDisplay() {
- glClearColor(0, 0, 0, 0); // background color
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clear the screen
- terepasztal.Draw();
- lagrangeCurve.Draw();
- if(triangle.elteltIdo() != 0 ) triangle.Draw();
- glutSwapBuffers(); // exchange the two buffers
- }
- // Key of ASCII code pressed
- void onKeyboard(unsigned char key, int pX, int pY) {
- if ( key == ' ')
- triangle.Create();
- if (key == 'd')
- glutPostRedisplay(); // if d, invalidate display, i.e. redraw
- }
- // Key of ASCII code released
- void onKeyboardUp(unsigned char key, int pX, int pY) {
- }
- // Mouse click event
- void onMouse(int button, int state, int pX, int pY) {
- if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) { // GLUT_LEFT_BUTTON / GLUT_RIGHT_BUTTON and GLUT_DOWN / GLUT_UP
- float cX = 2.0f * pX / windowWidth - 1; // flip y axis
- float cY = 1.0f - 2.0f * pY / windowHeight;
- lagrangeCurve.AddPoint(cX, cY);
- triangle.AddPoint(cX, cY);
- glutPostRedisplay(); // redraw
- }
- }
- // Move mouse with key pressed
- void onMouseMotion(int pX, int pY) {
- }
- // Idle event indicating that some time elapsed: do animation here
- void onIdle() {
- long time = glutGet(GLUT_ELAPSED_TIME); // elapsed time since the start of the program
- float sec = time/1000.0f; // convert msec to sec
- camera.Animate(sec);
- float i = sec - triangle.elteltIdo()/1000.0f;
- //int a = i;
- //int b = lagrangeCurve.ellapsedtime[z];
- //if ( b == a) {
- triangle.Animate(i);
- // z++;
- //}
- //printf("%i \n", i); // animate the triangle object
- glutPostRedisplay();
- //if(time == lagrangeCurve.gettime(z))
- // z++;
- // redraw the scene
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- // Do not touch the code below this line
- int main(int argc, char * argv[]) {
- glutInit(&argc, argv);
- #if !defined(__APPLE__)
- glutInitContextVersion(majorVersion, minorVersion);
- #endif
- glutInitWindowSize(windowWidth, windowHeight); // Application window is initially of resolution 600x600
- glutInitWindowPosition(100, 100); // Relative location of the application window
- #if defined(__APPLE__)
- glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH | GLUT_3_3_CORE_PROFILE); // 8 bit R,G,B,A + double buffer + depth buffer
- #else
- glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
- #endif
- glutCreateWindow(argv[0]);
- #if !defined(__APPLE__)
- glewExperimental = true; // magic
- glewInit();
- #endif
- printf("GL Vendor : %s\n", glGetString(GL_VENDOR));
- printf("GL Renderer : %s\n", glGetString(GL_RENDERER));
- printf("GL Version (string) : %s\n", glGetString(GL_VERSION));
- glGetIntegerv(GL_MAJOR_VERSION, &majorVersion);
- glGetIntegerv(GL_MINOR_VERSION, &minorVersion);
- printf("GL Version (integer) : %d.%d\n", majorVersion, minorVersion);
- printf("GLSL Version : %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION));
- onInitialization();
- glutDisplayFunc(onDisplay); // Register event handlers
- glutMouseFunc(onMouse);
- glutIdleFunc(onIdle);
- glutKeyboardFunc(onKeyboard);
- glutKeyboardUpFunc(onKeyboardUp);
- glutMotionFunc(onMouseMotion);
- glutMainLoop();
- onExit();
- return 1;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement