From a074a8d84620f0a0606521da919c6c9960c863fa Mon Sep 17 00:00:00 2001 From: Jeremy Hu Date: Tue, 20 Dec 2016 00:45:53 +0930 Subject: [PATCH] Add array data struct Add bmesh define Add vec3 Add camera control Add draw x,z axis --- screenshot/dust3d_node_edge.png | Bin 0 -> 133959 bytes src/array.c | 54 ++++++++ src/array.h | 20 +++ src/bmesh.c | 75 +++++++++++ src/bmesh.h | 43 ++++++ src/draw.cpp | 223 ++++++++++++++++++++++++++++++++ src/draw.h | 27 ++++ src/drawcommon.h | 11 +- src/mainwindow.cpp | 34 ++--- src/mainwindow.h | 10 +- src/matrix.c | 184 ++++++++++++++++++++++++++ src/matrix.h | 19 +++ src/render.cpp | 160 +++++++++++++++++++++++ src/render.h | 29 +++++ src/vector3d.c | 40 ++++++ src/vector3d.h | 25 ++++ 16 files changed, 919 insertions(+), 35 deletions(-) create mode 100644 screenshot/dust3d_node_edge.png create mode 100644 src/array.c create mode 100644 src/array.h create mode 100644 src/bmesh.c create mode 100644 src/bmesh.h create mode 100644 src/draw.cpp create mode 100644 src/draw.h create mode 100644 src/matrix.c create mode 100644 src/matrix.h create mode 100644 src/render.cpp create mode 100644 src/render.h create mode 100644 src/vector3d.c create mode 100644 src/vector3d.h diff --git a/screenshot/dust3d_node_edge.png b/screenshot/dust3d_node_edge.png new file mode 100644 index 0000000000000000000000000000000000000000..1ba38776e798f1cda5a43ae6b1cafa695ecfc1a9 GIT binary patch literal 133959 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

LZc>oRZcump^5lDr`Z!-v5 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 literal 0 HcmV?d00001 diff --git a/src/array.c b/src/array.c new file mode 100644 index 00000000..d678c9ce --- /dev/null +++ b/src/array.c @@ -0,0 +1,54 @@ +#include +#include +#include +#include "array.h" + +struct array { + int nodeSize; + int capacity; + int length; + char *nodes; +}; + +array *arrayCreate(int nodeSize) { + array *arr = (array *)calloc(1, sizeof(array)); + if (!arr) { + fprintf(stderr, "%s:Insufficient memory.\n", __FUNCTION__); + return 0; + } + arr->nodeSize = nodeSize; + return arr; +} + +int arraySetLength(array *arr, int length) { + if (length > arr->capacity) { + int newCapacity = (arr->capacity + 1) * 2; + char *newNodes = (char *)realloc(arr->nodes, arr->nodeSize * newCapacity); + if (!newNodes) { + fprintf(stderr, "%s:Insufficient memory.\n", __FUNCTION__); + return -1; + } + arr->capacity = newCapacity; + arr->nodes = newNodes; + } + arr->length = length; + return 0; +} + +void *arrayGetItem(array *arr, int index) { + if (index >= arr->length) { + return 0; + } + return arr->nodes + arr->nodeSize * index; +} + +int arrayGetLength(array *arr) { + return arr->length; +} + +void arrayDestroy(array *arr) { + if (arr) { + free(arr->nodes); + free(arr); + } +} diff --git a/src/array.h b/src/array.h new file mode 100644 index 00000000..0fa4fabe --- /dev/null +++ b/src/array.h @@ -0,0 +1,20 @@ +#ifndef ARRAY_H +#define ARRAY_H + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct array array; + +array *arrayCreate(int nodeSize); +void *arrayGetItem(array *arr, int index); +int arrayGetLength(array *arr); +int arraySetLength(array *arr, int length); +void arrayDestroy(array *arr); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/bmesh.c b/src/bmesh.c new file mode 100644 index 00000000..e90de4cc --- /dev/null +++ b/src/bmesh.c @@ -0,0 +1,75 @@ +#include +#include +#include +#include "bmesh.h" +#include "array.h" + +struct bmesh { + array *nodeArray; + array *edgeArray; +}; + +bmesh *bmeshCreate(void) { + bmesh *bm = (bmesh *)calloc(1, sizeof(bmesh)); + if (!bm) { + fprintf(stderr, "%s:Insufficient memory.\n", __FUNCTION__); + return 0; + } + bm->nodeArray = arrayCreate(sizeof(bmeshNode)); + if (!bm->nodeArray) { + fprintf(stderr, "%s:arrayCreate bmeshNode failed.\n", __FUNCTION__); + bmeshDestroy(bm); + return 0; + } + bm->edgeArray = arrayCreate(sizeof(bmeshEdge)); + if (!bm->edgeArray) { + fprintf(stderr, "%s:arrayCreate bmeshEdge failed.\n", __FUNCTION__); + bmeshDestroy(bm); + return 0; + } + return bm; +} + +void bmeshDestroy(bmesh *bm) { + arrayDestroy(bm->nodeArray); + arrayDestroy(bm->edgeArray); + free(bm); +} + +int bmeshGetNodeNum(bmesh *bm) { + return arrayGetLength(bm->nodeArray); +} + +int bmeshGetEdgeNum(bmesh *bm) { + return arrayGetLength(bm->edgeArray); +} + +bmeshNode *bmeshGetNode(bmesh *bm, int index) { + return (bmeshNode *)arrayGetItem(bm->nodeArray, index); +} + +bmeshEdge *bmeshGetEdge(bmesh *bm, int index) { + return (bmeshEdge *)arrayGetItem(bm->edgeArray, index); +} + +int bmeshAddNode(bmesh *bm, bmeshNode *node) { + int index = arrayGetLength(bm->nodeArray); + node->index = index; + if (0 != arraySetLength(bm->nodeArray, index + 1)) { + fprintf(stderr, "%s:arraySetLength failed.\n", __FUNCTION__); + return -1; + } + memcpy(arrayGetItem(bm->nodeArray, index), node, sizeof(bmeshNode)); + return index; +} + +int bmeshAddEdge(bmesh *bm, bmeshEdge *edge) { + int index = arrayGetLength(bm->edgeArray); + edge->index = index; + if (0 != arraySetLength(bm->edgeArray, index + 1)) { + fprintf(stderr, "%s:arraySetLength failed.\n", __FUNCTION__); + return -1; + } + memcpy(arrayGetItem(bm->edgeArray, index), edge, sizeof(bmeshEdge)); + return index; +} diff --git a/src/bmesh.h b/src/bmesh.h new file mode 100644 index 00000000..c7c22b32 --- /dev/null +++ b/src/bmesh.h @@ -0,0 +1,43 @@ +#ifndef B_MESH_H +#define B_MESH_H +#include "vector3d.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + BMESH_NODE_FLAG_KEY = 0x00000001, + BMESH_NODE_FLAG_INBETWEEN = 0x00000002, + BMESH_NODE_FLAG_ROOT = 0x00000010, +} bmeshNodeFlag; + +typedef struct bmesh bmesh; + +typedef struct { + int index; + vec3 position; + float radius; + unsigned int flag; +} bmeshNode; + +typedef struct { + int index; + int firstNode; + int secondNode; +} bmeshEdge; + +bmesh *bmeshCreate(void); +void bmeshDestroy(bmesh *bm); +int bmeshGetNodeNum(bmesh *bm); +int bmeshGetEdgeNum(bmesh *bm); +bmeshNode *bmeshGetNode(bmesh *bm, int index); +bmeshEdge *bmeshGetEdge(bmesh *bm, int index); +int bmeshAddNode(bmesh *bm, bmeshNode *node); +int bmeshAddEdge(bmesh *bm, bmeshEdge *edge); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/draw.cpp b/src/draw.cpp new file mode 100644 index 00000000..d6b91f2f --- /dev/null +++ b/src/draw.cpp @@ -0,0 +1,223 @@ +#include +#include +#include +#include +#include +#include "draw.h" + +/* + * This drawSphere function modified from [Jon Leech's implementation of sphere](ftp://ftp.ee.lbl.gov/sphere.c) + * Jeremy HU (huxingyi@msn.com) 2016/12/16 +*/ + +#define XPLUS { 1, 0, 0 } /* X */ +#define XMIN { -1, 0, 0 } /* -X */ +#define YPLUS { 0, 1, 0 } /* Y */ +#define YMIN { 0, -1, 0 } /* -Y */ +#define ZPLUS { 0, 0, 1 } /* Z */ +#define ZMIN { 0, 0, -1 } /* -Z */ + +static const triangle octahedron[] = { + {{XPLUS, ZPLUS, YPLUS}}, + {{YPLUS, ZPLUS, XMIN}}, + {{XMIN, ZPLUS, YMIN}}, + {{YMIN, ZPLUS, XPLUS}}, + {{XPLUS, YPLUS, ZMIN}}, + {{YPLUS, XMIN, ZMIN}}, + {{XMIN, YMIN, ZMIN}}, + {{YMIN, XPLUS, ZMIN}}, +}; + +static void subdivide(object *old, object *subdivided) { + int i; + for (i = 0; i < old->npoly; ++i) { + triangle *oldt = &old->poly[i]; + triangle *newt = &subdivided->poly[i * 4]; + vec3 a, b, c; + + vec3Midpoint(&oldt->pt[0], &oldt->pt[2], &a); + vec3Midpoint(&oldt->pt[0], &oldt->pt[1], &b); + vec3Midpoint(&oldt->pt[1], &oldt->pt[2], &c); + + vec3Normalize(&a); + vec3Normalize(&b); + vec3Normalize(&c); + + newt->pt[0] = oldt->pt[0]; + newt->pt[1] = b; + newt->pt[2] = a; + newt++; + + newt->pt[0] = b; + newt->pt[1] = oldt->pt[1]; + newt->pt[2] = c; + newt++; + + newt->pt[0] = a; + newt->pt[1] = b; + newt->pt[2] = c; + newt++; + + newt->pt[0] = a; + newt->pt[1] = c; + newt->pt[2] = oldt->pt[2]; + } +} + +int drawSphere(vec3 *origin, float radius, int level) { + int lv, i; + object oldObj, newObj; + + if (level < 1) { + fprintf(stderr, "%s:level max greater than 0.\n", __FUNCTION__); + return -1; + } + + oldObj.npoly = sizeof(octahedron) / sizeof(octahedron[0]); + oldObj.poly = (triangle *)malloc(oldObj.npoly * sizeof(triangle)); + if (!oldObj.poly) { + fprintf(stderr, "%s:insufficient memory.\n", __FUNCTION__); + return -1; + } + memcpy(oldObj.poly, octahedron, oldObj.npoly * sizeof(triangle)); + + for (lv = 0; lv < level; lv++) { + newObj.npoly = oldObj.npoly * 4; + newObj.poly = (triangle *)malloc(newObj.npoly * sizeof(triangle)); + if (!newObj.poly) { + fprintf(stderr, "%s:insufficient memory(levelLoop:%d).\n", + __FUNCTION__, lv); + free(oldObj.poly); + return -1; + } + + subdivide(&oldObj, &newObj); + + free(oldObj.poly); + oldObj = newObj; + } + + glPushMatrix(); + glTranslatef(origin->x, origin->y, origin->z); + glScalef(radius, radius, radius); + for (i = 0; i < newObj.npoly; ++i) { + drawTriangle(&newObj.poly[i]); + } + glPopMatrix(); + + free(newObj.poly); + + return 0; +} + +void drawTriangle(triangle *poly) { + int i; + glBegin(GL_TRIANGLES); + for (i = 0; i < 3; ++i) { + vec3 *pt = &poly->pt[i]; + glNormal3f(pt->x, pt->y, pt->z); + glVertex3f(pt->x, pt->y, pt->z); + } + glEnd(); +} + +int drawCylinder(vec3 *topOrigin, vec3 *bottomOrigin, float radius, int slices) { + float theta = (2.0 * M_PI) / (float)slices; + float a = 0.0f; + int lv; + float x, y, z; + vec3 zAxis = {0, 0, 1}; + vec3 p, t; + float height = 0; + float angle = 0; + + if (slices <= 0) { + fprintf(stderr, "%s:Invalid parameter(slices:%d).\n", __FUNCTION__, slices); + return -1; + } + + vec3Sub(topOrigin, bottomOrigin, &p); + vec3CrossProduct(&zAxis, &p, &t); + height = vec3Length(&p); + if (height > 0) { + angle = 180 / M_PI * acos(vec3DotProduct(&zAxis, &p) / height); + } + + glPushMatrix(); + + glTranslatef(bottomOrigin->x, bottomOrigin->y, + bottomOrigin->z); + glRotatef(angle, t.x, t.y, t.z); + + // strips + glBegin(GL_TRIANGLE_STRIP); + for (a = 0, lv = 0; lv <= slices; ++lv) { + float cosa = cos(a); + float sina = sin(a); + x = cosa * radius; + y = sina * radius; + z = 0; + glNormal3f(cosa, sina, 0); + glVertex3f(x, y, z); + z = height; + glNormal3f(cosa, sina, 0); + glVertex3f(x, y, z); + a += theta; + } + glEnd(); + + // bottom cap + z = 0; + glBegin(GL_TRIANGLE_FAN); + glNormal3f(0, 0, -1); + glVertex3f(0, 0, z); + for (a = 0, lv = 0; lv <= slices; ++lv) { + x = cos(a) * radius; + y = sin(a) * radius; + glNormal3f(0, 0, -1); + glVertex3f(x, y, z); + a += theta; + } + glEnd(); + + // top cap + z = height; + glBegin(GL_TRIANGLE_FAN); + glNormal3f(0, 0, 1); + glVertex3f(0, 0, z); + for (a = 0, lv = 0; lv <= slices; ++lv) { + x = cos(a) * radius; + y = sin(a) * radius; + glNormal3f(0, 0, 1); + glVertex3f(x, y, z); + a += theta; + } + glEnd(); + + glPopMatrix(); + + return 0; +} + +int drawGrid(float size, float step) { + glDisable(GL_LIGHTING); + + // x z plane + glBegin(GL_LINES); + for (GLfloat i = -size; i <= size; i += step) { + if (0 == i) { + glColor3f(0.0, 0.0, 1.0); + glVertex3f(i, 0, size); glVertex3f(i, 0, -size); + glColor3f(1.0, 0.0, 0.0); + glVertex3f(size, 0, i); glVertex3f(-size, 0, i); + } else { + glColor3f(0.39, 0.39, 0.39); + glVertex3f(i, 0, size); glVertex3f(i, 0, -size); + glVertex3f(size, 0, i); glVertex3f(-size, 0, i); + } + } + glEnd(); + + glEnable(GL_LIGHTING); + return 0; +} diff --git a/src/draw.h b/src/draw.h new file mode 100644 index 00000000..243c1d9d --- /dev/null +++ b/src/draw.h @@ -0,0 +1,27 @@ +#ifndef DRAW_SPHERE_H +#define DRAW_SPHERE_H +#include "vector3d.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + vec3 pt[3]; +} triangle; + +typedef struct { + int npoly; + triangle *poly; +} object; + +int drawSphere(vec3 *origin, float radius, int level); +void drawTriangle(triangle *poly); +int drawCylinder(vec3 *topOrigin, vec3 *bottomOrigin, float radius, int slices); +int drawGrid(float size, float step); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/drawcommon.h b/src/drawcommon.h index befdacc5..38de7647 100644 --- a/src/drawcommon.h +++ b/src/drawcommon.h @@ -1,18 +1,13 @@ #ifndef DRAW_COMMON_H #define DRAW_COMMON_H +#include "vector3d.h" #ifdef __cplusplus extern "C" { #endif typedef struct { - float x; - float y; - float z; -} point; - -typedef struct { - point pt[3]; + vec3 pt[3]; } triangle; typedef struct { @@ -20,8 +15,6 @@ typedef struct { triangle *poly; } object; -void normalize(point *p); -void midpoint(point *a, point *b, point *mid); void drawTriangle(triangle *poly); int drawCylinder(int slices, float radius, float height); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 47d849ad..163a14f4 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -2,29 +2,21 @@ #include #include #include "mainwindow.h" +#include "render.h" -MainWindow::MainWindow(void) -{ - glWidget = new GLWidget; - - resize(QDesktopWidget().availableGeometry(this).size() * 0.7); - +MainWindow::MainWindow(void) { + render = new Render; + resize(QDesktopWidget().availableGeometry(this).size() * 0.7); QHBoxLayout *mainLayout = new QHBoxLayout; - mainLayout->addWidget(glWidget); - setLayout(mainLayout); - - setWindowTitle(tr("DUST3D")); + mainLayout->addWidget(render); + setLayout(mainLayout); + setWindowTitle(tr("Dust3D Experiment")); } -void MainWindow::keyPressEvent(QKeyEvent *e) -{ - if (e->key() == Qt::Key_Escape) - { - close(); - } - else - { - QWidget::keyPressEvent(e); - } +void MainWindow::keyPressEvent(QKeyEvent *e) { + if (e->key() == Qt::Key_Escape) { + close(); + } else { + QWidget::keyPressEvent(e); + } } - diff --git a/src/mainwindow.h b/src/mainwindow.h index dbcb3343..448f7bdb 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -2,20 +2,20 @@ #define MAINWINDOW_H #include -#include "glwidget.h" -class MainWindow : public QWidget -{ +class Render; + +class MainWindow : public QWidget { Q_OBJECT public: MainWindow(void); protected: - void keyPressEvent(QKeyEvent *event); + void keyPressEvent(QKeyEvent *event); private: - GLWidget *glWidget; + Render *render; }; #endif diff --git a/src/matrix.c b/src/matrix.c new file mode 100644 index 00000000..e28a5cad --- /dev/null +++ b/src/matrix.c @@ -0,0 +1,184 @@ +#include "matrix.h" +#include +#include + +#define DEG2RAD (M_PI / 180.0) + +matrix *matrixLoadIdentity(matrix *mat) { + memset(mat->data, 0, sizeof(mat->data)); + mat->data[0] = 1; + mat->data[5] = 1; + mat->data[10] = 1; + mat->data[15] = 1; + return mat; +} + +matrix *matrixTranslate(matrix *mat, float x, float y, float z) { + matrixLoadIdentity(mat); + mat->data[12] = x; + mat->data[13] = y; + mat->data[14] = z; + return mat; +} + +matrix *matrixRotateX(matrix *mat, float degree) { + float c; + float s; + + matrixLoadIdentity(mat); + + if (degree <= 0) { + return mat; + } + + c = cos(degree * DEG2RAD); + s = sin(degree * DEG2RAD); + + mat->data[5] = c; + mat->data[6] = s; + mat->data[9] = -s; + mat->data[10] = c; + + return mat; +} + +matrix *matrixRotateY(matrix *mat, float degree) { + float c; + float s; + + matrixLoadIdentity(mat); + + if (degree <= 0) { + return mat; + } + + c = cos(degree * DEG2RAD); + s = sin(degree * DEG2RAD); + + mat->data[0] = c; + mat->data[2] = -s; + mat->data[8] = s; + mat->data[10] = c; + + return mat; +} + +matrix *matrixRotateZ(matrix *mat, float degree) { + float c; + float s; + + matrixLoadIdentity(mat); + + if (degree <= 0) { + return mat; + } + + c = cos(degree * DEG2RAD); + s = sin(degree * DEG2RAD); + + mat->data[0] = c; + mat->data[1] = s; + mat->data[4] = -s; + mat->data[5] = c; + + return mat; +} + +matrix *matrixScale(matrix *mat, float x, float y, float z) { + matrixLoadIdentity(mat); + mat->data[0] = x; + mat->data[5] = y; + mat->data[10] = z; + return mat; +} + +float *matrixTransformVector(matrix *mat, float *vec) { + float x = (vec[0] * mat->data[0]) + + (vec[1] * mat->data[4]) + (vec[2] * mat->data[8]) + mat->data[12]; + float y = (vec[0] * mat->data[1]) + + (vec[1] * mat->data[5]) + (vec[2] * mat->data[9]) + mat->data[13]; + float z = (vec[0] * mat->data[2]) + + (vec[1] * mat->data[6]) + (vec[2] * mat->data[10]) + mat->data[14]; + vec[0] = x; + vec[1] = y; + vec[2] = z; + return vec; +} + +matrix *matrixAppend(matrix *mat, matrix *matB) { + matrix structMatA; + matrix *matA = &structMatA; + + memcpy(matA, mat, sizeof(matrix)); + + mat->data[0] = matA->data[0] * matB->data[0] + + matA->data[4] * matB->data[1] + + matA->data[8] * matB->data[2] + + matA->data[12] * matB->data[3]; + mat->data[4] = matA->data[0] * matB->data[4] + + matA->data[4] * matB->data[5] + + matA->data[8] * matB->data[6] + + matA->data[12] * matB->data[7]; + mat->data[8] = matA->data[0] * matB->data[8] + + matA->data[4] * matB->data[9] + + matA->data[8] * matB->data[10] + + matA->data[12] * matB->data[11]; + mat->data[12] = matA->data[0] * matB->data[12] + + matA->data[4] * matB->data[13] + + matA->data[8] * matB->data[14] + + matA->data[12] * matB->data[15]; + + mat->data[1] = matA->data[1] * matB->data[0] + + matA->data[5] * matB->data[1] + + matA->data[9] * matB->data[2] + + matA->data[13] * matB->data[3]; + mat->data[5] = matA->data[1] * matB->data[4] + + matA->data[5] * matB->data[5] + + matA->data[9] * matB->data[6] + + matA->data[13] * matB->data[7]; + mat->data[9] = matA->data[1] * matB->data[8] + + matA->data[5] * matB->data[9] + + matA->data[9] * matB->data[10] + + matA->data[13] * matB->data[11]; + mat->data[13] = matA->data[1] * matB->data[12] + + matA->data[5] * matB->data[13] + + matA->data[9] * matB->data[14] + + matA->data[13] * matB->data[15]; + + mat->data[2] = matA->data[2] * matB->data[0] + + matA->data[6] * matB->data[1] + + matA->data[10] * matB->data[2] + + matA->data[14] * matB->data[3]; + mat->data[6] = matA->data[2] * matB->data[4] + + matA->data[6] * matB->data[5] + + matA->data[10] * matB->data[6] + + matA->data[14] * matB->data[7]; + mat->data[10] = matA->data[2] * matB->data[8] + + matA->data[6] * matB->data[9] + + matA->data[10] * matB->data[10] + + matA->data[14] * matB->data[11]; + mat->data[14] = matA->data[2] * matB->data[12] + + matA->data[6] * matB->data[13] + + matA->data[10] * matB->data[14] + + matA->data[14] * matB->data[15]; + + mat->data[3] = matA->data[3] * matB->data[0] + + matA->data[7] * matB->data[1] + + matA->data[11] * matB->data[2] + + matA->data[15] * matB->data[3]; + mat->data[7] = matA->data[3] * matB->data[4] + + matA->data[7] * matB->data[5] + + matA->data[11] * matB->data[6] + + matA->data[15] * matB->data[7]; + mat->data[11] = matA->data[3] * matB->data[8] + + matA->data[7] * matB->data[9] + + matA->data[11] * matB->data[10] + + matA->data[15] * matB->data[11]; + mat->data[15] = matA->data[3] * matB->data[12] + + matA->data[7] * matB->data[13] + + matA->data[11] * matB->data[14] + + matA->data[15] * matB->data[15]; + + return mat; +} + diff --git a/src/matrix.h b/src/matrix.h new file mode 100644 index 00000000..87107f71 --- /dev/null +++ b/src/matrix.h @@ -0,0 +1,19 @@ +#ifndef __MATRIX_H__ +#define __MATRIX_H__ + +// Modified from http://wiki.unity3d.com/index.php?title=Matrix + +typedef struct matrix { + float data[16]; +} matrix; + +matrix *matrixLoadIdentity(matrix *mat); +matrix *matrixTranslate(matrix *mat, float x, float y, float z); +matrix *matrixRotateX(matrix *mat, float degree); +matrix *matrixRotateY(matrix *mat, float degree); +matrix *matrixRotateZ(matrix *mat, float degree); +matrix *matrixScale(matrix *mat, float x, float y, float z); +float *matrixTransformVector(matrix *mat, float *vec); +matrix *matrixAppend(matrix *mat, matrix *matB); + +#endif diff --git a/src/render.cpp b/src/render.cpp new file mode 100644 index 00000000..4293474c --- /dev/null +++ b/src/render.cpp @@ -0,0 +1,160 @@ +#include +#include +#include +#include +#include "render.h" +#include "draw.h" +#include "bmesh.h" +#include "matrix.h" + +static int drawBmeshNode(bmesh *bm, bmeshNode *node) { + float color1[3] = {1, 0, 0}; + glColor3fv(color1); + drawSphere(&node->position, node->radius, 3); + return 0; +} + +static int drawBmeshEdge(bmesh *bm, bmeshEdge *edge) { + float color2[3] = {0, 0, 1}; + glColor3fv(color2); + bmeshNode *firstNode = bmeshGetNode(bm, edge->firstNode); + bmeshNode *secondNode = bmeshGetNode(bm, edge->secondNode); + drawCylinder(&firstNode->position, &secondNode->position, 0.04, 40); + return 0; +} + +Render::Render(QWidget *parent) + : QGLWidget(QGLFormat(QGL::SampleBuffers), parent) { + QTimer *timer = new QTimer(this); + connect(timer, SIGNAL(timeout()), this, SLOT(update())); + timer->start(100); + + mouseX = 0; + mouseY = 0; + cameraAngleX = 50; + cameraAngleY = 70; + cameraDistance = 3; +} + +Render::~Render(void) { +} + +void Render::initializeGL() { + glShadeModel(GL_SMOOTH); + glEnable(GL_CULL_FACE); + glEnable(GL_BLEND); + + qglClearColor(QWidget::palette().color(QWidget::backgroundRole())); + glClearDepth(1.0f); + + GLfloat ambientLight[] = {0.0f, 0.0f, 0.0f, 1.0f}; + GLfloat diffuseLight[] = {0.9f, 0.9f, 0.9f, 1.0f}; + GLfloat specularLight[] = {1, 1, 1, 1}; + glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight); + glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight); + glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight); + + float lightDirection[4] = {0, 0, 1, 0}; + glLightfv(GL_LIGHT0, GL_POSITION, lightDirection); + + glEnable(GL_LIGHT0); + + float shininess = 64.0f; + float specularColor[] = {1.0, 1.0f, 1.0f, 1.0f}; + glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, shininess); // range 0 ~ 128 + glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specularColor); + + glClearStencil(0); + glClearDepth(1.0f); + glDepthFunc(GL_LEQUAL); + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + glEnable(GL_DEPTH_TEST); + glEnable(GL_LIGHTING); + glEnable(GL_CULL_FACE); + + glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); + glEnable(GL_COLOR_MATERIAL); +} + +void Render::paintGL() { + static bmesh *bm = 0; + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glPushMatrix(); + + glTranslatef(0, 0, -cameraDistance); + glRotatef(cameraAngleX, 1, 0, 0); + glRotatef(cameraAngleY, 0, 1, 0); + + drawGrid(10, 1); + + glEnable(GL_LIGHTING); + + if (0 == bm) { + bmeshNode node; + bmeshEdge edge; + bm = bmeshCreate(); + + memset(&node, 0, sizeof(node)); + node.position.x = -1.0; + node.position.y = 0.3; + node.position.z = 1.0; + node.radius = 0.45; + bmeshAddNode(bm, &node); + + memset(&node, 0, sizeof(node)); + node.position.x = -0.5; + node.position.y = 0.2; + node.position.z = 0.5; + node.radius = 0.1; + bmeshAddNode(bm, &node); + + memset(&edge, 0, sizeof(edge)); + edge.firstNode = 1; + edge.secondNode = 0; + bmeshAddEdge(bm, &edge); + } + + { + int index; + for (index = 0; index < bmeshGetNodeNum(bm); ++index) { + bmeshNode *node = bmeshGetNode(bm, index); + drawBmeshNode(bm, node); + } + for (index = 0; index < bmeshGetEdgeNum(bm); ++index) { + bmeshEdge *edge = bmeshGetEdge(bm, index); + drawBmeshEdge(bm, edge); + } + } + + glPopMatrix(); +} + +void Render::resizeGL(int w, int h) { + glViewport(0, 0, (GLsizei)w, (GLsizei)h); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glFrustum(-2, 2, -1.5, 1.5, 1, 1000); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); +} + +void Render::mousePressEvent(QMouseEvent *event) { + mouseX = event->x(); + mouseY = event->y(); +} + +void Render::mouseMoveEvent(QMouseEvent *event) { + cameraAngleY += (event->x() - mouseX); + cameraAngleX += (event->y() - mouseY); + update(); + mouseX = event->x(); + mouseY = event->y(); +} + +void Render::wheelEvent(QWheelEvent * event) { + cameraDistance -= event->delta() * 0.01f; +} diff --git a/src/render.h b/src/render.h new file mode 100644 index 00000000..ff2f9665 --- /dev/null +++ b/src/render.h @@ -0,0 +1,29 @@ +#ifndef RENDER_H +#define RENDER_H + +#include + +class Render : public QGLWidget { + Q_OBJECT + +public: + Render(QWidget *parent = 0); + ~Render(void); + +protected: + void initializeGL(void); + void paintGL(void); + void resizeGL(int width, int height); + void mousePressEvent(QMouseEvent *event); + void mouseMoveEvent(QMouseEvent *event); + void wheelEvent(QWheelEvent * event); + +private: + int mouseX; + int mouseY; + float cameraAngleX; + float cameraAngleY; + float cameraDistance; +}; + +#endif diff --git a/src/vector3d.c b/src/vector3d.c new file mode 100644 index 00000000..1be5570f --- /dev/null +++ b/src/vector3d.c @@ -0,0 +1,40 @@ +#include "vector3d.h" + +float vec3Length(vec3 *p) { + double mag; + mag = p->x * p->x + p->y * p->y + p->z * p->z; + return sqrt(mag); +} + +void vec3Normalize(vec3 *p) { + double mag; + mag = p->x * p->x + p->y * p->y + p->z * p->z; + if (mag != 0.0) { + mag = 1.0 / sqrt(mag); + p->x *= mag; + p->y *= mag; + p->z *= mag; + } +} + +void vec3Midpoint(vec3 *a, vec3 *b, vec3 *mid) { + mid->x = (a->x + b->x) * 0.5; + mid->y = (a->y + b->y) * 0.5; + mid->z = (a->z + b->z) * 0.5; +} + +void vec3Sub(vec3 *a, vec3 *b, vec3 *result) { + result->x = a->x - b->x; + result->y = a->y - b->y; + result->z = a->z - b->z; +} + +void vec3CrossProduct(vec3 *a, vec3 *b, vec3 *result) { + result->x = a->y * b->z - a->z * b->y; + result->y = a->z * b->x - a->x * b->z; + result->z = a->x * b->y - a->y * b->x; +} + +float vec3DotProduct(vec3 *a, vec3 *b) { + return a->x * b->x + a->y * b->y + a->z * b->z; +} diff --git a/src/vector3d.h b/src/vector3d.h new file mode 100644 index 00000000..67f8d5c3 --- /dev/null +++ b/src/vector3d.h @@ -0,0 +1,25 @@ +#ifndef VECTOR_3D_H +#define VECTOR_3D_H + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + float x; + float y; + float z; +} vec3; + +void vec3Normalize(vec3 *p); +void vec3Midpoint(vec3 *a, vec3 *b, vec3 *mid); +void vec3CrossProduct(vec3 *a, vec3 *b, vec3 *result); +void vec3Sub(vec3 *a, vec3 *b, vec3 *result); +float vec3DotProduct(vec3 *a, vec3 *b); +float vec3Length(vec3 *p); + +#ifdef __cplusplus +} +#endif + +#endif