OpenGL.Project.3 Bezier in 3d Space

這次project的內容是將上次的貝茲爾曲線擴展到三維空間,並求了它的主法線,次法線,切線。以動點的形式顯示。

// Include standard headers
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <array>
#include <sstream>
#include <iostream>
#include <math.h>
// Include GLEW
#include <GL/glew.h>
// Include GLFW
#include <glfw3.h>
#include<Windows.h>
// Include GLM
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/quaternion.hpp>
#include <glm/gtx/quaternion.hpp>
using namespace glm;
// Include AntTweakBar
#include <AntTweakBar.h>

#include <common/shader.hpp>
#include <common/controls.hpp>
#include <common/objloader.hpp>
#include <common/vboindexer.hpp>
using namespace std;

typedef struct Vertex {
	float XYZW[4];
	float RGBA[4];
	void SetCoords(float *coords) {
		XYZW[0] = coords[0];
		XYZW[1] = coords[1];
		XYZW[2] = coords[2];
		XYZW[3] = coords[3];
	}
	void SetColor(float *color) {
		RGBA[0] = color[0];
		RGBA[1] = color[1];
		RGBA[2] = color[2];
		RGBA[3] = color[3];
	}
};

// ATTN: USE POINT STRUCTS FOR EASIER COMPUTATIONS
typedef struct point {
	float x, y, z;
	point(const float x = 0, const float y = 0, const float z = 0) : x(x), y(y), z(z){};
	point(float *coords) : x(coords[0]), y(coords[1]), z(coords[2]){};
	point operator -(const point& a)const {
		return point(x - a.x, y - a.y, z - a.z);
	}
	point operator +(const point& a)const {
		return point(x + a.x, y + a.y, z + a.z);
	}
	point operator *(const float& a)const {
		return point(x*a, y*a, z*a);
	}
	point operator /(const float& a)const {
		return point(x / a, y / a, z / a);
	}
	float* toArray() {
		float array[] = { x, y, z, 1.0f };
		return array;
	}
};

// function prototypes
int initWindow(void);
void initOpenGL(void);
void createVAOs(Vertex[], unsigned short[], size_t, size_t, int);
void createObjects(void);
void pickVertex(void);
void moveVertex(void);
void drawScene(void);
void cleanup(void);
static void mouseCallback(GLFWwindow*, int, int, int);

// GLOBAL VARIABLES
GLFWwindow* window;
const GLuint window_width = 1024, window_height = 768;

glm::mat4 gProjectionMatrix;
glm::mat4 gViewMatrix;

GLuint gPickedIndex;
std::string gMessage;

GLuint programID;
GLuint pickingProgramID;

// ATTN: INCREASE THIS NUMBER AS YOU CREATE NEW OBJECTS
const GLuint NumObjects = 18;	// number of different "objects" to be drawn
GLuint VertexArrayId[NumObjects] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 };
GLuint VertexBufferId[NumObjects] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 };
GLuint IndexBufferId[NumObjects] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 };
size_t NumVert[NumObjects] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 };



GLuint MatrixID;
GLuint ViewMatrixID;
GLuint ModelMatrixID;
GLuint PickingMatrixID;
GLuint pickingColorArrayID;
GLuint pickingColorID;
GLuint LightID;

// Define objects
Vertex Vertices[] =
{
	{ { 1.0f, 0.0f, 0.0f, 1.0f }, { 0.0f, 1.0f, 0.0f, 1.0f } },
	{ { 0.7f, 0.7f, 0.0f, 1.0f }, { 0.0f, 1.0f, 0.0f, 1.0f } },
	{ { 0.0f, 1.0f, 0.0f, 1.0f }, { 0.0f, 1.0f, 0.0f, 1.0f } },
	{ { -0.7f, 0.7f, 0.0f, 1.0f }, { 0.0f, 1.0f, 0.0f, 1.0f } },
	{ { -1.0f, 0.0f, 0.0f, 1.0f }, { 0.0f, 1.0f, 0.0f, 1.0f } }, 	
	{ { -0.7f, -0.7f, 0.0f, 1.0f }, { 0.0f, 1.0f, 0.0f, 1.0f } },
	{ { 0.0f, -1.0f, 0.0f, 1.0f }, { 0.0f, 1.0f, 0.0f, 1.0f } },
	{ { 0.7f, -0.7f, 0.0f, 1.0f }, { 0.0f, 1.0f, 0.0f, 1.0f } }, 
};
Vertex Verticest[] =
{
	{ { 0.0f, 0.0f, 0.0f, 1.0f }, { 0.0f, 1.0f, 0.0f, 1.0f } },
	{ { 0.0f, 0.7f, 0.0f, 1.0f }, { 0.0f, 1.0f, 0.0f, 1.0f } },
	{ { 0.0f, 1.0f, 0.0f, 1.0f }, { 0.0f, 1.0f, 0.0f, 1.0f } },
	{ { 0.0f, 0.7f, 0.0f, 1.0f }, { 0.0f, 1.0f, 0.0f, 1.0f } },
	{ { 0.0f, 0.0f, 0.0f, 1.0f }, { 0.0f, 1.0f, 0.0f, 1.0f } },
	{ { 0.0f, -0.7f, 0.0f, 1.0f }, { 0.0f, 1.0f, 0.0f, 1.0f } },
	{ { 0.0f, -1.0f, 0.0f, 1.0f }, { 0.0f, 1.0f, 0.0f, 1.0f } },
	{ { 0.0f, -0.7f, 0.0f, 1.0f }, { 0.0f, 1.0f, 0.0f, 1.0f } },
};
Vertex Vertices2[] = {
	{ { 1.0f, 0.0f, 0.0f, 1.0f }, { 1.0f, 1.0f, 1.0f, 1.0f } },
	{ { 0.7f, 0.7f, 0.0f, 1.0f }, { 1.0f, 1.0f, 1.0f, 1.0f } },
	{ { 0.0f, 1.0f, 0.0f, 1.0f }, { 1.0f, 1.0f, 1.0f, 1.0f } },
	{ { -0.7f, 0.7f, 0.0f, 1.0f }, { 1.0f, 1.0f, 1.0f, 1.0f } },
	{ { -1.0f, 0.0f, 0.0f, 1.0f }, { 1.0f, 1.0f, 1.0f, 1.0f } },
	{ { -0.7f, -0.7f, 0.0f, 1.0f }, { 1.0f, 1.0f, 1.0f, 1.0f } },
	{ { 0.0f, -1.0f, 0.0f, 1.0f }, { 1.0f, 1.0f, 1.0f, 1.0f } },
	{ { 0.7f, -0.7f, 0.0f, 1.0f }, { 1.0f, 1.0f, 1.0f, 1.0f } },
};
Vertex Verticest2[] = {
	{ { 0.0f, 0.0f, 0.0f, 1.0f }, { 1.0f, 1.0f, 1.0f, 1.0f } },
	{ { 0.0f, 0.7f, 0.0f, 1.0f }, { 1.0f, 1.0f, 1.0f, 1.0f } },
	{ { 0.0f, 1.0f, 0.0f, 1.0f }, { 1.0f, 1.0f, 1.0f, 1.0f } },
	{ { 0.0f, 0.7f, 0.0f, 1.0f }, { 1.0f, 1.0f, 1.0f, 1.0f } },
	{ { 0.0f, 0.0f, 0.0f, 1.0f }, { 1.0f, 1.0f, 1.0f, 1.0f } },
	{ { 0.0f, -0.7f, 0.0f, 1.0f }, { 1.0f, 1.0f, 1.0f, 1.0f } },
	{ { 0.0f, -1.0f, 0.0f, 1.0f }, { 1.0f, 1.0f, 1.0f, 1.0f } },
	{ { 0.0f, -0.7f, 0.0f, 1.0f }, { 1.0f, 1.0f, 1.0f, 1.0f } },
};
unsigned short Indices[] = {
	0, 1, 2, 3, 4, 5, 6, 7
};

Vertex Vertices7[32];
Vertex Vertices8[320];
Vertex Verticesg[8];
Vertex Vertices2g[8];
Vertex Vertices7g[32];
Vertex Vertices8g[320];
Vertex Verticesm[8];
Vertex Vertices2m[8];
Vertex Vertices7m[32];
Vertex Vertices8m[320];
Vertex Vertices7t[32];
Vertex Vertices8t[320];
Vertex Verticestang[2];
Vertex Verticesnorm[2];
Vertex Verticesbino[2];
Vertex Verticestang2[2];
Vertex Verticesnorm2[2];
Vertex Verticesbino2[2];
Vertex traveldot;
Vertex traveldot2;
Vertex traveldot3;
Vertex traveldot4;
unsigned short Indices2[] = {
	0, 1, 2, 3, 4, 5, 6, 7,8,9,10,11,12,13,14,15
};
unsigned short Indices3[] = {
	0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
};
unsigned short Indices4[] = {
	0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63
};
unsigned short Indices5[] = {
	0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
	64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120,
	121, 122, 123, 124, 125, 126, 127
};
unsigned short Indices6[] = {
	0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31
};
unsigned short Indices7[] = {
	0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65,
	66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123,
	124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174,
	175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225,
	226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276,
	277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319
};
unsigned short Indices8[] = {
	0, 1
};
Vertex sd[256];
Vertex sd2[256];

const size_t IndexCount = sizeof(Indices) / sizeof(unsigned short);
// ATTN: DON'T FORGET TO INCREASE THE ARRAY SIZE IN THE PICKING VERTEX SHADER WHEN YOU ADD MORE PICKING COLORS
float pickingColor[IndexCount] = { 0 / 255.0f, 1 / 255.0f, 2 / 255.0f, 3 / 255.0f, 4 / 255.0f, 5 / 255.0f, 6 / 255.0f, 7 / 255.0f };
int cooot = 0; int cooot2 = 0; int cooot3 = 0; int cooot4 = 0;
// ATTN: ADD YOU PER-OBJECT GLOBAL ARRAY DEFINITIONS HERE
bool KeyLastFrame = GLFW_RELEASE;
bool KeyLastFrame2 = GLFW_RELEASE;
bool KeyLastFrame3 = GLFW_RELEASE;
bool KeyLastFrame4 = GLFW_RELEASE;
bool fm = true;
bool fm2 = true;
bool fm3 = true;
bool fm4 = true;
float note;
int counting = 0;
int ist = 0;
float re[3];
void createObjects(void)
{
	Vertex tmp = { { 1.0f, 0.0f, 0.0f, 1.0f }, { 0.0f, 1.0f, 0.0f, 1.0f } };
	Vertex tmp2 = { { 1.0f, 0.0f, 0.0f, 1.0f }, { 0.0f, 1.0f, 0.0f, 1.0f } };
	for (int i = 0; i < 8; i++){
		sd2[i].XYZW[0] = Vertices[i].XYZW[0];
		sd2[i].XYZW[1] = Vertices[i].XYZW[1];
		sd2[i].XYZW[2] = Verticest[i].XYZW[0];
	}
	float cord1[4]; float cord2[4];
	tmp = { { 1.0f, 0.0f, 0.0f, 1.0f }, { 1.0f, 0.0f, 0.0f, 1.0f } };
	tmp2 = { { 1.0f, 0.0f, 0.0f, 1.0f }, { 1.0f, 0.0f, 0.0f, 1.0f } };
	Vertex tmp3 = { { 1.0f, 0.0f, 0.0f, 1.0f }, { 1.0f, 0.0f, 0.0f, 1.0f } };
	Vertex tmp4 = { { 1.0f, 0.0f, 0.0f, 1.0f }, { 1.0f, 0.0f, 0.0f, 1.0f } };
    float cord3[4]; float cord4[4]; 
	cord1[2] = 0.0f; cord1[3] = 1.0f; cord2[2] = 0.0f; cord2[3] = 1.0f;
	cord3[2] = 0.0f; cord3[3] = 1.0f; cord4[2] = 0.0f; cord4[3] = 1.0f;
	cord1[0] = (sd2[6].XYZW[0] + 11 * sd2[7].XYZW[0] + 11 * sd2[0].XYZW[0] + sd2[1].XYZW[0]) / 24;
	cord1[1] = (sd2[6].XYZW[1] + 11 * sd2[7].XYZW[1] + 11 * sd2[0].XYZW[1] + sd2[1].XYZW[1]) / 24;
	cord1[2] = (sd2[6].XYZW[2] + 11 * sd2[7].XYZW[2] + 11 * sd2[0].XYZW[2] + sd2[1].XYZW[2]) / 24;
	cord2[0] = (8 * sd2[7].XYZW[0] + 14 * sd2[0].XYZW[0] + 2 * sd2[1].XYZW[0]) / 24;
	cord2[1] = (8 * sd2[7].XYZW[1] + 14 * sd2[0].XYZW[1] + 2 * sd2[1].XYZW[1]) / 24;
	cord2[2] = (8 * sd2[7].XYZW[2] + 14 * sd2[0].XYZW[2] + 2 * sd2[1].XYZW[2]) / 24;
	cord3[0] = (4 * sd2[7].XYZW[0] + 16 * sd2[0].XYZW[0] + 4 * sd2[1].XYZW[0]) / 24;
	cord3[1] = (4 * sd2[7].XYZW[1] + 16 * sd2[0].XYZW[1] + 4 * sd2[1].XYZW[1]) / 24;
	cord3[2] = (4 * sd2[7].XYZW[2] + 16 * sd2[0].XYZW[2] + 4 * sd2[1].XYZW[2]) / 24;
	cord4[0] = (2 * sd2[7].XYZW[0] + 14 * sd2[0].XYZW[0] + 8 * sd2[1].XYZW[0]) / 24;
	cord4[1] = (2 * sd2[7].XYZW[1] + 14 * sd2[0].XYZW[1] + 8 * sd2[1].XYZW[1]) / 24;
	cord4[2] = (2 * sd2[7].XYZW[2] + 14 * sd2[0].XYZW[2] + 8 * sd2[1].XYZW[2]) / 24;
	tmp.SetCoords(cord1); tmp2.SetCoords(cord2); tmp3.SetCoords(cord3); tmp4.SetCoords(cord4);
	Vertices7[0] = tmp;
	Vertices7[1] = tmp2;
	Vertices7[2] = tmp3;
	Vertices7[3] = tmp4;
	tmp = { { 1.0f, 0.0f, 0.0f, 1.0f }, { 1.0f, 0.0f, 0.0f, 1.0f } };
	tmp2 = { { 1.0f, 0.0f, 0.0f, 1.0f }, { 1.0f, 0.0f, 0.0f, 1.0f } };
    tmp3 = { { 1.0f, 0.0f, 0.0f, 1.0f }, { 1.0f, 0.0f, 0.0f, 1.0f } };
	tmp4 = { { 1.0f, 0.0f, 0.0f, 1.0f }, { 1.0f, 0.0f, 0.0f, 1.0f } };
	cord1[2] = 0.0f; cord1[3] = 1.0f; cord2[2] = 0.0f; cord2[3] = 1.0f;
	cord3[2] = 0.0f; cord3[3] = 1.0f; cord4[2] = 0.0f; cord4[3] = 1.0f;
	cord1[0] = (sd2[7].XYZW[0] + 11 * sd2[0].XYZW[0] + 11 * sd2[1].XYZW[0] + sd2[2].XYZW[0]) / 24;
	cord1[1] = (sd2[7].XYZW[1] + 11 * sd2[0].XYZW[1] + 11 * sd2[1].XYZW[1] + sd2[2].XYZW[1]) / 24;
	cord1[2] = (sd2[7].XYZW[2] + 11 * sd2[0].XYZW[2] + 11 * sd2[1].XYZW[2] + sd2[2].XYZW[2]) / 24;
	cord2[0] = (8 * sd2[0].XYZW[0] + 14 * sd2[1].XYZW[0] + 2 * sd2[2].XYZW[0]) / 24;
	cord2[1] = (8 * sd2[0].XYZW[1] + 14 * sd2[1].XYZW[1] + 2 * sd2[2].XYZW[1]) / 24;
	cord2[2] = (8 * sd2[0].XYZW[2] + 14 * sd2[1].XYZW[2] + 2 * sd2[2].XYZW[2]) / 24;
	cord3[0] = (4 * sd2[0].XYZW[0] + 16 * sd2[1].XYZW[0] + 4 * sd2[2].XYZW[0]) / 24;
	cord3[1] = (4 * sd2[0].XYZW[1] + 16 * sd2[1].XYZW[1] + 4 * sd2[2].XYZW[1]) / 24;
	cord3[2] = (4 * sd2[0].XYZW[2] + 16 * sd2[1].XYZW[2] + 4 * sd2[2].XYZW[2]) / 24;
	cord4[0] = (2 * sd2[0].XYZW[0] + 14 * sd2[1].XYZW[0] + 8 * sd2[2].XYZW[0]) / 24;
	cord4[1] = (2 * sd2[0].XYZW[1] + 14 * sd2[1].XYZW[1] + 8 * sd2[2].XYZW[1]) / 24;
	cord4[2] = (2 * sd2[0].XYZW[2] + 14 * sd2[1].XYZW[2] + 8 * sd2[2].XYZW[2]) / 24;
	tmp.SetCoords(cord1); tmp2.SetCoords(cord2); tmp3.SetCoords(cord3); tmp4.SetCoords(cord4);
	Vertices7[4] = tmp;
	Vertices7[5] = tmp2;
	Vertices7[6] = tmp3;
	Vertices7[7] = tmp4;
	tmp = { { 1.0f, 0.0f, 0.0f, 1.0f }, { 1.0f, 0.0f, 0.0f, 1.0f } };
	tmp2 = { { 1.0f, 0.0f, 0.0f, 1.0f }, { 1.0f, 0.0f, 0.0f, 1.0f } };
	tmp3 = { { 1.0f, 0.0f, 0.0f, 1.0f }, { 1.0f, 0.0f, 0.0f, 1.0f } };
	tmp4 = { { 1.0f, 0.0f, 0.0f, 1.0f }, { 1.0f, 0.0f, 0.0f, 1.0f } };
	cord1[2] = 0.0f; cord1[3] = 1.0f; cord2[2] = 0.0f; cord2[3] = 1.0f;
	cord3[2] = 0.0f; cord3[3] = 1.0f; cord4[2] = 0.0f; cord4[3] = 1.0f;
	cord1[0] = (sd2[5].XYZW[0] + 11 * sd2[6].XYZW[0] + 11 * sd2[7].XYZW[0] + sd2[0].XYZW[0]) / 24;
	cord1[1] = (sd2[5].XYZW[1] + 11 * sd2[6].XYZW[1] + 11 * sd2[7].XYZW[1] + sd2[0].XYZW[1]) / 24;
	cord1[2] = (sd2[5].XYZW[2] + 11 * sd2[6].XYZW[2] + 11 * sd2[7].XYZW[2] + sd2[0].XYZW[2]) / 24;
	cord2[0] = (8 * sd2[6].XYZW[0] + 14 * sd2[7].XYZW[0] + 2 * sd2[0].XYZW[0]) / 24;
	cord2[1] = (8 * sd2[6].XYZW[1] + 14 * sd2[7].XYZW[1] + 2 * sd2[0].XYZW[1]) / 24;
	cord2[2] = (8 * sd2[6].XYZW[2] + 14 * sd2[7].XYZW[2] + 2 * sd2[0].XYZW[2]) / 24;
	cord3[0] = (4 * sd2[6].XYZW[0] + 16 * sd2[7].XYZW[0] + 4 * sd2[0].XYZW[0]) / 24;
	cord3[1] = (4 * sd2[6].XYZW[1] + 16 * sd2[7].XYZW[1] + 4 * sd2[0].XYZW[1]) / 24;
	cord3[2] = (4 * sd2[6].XYZW[2] + 16 * sd2[7].XYZW[2] + 4 * sd2[0].XYZW[2]) / 24;
	cord4[0] = (2 * sd2[6].XYZW[0] + 14 * sd2[7].XYZW[0] + 8 * sd2[0].XYZW[0]) / 24;
	cord4[1] = (2 * sd2[6].XYZW[1] + 14 * sd2[7].XYZW[1] + 8 * sd2[0].XYZW[1]) / 24;
	cord4[2] = (2 * sd2[6].XYZW[2] + 14 * sd2[7].XYZW[2] + 8 * sd2[0].XYZW[2]) / 24;
	tmp.SetCoords(cord1); tmp2.SetCoords(cord2); tmp3.SetCoords(cord3); tmp4.SetCoords(cord4);
	Vertices7[28] = tmp;
	Vertices7[29] = tmp2;
	Vertices7[30] = tmp3;
	Vertices7[31] = tmp4;
	for (int i = 2; i < 7; i++){
		Vertex tmp = { { 1.0f, 0.0f, 0.0f, 1.0f }, { 1.0f, 0.0f, 0.0f, 1.0f } };
		Vertex tmp2 = { { 1.0f, 0.0f, 0.0f, 1.0f }, { 1.0f, 0.0f, 0.0f, 1.0f } };
		Vertex tmp3 = { { 1.0f, 0.0f, 0.0f, 1.0f }, { 1.0f, 0.0f, 0.0f, 1.0f } };
		Vertex tmp4 = { { 1.0f, 0.0f, 0.0f, 1.0f }, { 1.0f, 0.0f, 0.0f, 1.0f } };
		Vertex tmp5 = { { 1.0f, 0.0f, 0.0f, 1.0f }, { 1.0f, 0.0f, 0.0f, 1.0f } };
		float cord1[4]; float cord2[4]; float cord3[4]; float cord4[4];
		cord1[2] = 0.0f; cord1[3] = 1.0f; cord2[2] = 0.0f; cord2[3] = 1.0f;
		cord3[2] = 0.0f; cord3[3] = 1.0f; cord4[2] = 0.0f; cord4[3] = 1.0f;
		cord1[0] = (sd2[i - 2].XYZW[0] + 11 * sd2[i - 1].XYZW[0] + 11 * sd2[i].XYZW[0] + sd2[i + 1].XYZW[0]) / 24;
		cord1[1] = (sd2[i - 2].XYZW[1] + 11 * sd2[i - 1].XYZW[1] + 11 * sd2[i].XYZW[1] + sd2[i + 1].XYZW[1]) / 24;
		cord1[2] = (sd2[i - 2].XYZW[2] + 11 * sd2[i - 1].XYZW[2] + 11 * sd2[i].XYZW[2] + sd2[i + 1].XYZW[2]) / 24;
		cord2[0] = (8 * sd2[i - 1].XYZW[0] + 14 * sd2[i].XYZW[0] + 2*sd2[i + 1].XYZW[0]) / 24;
		cord2[1] = (8 * sd2[i - 1].XYZW[1] + 14 * sd2[i].XYZW[1] + 2 * sd2[i + 1].XYZW[1]) / 24;
		cord2[2] = (8 * sd2[i - 1].XYZW[2] + 14 * sd2[i].XYZW[2] + 2 * sd2[i + 1].XYZW[2]) / 24;
		cord3[0] = (4 * sd2[i - 1].XYZW[0] + 16 * sd2[i].XYZW[0] + 4 * sd2[i + 1].XYZW[0]) / 24;
		cord3[1] = (4 * sd2[i - 1].XYZW[1] + 16 * sd2[i].XYZW[1] + 4 * sd2[i + 1].XYZW[1]) / 24;
		cord3[2] = (4 * sd2[i - 1].XYZW[2] + 16 * sd2[i].XYZW[2] + 4 * sd2[i + 1].XYZW[2]) / 24;
		cord4[0] = (2 * sd2[i - 1].XYZW[0] + 14 * sd2[i].XYZW[0] + 8 * sd2[i + 1].XYZW[0]) / 24;
		cord4[1] = (2 * sd2[i - 1].XYZW[1] + 14 * sd2[i].XYZW[1] + 8 * sd2[i + 1].XYZW[1]) / 24;
		cord4[2] = (2 * sd2[i - 1].XYZW[2] + 14 * sd2[i].XYZW[2] + 8 * sd2[i + 1].XYZW[2]) / 24;
		tmp.SetCoords(cord1); tmp2.SetCoords(cord2); tmp3.SetCoords(cord3); tmp4.SetCoords(cord4);
		Vertices7[4 * i] = tmp;
		Vertices7[4 * i + 1] = tmp2;
		Vertices7[4 * i + 2] = tmp3;
		Vertices7[4 * i + 3] = tmp4;

	}
	for (int i = 0; i < 32; i++){
		sd2[i].XYZW[0] = Vertices7[i].XYZW[0];
		sd2[i].XYZW[1] = Vertices7[i].XYZW[1];
		sd2[i].XYZW[2] = Vertices7[i].XYZW[2];
		Vertices7t[i].XYZW[0] = Vertices7[i].XYZW[2];
		Vertices7t[i].XYZW[1] = Vertices7[i].XYZW[1];
//		Vertices7[i].XYZW[2] = 0;
	}
	cord1[2] = 0.0f; cord1[3] = 1.0f;
	float t = 0; int x;
	while (t < 1){
		float m4 = pow(t, 4.0); float n4 = pow((1 - t), 4.0);
		float m3 = pow(t, 3.0); float n3 = pow((1 - t), 3.0);
		float m2 = pow(t, 2.0); float n2 = pow((1 - t), 2.0);
		float m1 = pow(t, 1.0); float n1 = pow((1 - t), 1.0);
		Vertex tmp = { { 1.0f, 0.0f, 0.0f, 1.0f }, { 1.0f, 1.0f, 0.0f, 1.0f } };
		cord1[0] = n4*sd2[28].XYZW[0] + 4 * n3*m1 * sd2[29].XYZW[0] + 6 * m2*n2 * sd2[30].XYZW[0] + 4 * m3*n1*sd2[31].XYZW[0] + m4*sd2[0].XYZW[0];
		cord1[1] = n4*sd2[28].XYZW[1] + 4 * n3*m1 * sd2[29].XYZW[1] + 6 * m2*n2 * sd2[30].XYZW[1] + 4 * m3*n1*sd2[31].XYZW[1] + m4*sd2[0].XYZW[1];
		cord1[2] = n4*sd2[28].XYZW[2] + 4 * n3*m1 * sd2[29].XYZW[2] + 6 * m2*n2 * sd2[30].XYZW[2] + 4 * m3*n1*sd2[31].XYZW[2] + m4*sd2[0].XYZW[2];
		tmp.SetCoords(cord1);
		x = 40 * t;
		Vertices8[7 * 40 + x] = tmp;
		t += 0.025;
	}
	for (int i = 2; i < 28; i+=4){
		float t = 0;
		while (t < 1){
			int q = i/4;
			float m4 = pow(t, 4.0); float n4 = pow((1 - t), 4.0);
			float m3 = pow(t, 3.0); float n3 = pow((1 - t), 3.0);
			float m2 = pow(t, 2.0); float n2 = pow((1 - t), 2.0);
			float m1 = pow(t, 1.0); float n1 = pow((1 - t), 1.0);
			Vertex tmp = { { 1.0f, 0.0f, 0.0f, 1.0f }, { 1.0f, 1.0f, 0.0f, 1.0f } };
			cord1[0] = n4*sd2[i - 2].XYZW[0] + 4 * n3*m1 * sd2[i - 1].XYZW[0] + 6 * m2*n2 * sd2[i].XYZW[0] + 4 * m3*n1*sd2[i + 1].XYZW[0] + m4*sd2[i + 2].XYZW[0];
			cord1[1] = n4*sd2[i - 2].XYZW[1] + 4 * n3*m1 * sd2[i - 1].XYZW[1] + 6 * m2*n2 * sd2[i].XYZW[1] + 4 * m3*n1*sd2[i + 1].XYZW[1] + m4*sd2[i + 2].XYZW[1];
			cord1[2] = n4*sd2[i - 2].XYZW[2] + 4 * n3*m1 * sd2[i - 1].XYZW[2] + 6 * m2*n2 * sd2[i].XYZW[2] + 4 * m3*n1*sd2[i + 1].XYZW[2] + m4*sd2[i + 2].XYZW[2];
			tmp.SetCoords(cord1);
			x = 40 * t;
			Vertices8[40*q+x] = tmp;
			t += 0.025;
		}
	}
	for (int i = 0; i <320; i++){
		Vertices8t[i].XYZW[0] = Vertices8[i].XYZW[2];
		Vertices8t[i].XYZW[1] = Vertices8[i].XYZW[1];
		//Vertices8[i].XYZW[2] = 0;
	}
	for (int i = 0; i < 8; i++){
		Verticesg[i].XYZW[0] = Vertices[i].XYZW[0] / 2.0;
		Verticesg[i].XYZW[1] = Vertices[i].XYZW[1] / 2.0 + 1.0;
		Verticesg[i].XYZW[2] = Vertices[i].XYZW[2];
		Verticesg[i].XYZW[3] = Vertices[i].XYZW[3];
		Verticesg[i].RGBA[0] = Vertices[i].RGBA[0];
		Verticesg[i].RGBA[1] = Vertices[i].RGBA[1];
		Verticesg[i].RGBA[2] = Vertices[i].RGBA[2];
		Verticesg[i].RGBA[3] = Vertices[i].RGBA[3];
		Vertices2g[i].XYZW[0] = Vertices2[i].XYZW[0] / 2.0;
		Vertices2g[i].XYZW[1] = Vertices2[i].XYZW[1] / 2.0 + 1.0;
		Vertices2g[i].XYZW[2] = Vertices2[i].XYZW[2];
		Vertices2g[i].XYZW[3] = Vertices2[i].XYZW[3];
		Vertices2g[i].RGBA[0] = Vertices2[i].RGBA[0];
		Vertices2g[i].RGBA[1] = Vertices2[i].RGBA[1];
		Vertices2g[i].RGBA[2] = Vertices2[i].RGBA[2];
		Vertices2g[i].RGBA[3] = Vertices2[i].RGBA[3];
	}
	for (int i = 0; i < 8; i++){
		Verticesm[i].XYZW[0] = Verticest[i].XYZW[0] / 2.0;
		Verticesm[i].XYZW[1] = Verticest[i].XYZW[1] / 2.0 - 1.0;
		Verticesm[i].XYZW[2] = Verticest[i].XYZW[2];
		Verticesm[i].XYZW[3] = Verticest[i].XYZW[3];
		Verticesm[i].RGBA[0] = Verticest[i].RGBA[0];
		Verticesm[i].RGBA[1] = Verticest[i].RGBA[1];
		Verticesm[i].RGBA[2] = Verticest[i].RGBA[2];
		Verticesm[i].RGBA[3] = Verticest[i].RGBA[3];
		Vertices2m[i].XYZW[0] = Verticesm[i].XYZW[0];
		Vertices2m[i].XYZW[1] = Verticesm[i].XYZW[1];
		Vertices2m[i].XYZW[2] = Verticesm[i].XYZW[2];
		Vertices2m[i].XYZW[3] = Verticesm[i].XYZW[3];
		Vertices2m[i].RGBA[0] = Verticest2[i].RGBA[0];
		Vertices2m[i].RGBA[1] = Verticest2[i].RGBA[1];
		Vertices2m[i].RGBA[2] = Verticest2[i].RGBA[2];
		Vertices2m[i].RGBA[3] = Verticest2[i].RGBA[3];
	}
	
	for (int i = 0; i < 32; i++){
		Vertices7m[i].XYZW[0] = Vertices7[i].XYZW[2] / 2.0;
		Vertices7m[i].XYZW[1] = Vertices7[i].XYZW[1] / 2.0 - 1.0;
		Vertices7m[i].XYZW[2] = Vertices7[i].XYZW[2];
		Vertices7m[i].XYZW[3] = Vertices7[i].XYZW[3];
		Vertices7m[i].RGBA[0] = Vertices7[i].RGBA[0];
		Vertices7m[i].RGBA[1] = Vertices7[i].RGBA[1];
		Vertices7m[i].RGBA[2] = Vertices7[i].RGBA[2];
		Vertices7m[i].RGBA[3] = Vertices7[i].RGBA[3];
		Vertices7g[i].XYZW[0] = Vertices7[i].XYZW[0] / 2.0;
		Vertices7g[i].XYZW[1] = Vertices7[i].XYZW[1] / 2.0 + 1.0;
		Vertices7g[i].XYZW[2] = Vertices7[i].XYZW[2];
		Vertices7g[i].XYZW[3] = Vertices7[i].XYZW[3];
		Vertices7g[i].RGBA[0] = Vertices7[i].RGBA[0];
		Vertices7g[i].RGBA[1] = Vertices7[i].RGBA[1];
		Vertices7g[i].RGBA[2] = Vertices7[i].RGBA[2];
		Vertices7g[i].RGBA[3] = Vertices7[i].RGBA[3];
	}
	for (int i = 0; i < 320; i++){
		Vertices8m[i].XYZW[0] = Vertices8[i].XYZW[2] / 2.0;
		Vertices8m[i].XYZW[1] = Vertices8[i].XYZW[1] / 2.0 - 1.0;
		Vertices8m[i].XYZW[2] = Vertices8[i].XYZW[2];
		Vertices8m[i].XYZW[3] = Vertices8[i].XYZW[3];
		Vertices8m[i].RGBA[0] = Vertices8[i].RGBA[0];
		Vertices8m[i].RGBA[1] = Vertices8[i].RGBA[1];
		Vertices8m[i].RGBA[2] = Vertices8[i].RGBA[2];
		Vertices8m[i].RGBA[3] = Vertices8[i].RGBA[3];
		Vertices8g[i].XYZW[0] = Vertices8[i].XYZW[0] / 2.0;
		Vertices8g[i].XYZW[1] = Vertices8[i].XYZW[1] / 2.0 + 1.0;
		Vertices8g[i].XYZW[2] = Vertices8[i].XYZW[2];
		Vertices8g[i].XYZW[3] = Vertices8[i].XYZW[3];
		Vertices8g[i].RGBA[0] = Vertices8[i].RGBA[0];
		Vertices8g[i].RGBA[1] = Vertices8[i].RGBA[1];
		Vertices8g[i].RGBA[2] = Vertices8[i].RGBA[2];
		Vertices8g[i].RGBA[3] = Vertices8[i].RGBA[3];
	}
	traveldot.XYZW[0] = Vertices8[ist].XYZW[0] / 2.0;
	traveldot.XYZW[1] = Vertices8[ist].XYZW[1] / 2.0+1.0;
	traveldot.XYZW[2] = Vertices8[ist].XYZW[2];
	traveldot.XYZW[3] = Vertices8[ist].XYZW[3];
	traveldot3.XYZW[0] = Vertices8[ist].XYZW[2] / 2.0;
	traveldot3.XYZW[1] = Vertices8[ist].XYZW[1] / 2.0-1.0;
	traveldot3.XYZW[2] = Vertices8[ist].XYZW[2];
	traveldot3.XYZW[3] = Vertices8[ist].XYZW[3];
	traveldot2.XYZW[0] = Vertices8[(ist-1)%320].XYZW[0] / 2.0;
	traveldot2.XYZW[1] = Vertices8[(ist - 1) % 320].XYZW[1] / 2.0 + 1.0;
	traveldot2.XYZW[2] = Vertices8[(ist - 1) % 320].XYZW[2];
	traveldot2.XYZW[3] = Vertices8[(ist - 1) % 320].XYZW[3];
	traveldot4.XYZW[0] = Vertices8[(ist - 1) % 320].XYZW[2] / 2.0;
	traveldot4.XYZW[1] = Vertices8[(ist - 1) % 320].XYZW[1] / 2.0 - 1.0;
	traveldot4.XYZW[2] = Vertices8[(ist - 1) % 320].XYZW[2];
	traveldot4.XYZW[3] = Vertices8[(ist - 1) % 320].XYZW[3];
	traveldot.RGBA[0] = 1.0f; traveldot.RGBA[1] = 0.0f; traveldot.RGBA[2] = 0.0f; traveldot.RGBA[3] = 1.0f;
	traveldot2.RGBA[0] = 1.0f; traveldot2.RGBA[1] = 0.0f; traveldot2.RGBA[2] = 0.0f; traveldot2.RGBA[3] = 1.0f;
	Verticestang[0] = traveldot; 
	Verticestang[1].XYZW[0] = 21 * traveldot.XYZW[0] - 20 * traveldot2.XYZW[0]; Verticestang[1].XYZW[1] = 21 * traveldot.XYZW[1] - 20 * traveldot2.XYZW[1]; Verticestang[1].XYZW[2] = 21 * traveldot.XYZW[2] - 20 * traveldot2.XYZW[2]; Verticestang[1].XYZW[3] = 1.0f;
	Verticestang[1].RGBA[0] = 1.0f; Verticestang[1].RGBA[1] = 0.0f; Verticestang[1].RGBA[2] = 0.0f; Verticestang[1].RGBA[3] = 1.0f;
	traveldot.RGBA[0] = 0.0f; traveldot.RGBA[1] = 1.0f; traveldot.RGBA[2] = 0.0f; traveldot.RGBA[3] = 1.0f;
	Verticesnorm[0] = traveldot;
	Verticesnorm[1].XYZW[0] = traveldot.XYZW[0] - pow(traveldot.XYZW[0], 3.0); Verticesnorm[1].XYZW[1] = pow(traveldot.XYZW[1], 3.0)>1 ? traveldot.XYZW[1] - pow(traveldot.XYZW[1], 3.0) / 10.0 : traveldot.XYZW[1] - pow(traveldot.XYZW[1], 3.0); Verticesnorm[1].XYZW[2] = traveldot.XYZW[2] - pow(traveldot.XYZW[2], 3.0); Verticesnorm[1].XYZW[3] = 1.0f;
	Verticesnorm[1].RGBA[0] = 0.0f; Verticesnorm[1].RGBA[1] = 1.0f; Verticesnorm[1].RGBA[2] = 0.0f; Verticesnorm[1].RGBA[3] = 1.0f;
	traveldot.RGBA[0] = 0.0f; traveldot.RGBA[1] = 0.0f; traveldot.RGBA[2] = 1.0f; traveldot.RGBA[3] = 1.0f;
	float a[3] = { Verticestang[0].XYZW[0] - Verticestang[1].XYZW[0], Verticestang[0].XYZW[1] - Verticestang[1].XYZW[1], Verticestang[0].XYZW[2] - Verticestang[1].XYZW[2] };
	float b[3] = { Verticesnorm[0].XYZW[0] - Verticesnorm[1].XYZW[0], Verticesnorm[0].XYZW[1] - Verticesnorm[1].XYZW[1], Verticesnorm[0].XYZW[2] - Verticesnorm[1].XYZW[2] };
	Verticesbino[0] = traveldot;
	Verticesbino[1].XYZW[0] = traveldot.XYZW[0]; Verticesbino[1].XYZW[1] = traveldot.XYZW[0]+a[0] * b[2] / b[0] - a[2]; Verticesbino[1].XYZW[2] = traveldot.XYZW[2] + a[1]-a[0]*b[1]/b[0]; Verticesbino[1].XYZW[3] = 1.0f;
	Verticesbino[1].RGBA[0] = 0.0f; Verticesbino[1].RGBA[1] = 0.0f; Verticesbino[1].RGBA[2] = 1.0f; Verticesbino[1].RGBA[3] = 1.0f;
	traveldot3.RGBA[0] = 1.0f; traveldot3.RGBA[1] = 0.0f; traveldot3.RGBA[2] = 0.0f; traveldot3.RGBA[3] = 1.0f;
	traveldot4.RGBA[0] = 1.0f; traveldot4.RGBA[1] = 0.0f; traveldot4.RGBA[2] = 0.0f; traveldot4.RGBA[3] = 1.0f;
	Verticestang2[0] = traveldot3; Verticestang2[1].XYZW[1] = 21 * traveldot3.XYZW[1] - 20 * traveldot4.XYZW[1]; Verticestang2[1].XYZW[0] = Verticestang[1].XYZW[2]; Verticestang2[1].XYZW[3] = 1.0f;
	Verticestang2[1].RGBA[0] = 1.0f; Verticestang2[1].RGBA[1] = 0.0f; Verticestang2[1].RGBA[2] = 0.0f; Verticestang2[1].RGBA[3] = 1.0f;
	traveldot3.RGBA[0] = 0.0f; traveldot3.RGBA[1] = 1.0f; traveldot3.RGBA[2] = 0.0f; traveldot3.RGBA[3] = 1.0f;
	Verticesnorm2[0] = traveldot3;
	Verticesnorm2[1].XYZW[1] = pow(traveldot3.XYZW[1], 3.0)>1 ? traveldot3.XYZW[1] - pow(traveldot3.XYZW[1], 3.0) / 10.0 : traveldot3.XYZW[1] - pow(traveldot3.XYZW[1], 3.0); Verticesnorm2[1].XYZW[0] = Verticesnorm[1].XYZW[2]; Verticesnorm[1].XYZW[3] = 0.0f;
	Verticesnorm2[1].RGBA[0] = 0.0f; Verticesnorm2[1].RGBA[1] = 1.0f; Verticesnorm2[1].RGBA[2] = 0.0f; Verticesnorm2[1].RGBA[3] = 1.0f;
	traveldot3.RGBA[0] = 0.0f; traveldot3.RGBA[1] = 0.0f; traveldot3.RGBA[2] = 1.0f; traveldot3.RGBA[3] = 1.0f;
	float a1[3] = { Verticestang2[0].XYZW[0] - Verticestang2[1].XYZW[0], Verticestang2[0].XYZW[1] - Verticestang2[1].XYZW[1], Verticestang2[0].XYZW[2] - Verticestang2[1].XYZW[2] };
	float b1[3] = { Verticesnorm2[0].XYZW[0] - Verticesnorm2[1].XYZW[0], Verticesnorm2[0].XYZW[1] - Verticesnorm2[1].XYZW[1], Verticesnorm2[0].XYZW[2] - Verticesnorm2[1].XYZW[2] };
	Verticesbino2[0] = traveldot3;
	Verticesbino2[1].XYZW[0] = Verticesbino[1].XYZW[2]; Verticesbino[1].XYZW[1] = traveldot3.XYZW[0] + a1[0] * b1[2] / b1[0] - a1[2];  Verticesbino2[1].XYZW[3] = 1.0f;
	Verticesbino2[1].RGBA[0] = 0.0f; Verticesbino2[1].RGBA[1] = 0.0f; Verticesbino2[1].RGBA[2] = 1.0f; Verticesbino2[1].RGBA[3] = 1.0f;
	ist += 3;
	ist = ist % 320;
	// ATTN: DERIVE YOUR NEW OBJECTS HERE:
	// each has one vertices {pos;color} and one indices array (no picking needed here)

}

void drawScene(void)
{
	// Dark blue background
	glClearColor(0.0f, 0.0f, 0.4f, 0.0f);
	// Re-clear the screen for real rendering
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	glUseProgram(programID);
	{
		glm::mat4 ModelMatrix = glm::mat4(1.0); // TranslationMatrix * RotationMatrix;
		glm::mat4 MVP = gProjectionMatrix * gViewMatrix * ModelMatrix;

		// Send our transformation to the currently bound shader, 
		// in the "MVP" uniform
		glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &MVP[0][0]);
		glUniformMatrix4fv(ModelMatrixID, 1, GL_FALSE, &ModelMatrix[0][0]);
		glUniformMatrix4fv(ViewMatrixID, 1, GL_FALSE, &gViewMatrix[0][0]);
		glm::vec3 lightPos = glm::vec3(4, 4, 4);
		glUniform3f(LightID, lightPos.x, lightPos.y, lightPos.z);

		glEnable(GL_PROGRAM_POINT_SIZE);
		if (fm3&&glfwGetKey(window, GLFW_KEY_4) == GLFW_PRESS){
			fm3 = false;
			cooot3++;
			KeyLastFrame3 = glfwGetKey(window, GLFW_KEY_4);
		}
		if (KeyLastFrame3 == GLFW_PRESS&&glfwGetKey(window, GLFW_KEY_4) == GLFW_RELEASE) fm3 = true;
		if (fm4&&glfwGetKey(window, GLFW_KEY_5) == GLFW_PRESS){
			fm4 = false;
			cooot4++;
			KeyLastFrame4 = glfwGetKey(window, GLFW_KEY_5);
		}
		if (KeyLastFrame4 == GLFW_PRESS&&glfwGetKey(window, GLFW_KEY_5) == GLFW_RELEASE) fm4 = true;
		if (cooot3 == 1){
			glBindVertexArray(VertexArrayId[8]);	// draw Vertices
			glBindBuffer(GL_ARRAY_BUFFER, VertexBufferId[8]);
			glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Verticesg), Verticesg);				// update buffer data
			//glDrawElements(GL_LINE_LOOP, NumVert[0], GL_UNSIGNED_SHORT, (void*)0);
			glDrawElements(GL_POINTS, NumVert[8], GL_UNSIGNED_SHORT, (void*)0);
			//glVertexPointer(3, GL_FIXED, 0, g_vertex_buffer_data);
			// ATTN: OTHER BINDING AND DRAWING COMMANDS GO HERE, one set per object:
			//glBindVertexArray(VertexArrayId[<x>]); etc etc
			glBindVertexArray(VertexArrayId[9]);
			glBindBuffer(GL_ARRAY_BUFFER, VertexBufferId[9]);
			glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vertices2g), Vertices2g);
			glDrawElements(GL_LINE_LOOP, NumVert[9], GL_UNSIGNED_SHORT, (void*)0);
			glBindVertexArray(VertexArrayId[10]);
			glBindBuffer(GL_ARRAY_BUFFER, VertexBufferId[10]);
			glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vertices7g), Vertices7g);
			glDrawElements(GL_POINTS, NumVert[10], GL_UNSIGNED_SHORT, (void*)0);
			glBindVertexArray(VertexArrayId[11]);
			glBindBuffer(GL_ARRAY_BUFFER, VertexBufferId[11]);
			glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vertices8g), Vertices8g);
			glDrawElements(GL_LINE_LOOP, NumVert[11], GL_UNSIGNED_SHORT, (void*)0);
			glBindVertexArray(VertexArrayId[4]);
			glBindBuffer(GL_ARRAY_BUFFER, VertexBufferId[4]);
			glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Verticesm), Verticesm);
			glDrawElements(GL_POINTS, NumVert[4], GL_UNSIGNED_SHORT, (void*)0);
			glBindVertexArray(VertexArrayId[5]);
			glBindBuffer(GL_ARRAY_BUFFER, VertexBufferId[5]);
			glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vertices2m), Vertices2m);
			glDrawElements(GL_LINE_LOOP, NumVert[5], GL_UNSIGNED_SHORT, (void*)0);
			glBindVertexArray(VertexArrayId[6]);
			glBindBuffer(GL_ARRAY_BUFFER, VertexBufferId[6]);
			glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vertices7m), Vertices7m);
			glDrawElements(GL_POINTS, NumVert[6], GL_UNSIGNED_SHORT, (void*)0);
			glBindVertexArray(VertexArrayId[7]);
			glBindBuffer(GL_ARRAY_BUFFER, VertexBufferId[7]);
			glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vertices8m), Vertices8m);
			glDrawElements(GL_LINE_LOOP, NumVert[7], GL_UNSIGNED_SHORT, (void*)0);
		}
		else if (cooot4 == 1){
			glBindVertexArray(VertexArrayId[8]);	// draw Vertices
			glBindBuffer(GL_ARRAY_BUFFER, VertexBufferId[8]);
			glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Verticesg), Verticesg);				// update buffer data
			//glDrawElements(GL_LINE_LOOP, NumVert[0], GL_UNSIGNED_SHORT, (void*)0);
			glDrawElements(GL_POINTS, NumVert[8], GL_UNSIGNED_SHORT, (void*)0);
			//glVertexPointer(3, GL_FIXED, 0, g_vertex_buffer_data);
			// ATTN: OTHER BINDING AND DRAWING COMMANDS GO HERE, one set per object:
			//glBindVertexArray(VertexArrayId[<x>]); etc etc
			glBindVertexArray(VertexArrayId[9]);
			glBindBuffer(GL_ARRAY_BUFFER, VertexBufferId[9]);
			glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vertices2g), Vertices2g);
			glDrawElements(GL_LINE_LOOP, NumVert[9], GL_UNSIGNED_SHORT, (void*)0);
			glBindVertexArray(VertexArrayId[10]);
			glBindBuffer(GL_ARRAY_BUFFER, VertexBufferId[10]);
			glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vertices7g), Vertices7g);
			glDrawElements(GL_POINTS, NumVert[10], GL_UNSIGNED_SHORT, (void*)0);
			glBindVertexArray(VertexArrayId[11]);
			glBindBuffer(GL_ARRAY_BUFFER, VertexBufferId[11]);
			glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vertices8g), Vertices8g);
			glDrawElements(GL_LINE_LOOP, NumVert[11], GL_UNSIGNED_SHORT, (void*)0);
			glBindVertexArray(VertexArrayId[4]);
			glBindBuffer(GL_ARRAY_BUFFER, VertexBufferId[4]);
			glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Verticesm), Verticesm);
			glDrawElements(GL_POINTS, NumVert[4], GL_UNSIGNED_SHORT, (void*)0);
			glBindVertexArray(VertexArrayId[5]);
			glBindBuffer(GL_ARRAY_BUFFER, VertexBufferId[5]);
			glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vertices2m), Vertices2m);
			glDrawElements(GL_LINE_LOOP, NumVert[5], GL_UNSIGNED_SHORT, (void*)0);
			glBindVertexArray(VertexArrayId[6]);
			glBindBuffer(GL_ARRAY_BUFFER, VertexBufferId[6]);
			glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vertices7m), Vertices7m);
			glDrawElements(GL_POINTS, NumVert[6], GL_UNSIGNED_SHORT, (void*)0);
			glBindVertexArray(VertexArrayId[7]);
			glBindBuffer(GL_ARRAY_BUFFER, VertexBufferId[7]);
			glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vertices8m), Vertices8m);
			glDrawElements(GL_LINE_LOOP, NumVert[7], GL_UNSIGNED_SHORT, (void*)0);
			glBindVertexArray(VertexArrayId[12]);
			glBindBuffer(GL_ARRAY_BUFFER, VertexBufferId[12]);
			glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Verticestang), Verticestang);
			glDrawElements(GL_LINE_LOOP, NumVert[12], GL_UNSIGNED_SHORT, (void*)0);
			glBindVertexArray(VertexArrayId[13]);
			glBindBuffer(GL_ARRAY_BUFFER, VertexBufferId[13]);
			glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Verticesnorm), Verticesnorm);
			glDrawElements(GL_LINE_LOOP, NumVert[13], GL_UNSIGNED_SHORT, (void*)0);
			glBindVertexArray(VertexArrayId[14]);
			glBindBuffer(GL_ARRAY_BUFFER, VertexBufferId[14]);
			glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Verticesbino), Verticesbino);
			glDrawElements(GL_LINE_LOOP, NumVert[14], GL_UNSIGNED_SHORT, (void*)0);
			glBindVertexArray(VertexArrayId[15]);
			glBindBuffer(GL_ARRAY_BUFFER, VertexBufferId[15]);
			glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Verticestang2), Verticestang2);
			glDrawElements(GL_LINE_LOOP, NumVert[15], GL_UNSIGNED_SHORT, (void*)0);
			glBindVertexArray(VertexArrayId[16]);
			glBindBuffer(GL_ARRAY_BUFFER, VertexBufferId[16]);
			glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Verticesnorm2), Verticesnorm2);
			glDrawElements(GL_LINE_LOOP, NumVert[16], GL_UNSIGNED_SHORT, (void*)0);
			glBindVertexArray(VertexArrayId[17]);
			glBindBuffer(GL_ARRAY_BUFFER, VertexBufferId[17]);
			glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Verticesbino2), Verticesbino2);
			glDrawElements(GL_LINE_LOOP, NumVert[17], GL_UNSIGNED_SHORT, (void*)0);

		}
		else {
			cooot3 = 0;
			cooot4 = 0;
			glBindVertexArray(VertexArrayId[0]);	// draw Vertices
			glBindBuffer(GL_ARRAY_BUFFER, VertexBufferId[0]);
			glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vertices), Vertices);				// update buffer data
			//glDrawElements(GL_LINE_LOOP, NumVert[0], GL_UNSIGNED_SHORT, (void*)0);
			glDrawElements(GL_POINTS, NumVert[0], GL_UNSIGNED_SHORT, (void*)0);
			//glVertexPointer(3, GL_FIXED, 0, g_vertex_buffer_data);
			// ATTN: OTHER BINDING AND DRAWING COMMANDS GO HERE, one set per object:
			//glBindVertexArray(VertexArrayId[<x>]); etc etc
			glBindVertexArray(VertexArrayId[1]);
			glBindBuffer(GL_ARRAY_BUFFER, VertexBufferId[1]);
			glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vertices2), Vertices2);
			glDrawElements(GL_LINE_LOOP, NumVert[1], GL_UNSIGNED_SHORT, (void*)0);
			glBindVertexArray(VertexArrayId[2]);
			glBindBuffer(GL_ARRAY_BUFFER, VertexBufferId[2]);
			glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vertices7), Vertices7);
			glDrawElements(GL_POINTS, NumVert[2], GL_UNSIGNED_SHORT, (void*)0);
			glBindVertexArray(VertexArrayId[3]);
			glBindBuffer(GL_ARRAY_BUFFER, VertexBufferId[3]);
			glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vertices8), Vertices8);
			glDrawElements(GL_LINE_LOOP, NumVert[3], GL_UNSIGNED_SHORT, (void*)0);
		}
	
			//if (glfwGetKey(window, GLFW_KEY_1) == GLFW_RELEASE) KeyLastFrame = true;
		glBindVertexArray(0);
	}
	glUseProgram(0);
	// Draw GUI
	TwDraw();

	// Swap buffers
	glfwSwapBuffers(window);
	glfwPollEvents();
}

void pickVertex(void)
{
	// Clear the screen in white
	glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	glUseProgram(pickingProgramID);
	{
		glm::mat4 ModelMatrix = glm::mat4(1.0); // TranslationMatrix * RotationMatrix;
		glm::mat4 MVP = gProjectionMatrix * gViewMatrix * ModelMatrix;

		// Send our transformation to the currently bound shader, in the "MVP" uniform
		glUniformMatrix4fv(PickingMatrixID, 1, GL_FALSE, &MVP[0][0]);
		glUniform1fv(pickingColorArrayID, NumVert[0], pickingColor);	// here we pass in the picking marker array

		// Draw the ponts
		glEnable(GL_PROGRAM_POINT_SIZE);
		glBindVertexArray(VertexArrayId[0]);
		glBindBuffer(GL_ARRAY_BUFFER, VertexBufferId[0]);
		glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vertices), Vertices);	// update buffer data
		glDrawElements(GL_POINTS, NumVert[0], GL_UNSIGNED_SHORT, (void*)0);
		glBindVertexArray(0);
	}
	glUseProgram(0);
	// Wait until all the pending drawing commands are really done.
	// Ultra-mega-over slow ! 
	// There are usually a long time between glDrawElements() and
	// all the fragments completely rasterized.
	glFlush();
	glFinish();

	glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

	// Read the pixel at the center of the screen.
	// You can also use glfwGetMousePos().
	// Ultra-mega-over slow too, even for 1 pixel, 
	// because the framebuffer is on the GPU.
	double xpos, ypos;
	glfwGetCursorPos(window, &xpos, &ypos);
	unsigned char data[4];
	glReadPixels(xpos, window_height - ypos, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, data); // OpenGL renders with (0,0) on bottom, mouse reports with (0,0) on top

	// Convert the color back to an integer ID
	gPickedIndex = int(data[0]);

	// Uncomment these lines to see the picking shader in effect
	//glfwSwapBuffers(window);
	//continue; // skips the normal rendering
}

// fill this function in!
void moveVertex(void)
{
	glm::mat4 ModelMatrix = glm::mat4(1.0);
	GLint viewport[4];
	double xpos, ypos;
	glGetIntegerv(GL_VIEWPORT, viewport);
	glm::vec4 vp = glm::vec4(viewport[0], viewport[1], viewport[2], viewport[3]);
	glfwGetCursorPos(window, &xpos, &ypos);
	vec3 sd=glm::unProject(glm::vec3(xpos,ypos,0.0),ModelMatrix,gProjectionMatrix,vp);
	float sda[4] = { -sd[0], -sd[1], 0.0f, 1.0f };
	// retrieve your cursor position
	// get your world coordinates
	// move points

	if (gPickedIndex >7){ // Full white, must be the background !
		gMessage = "background";
	}
	else if (gPickedIndex == 0){
		std::ostringstream oss;
		oss << "point " << gPickedIndex;
		gMessage = oss.str();
		Vertices[gPickedIndex].SetCoords(sda);
		Vertices2[gPickedIndex].SetCoords(sda);
		Vertices2[8].SetCoords(sda);
	}
	else {
		std::ostringstream oss;
		oss << "point " << gPickedIndex;
		gMessage = oss.str();
		Vertices[gPickedIndex].SetCoords(sda);
		Vertices2[gPickedIndex].SetCoords(sda);
	}
}

void moveVertex2(void)
{
	glm::mat4 ModelMatrix = glm::mat4(1.0);
	GLint viewport[4];
	double xpos, ypos;
	glGetIntegerv(GL_VIEWPORT, viewport);
	glm::vec4 vp = glm::vec4(viewport[0], viewport[1], viewport[2], viewport[3]);
	glfwGetCursorPos(window, &xpos, &ypos);
	vec3 sd = glm::unProject(glm::vec3(xpos, ypos, 0.0), ModelMatrix, gProjectionMatrix, vp);
	// retrieve your cursor position
	// get your world coordinates
	// move points
	note = -sd[0];
	if (gPickedIndex >7){ // Full white, must be the background !
		gMessage = "background";
	}
	else {
		std::ostringstream oss;
		oss << "point " << gPickedIndex;
		gMessage = oss.str();
		//cout << st2 << endl;
		Verticest[gPickedIndex].XYZW[0] = note;
		//cout << Verticest[gPickedIndex].XYZW[0] << endl;
		Verticest2[gPickedIndex].XYZW[0] = note;
	}
}

int initWindow(void)
{
	// Initialise GLFW
	if (!glfwInit()) {
		fprintf(stderr, "Failed to initialize GLFW\n");
		return -1;
	}

	glfwWindowHint(GLFW_SAMPLES, 4);
	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
	glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
	glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);

	// Open a window and create its OpenGL context
	window = glfwCreateWindow(window_width, window_height, "Liu,Bohan(66127941)", NULL, NULL);
	if (window == NULL) {
		fprintf(stderr, "Failed to open GLFW window. If you have an Intel GPU, they are not 3.3 compatible. Try the 2.1 version of the tutorials.\n");
		glfwTerminate();
		return -1;
	}
	glfwMakeContextCurrent(window);

	// Initialize GLEW
	glewExperimental = true; // Needed for core profile
	if (glewInit() != GLEW_OK) {
		fprintf(stderr, "Failed to initialize GLEW\n");
		return -1;
	}

	// Initialize the GUI
	TwInit(TW_OPENGL_CORE, NULL);
	TwWindowSize(window_width, window_height);
	TwBar * GUI = TwNewBar("Picking");
	TwSetParam(GUI, NULL, "refresh", TW_PARAM_CSTRING, 1, "0.1");
	TwAddVarRW(GUI, "Last picked object", TW_TYPE_STDSTRING, &gMessage, NULL);

	// Set up inputs
	glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_FALSE);
	glfwSetCursorPos(window, window_width / 2, window_height / 2);
	glfwSetMouseButtonCallback(window, mouseCallback);

	return 0;
}

void initOpenGL(void)
{
	// Dark blue background
	glClearColor(0.0f, 0.0f, 0.4f, 0.0f);

	// Enable depth test
	glEnable(GL_DEPTH_TEST);
	// Accept fragment if it closer to the camera than the former one
	glDepthFunc(GL_LESS);
	// Cull triangles which normal is not towards the camera
	glEnable(GL_CULL_FACE);

	// Projection matrix : 45° Field of View, 4:3 ratio, display range : 0.1 unit <-> 100 units
	//glm::mat4 ProjectionMatrix = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.0f);
	// Or, for an ortho camera :
	gProjectionMatrix = glm::ortho(-4.0f, 4.0f, -3.0f, 3.0f, 0.0f, 100.0f); // In world coordinates

	// Camera matrix
	gViewMatrix = glm::lookAt(
		glm::vec3(0, 0, -5), // Camera is at (4,3,3), in World Space
		glm::vec3(0, 0, 0), // and looks at the origin
		glm::vec3(0, 1, 0)  // Head is up (set to 0,-1,0 to look upside-down)
		);

	// Create and compile our GLSL program from the shaders
	programID = LoadShaders("StandardShading.vertexshader", "StandardShading.fragmentshader");
	pickingProgramID = LoadShaders("Picking.vertexshader", "Picking.fragmentshader");

	// Get a handle for our "MVP" uniform
	MatrixID = glGetUniformLocation(programID, "MVP");
	ViewMatrixID = glGetUniformLocation(programID, "V");
	ModelMatrixID = glGetUniformLocation(programID, "M");
	PickingMatrixID = glGetUniformLocation(pickingProgramID, "MVP");
	// Get a handle for our "pickingColorID" uniform
	pickingColorArrayID = glGetUniformLocation(pickingProgramID, "PickingColorArray");
	pickingColorID = glGetUniformLocation(pickingProgramID, "PickingColor");
	// Get a handle for our "LightPosition" uniform
	LightID = glGetUniformLocation(programID, "LightPosition_worldspace");

	createVAOs(Vertices, Indices, sizeof(Vertices), sizeof(Indices), 0);
	createVAOs(Vertices2, Indices, sizeof(Vertices2), sizeof(Indices), 1);
	createObjects(); 
	createVAOs(Vertices7, Indices6, sizeof(Vertices7), sizeof(Indices6), 2);
	createVAOs(Vertices8, Indices7, sizeof(Vertices8), sizeof(Indices7), 3);
	createVAOs(Verticesm, Indices, sizeof(Verticesm), sizeof(Indices), 4);
	createVAOs(Vertices2m, Indices, sizeof(Vertices2m), sizeof(Indices), 5);
	createVAOs(Vertices7m, Indices6, sizeof(Vertices7m), sizeof(Indices6), 6);
	createVAOs(Vertices8m, Indices7, sizeof(Vertices8m), sizeof(Indices7), 7);
	createVAOs(Verticesg, Indices, sizeof(Verticesg), sizeof(Indices), 8);
	createVAOs(Vertices2g, Indices, sizeof(Vertices2g), sizeof(Indices), 9);
	createVAOs(Vertices7g, Indices6, sizeof(Vertices7g), sizeof(Indices6),10);
	createVAOs(Vertices8g, Indices7, sizeof(Vertices8g), sizeof(Indices7), 11);
	createVAOs(Verticestang, Indices8, sizeof(Verticestang), sizeof(Indices8), 12);
	createVAOs(Verticesnorm, Indices8, sizeof(Verticesnorm), sizeof(Indices8), 13);
	createVAOs(Verticesbino, Indices8, sizeof(Verticesbino), sizeof(Indices8), 14);
	createVAOs(Verticestang2, Indices8, sizeof(Verticestang2), sizeof(Indices8), 15);
	createVAOs(Verticesnorm2, Indices8, sizeof(Verticesnorm2), sizeof(Indices8), 16);
	createVAOs(Verticesbino2, Indices8, sizeof(Verticesbino2), sizeof(Indices8), 17);
	// ATTN: create VAOs for each of the newly created objects here:
	// createVAOs(<fill this appropriately>);

}

void createVAOs(Vertex Vertices[], unsigned short Indices[], size_t BufferSize, size_t IdxBufferSize, int ObjectId) {

	NumVert[ObjectId] = IdxBufferSize / (sizeof GLubyte);

	GLenum ErrorCheckValue = glGetError();
	size_t VertexSize = sizeof(Vertices[0]);
	size_t RgbOffset = sizeof(Vertices[0].XYZW);

	// Create Vertex Array Object
	glGenVertexArrays(1, &VertexArrayId[ObjectId]);
	glBindVertexArray(VertexArrayId[ObjectId]);

	// Create Buffer for vertex data
	glGenBuffers(1, &VertexBufferId[ObjectId]);
	glBindBuffer(GL_ARRAY_BUFFER, VertexBufferId[ObjectId]);
	glBufferData(GL_ARRAY_BUFFER, BufferSize, Vertices, GL_STATIC_DRAW);

	// Create Buffer for indices
	glGenBuffers(1, &IndexBufferId[ObjectId]);
	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexBufferId[ObjectId]);
	glBufferData(GL_ELEMENT_ARRAY_BUFFER, IdxBufferSize, Indices, GL_STATIC_DRAW);

	// Assign vertex attributes
	glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, VertexSize, 0);
	glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, VertexSize, (GLvoid*)RgbOffset);

	glEnableVertexAttribArray(0);	// position
	glEnableVertexAttribArray(1);	// color

	// Disable our Vertex Buffer Object 
	glBindVertexArray(0);

	ErrorCheckValue = glGetError();
	if (ErrorCheckValue != GL_NO_ERROR)
	{
		fprintf(
			stderr,
			"ERROR: Could not create a VBO: %s \n",
			gluErrorString(ErrorCheckValue)
			);
	}
}

void cleanup(void)
{
	// Cleanup VBO and shader
	for (int i = 0; i < NumObjects; i++) {
		glDeleteBuffers(1, &VertexBufferId[i]);
		glDeleteBuffers(1, &IndexBufferId[i]);
		glDeleteVertexArrays(1, &VertexArrayId[i]);
	}
	glDeleteProgram(programID);
	glDeleteProgram(pickingProgramID);

	// Close OpenGL window and terminate GLFW
	glfwTerminate();
}

static void mouseCallback(GLFWwindow* window, int button, int action, int mods)
{
	if (button == GLFW_MOUSE_BUTTON_LEFT && action == GLFW_PRESS) {
		pickVertex();
	}
}

int main(void)
{
	// initialize window
	int errorCode = initWindow();
	if (errorCode != 0)
		return errorCode;

	// initialize OpenGL pipeline
	initOpenGL();

	// For speed computation
	double lastTime = glfwGetTime();
	int nbFrames = 0;
	do {
		// Measure speed
		double currentTime = glfwGetTime();
		nbFrames++;
		if (currentTime - lastTime >= 1.0){ // If last prinf() was more than 1sec ago
			// printf and reset
			printf("%f ms/frame\n", 1000.0 / double(nbFrames));
			nbFrames = 0;
			lastTime += 1.0;
		}

		// DRAGGING: move current (picked) vertex with cursor

		if (glfwGetKey(window, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS&&glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_LEFT)){
			counting++;
			moveVertex2();
		}
		else if (glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_LEFT)){
			moveVertex();
		}
		if (counting > 0){
			Verticest[gPickedIndex].XYZW[0] -= Vertices[gPickedIndex].XYZW[0];
			Verticest2[gPickedIndex].XYZW[0] = Verticest[gPickedIndex].XYZW[0];
			counting = 0;
		}
		// DRAWING SCENE
		createObjects();	// re-evaluate curves in case vertices have been moved
		drawScene();


	} // Check if the ESC key was pressed or the window was closed
	while (glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS &&
	glfwWindowShouldClose(window) == 0);
	//for (int i = 0; i < 32; i++){ cout << Vertices7m[i].XYZW[0] << endl; }
	cleanup();

	return 0;
}



發佈了38 篇原創文章 · 獲贊 5 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章