git.ucc.asn.au
/
atyndall
/
cits2231.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
(no commit message)
[atyndall/cits2231.git]
/
scene.c
diff --git
a/scene.c
b/scene.c
index
b1c4e88
..
ee4f614
100644
(file)
--- a/
scene.c
+++ b/
scene.c
@@
-1,6
+1,6
@@
/**
\r
* CITS2231 Graphics Scene Editor
\r
/**
\r
* CITS2231 Graphics Scene Editor
\r
- * @author Ashley Tyndall (20915779)
\r
+ * @author Ashley Tyndall (20915779)
, Jenna de la Harpe (20367932)
\r
*/
\r
\r
#include <stdlib.h>
\r
*/
\r
\r
#include <stdlib.h>
\r
@@
-110,8
+110,8
@@
void processLightEvents(int id) {
* @param id ID of object selected
\r
*/
\r
void processObjectEvents(int id) {
\r
* @param id ID of object selected
\r
*/
\r
void processObjectEvents(int id) {
\r
- // **NOTE: For the testing phase, only have the teapot
\r
addSceneObject(id);
\r
addSceneObject(id);
\r
+ manipulateState = STATE_OBJECT_POSITION_SCALE;
\r
glutPostRedisplay();
\r
}
\r
\r
glutPostRedisplay();
\r
}
\r
\r
@@
-120,7
+120,10
@@
void processObjectEvents(int id) {
* @param id ID of texutre selected
\r
*/
\r
void processTextureEvents(int id) {
\r
* @param id ID of texutre selected
\r
*/
\r
void processTextureEvents(int id) {
\r
-
\r
+ if ( curObject >= 0 ) {
\r
+ sceneObjs[curObject].texture.id = id;
\r
+ glutPostRedisplay();
\r
+ }
\r
}
\r
\r
/**
\r
}
\r
\r
/**
\r
@@
-168,7
+171,7
@@
void makeMenu() {
glutAddMenuEntry("Position/Scale", M_POSITION_SCALE);
\r
glutAddMenuEntry("Rotation/Texture Scale", M_ROTATION_TEXTURE_SCALE);
\r
//glutAddSubMenu("Material", materialMenu);
\r
glutAddMenuEntry("Position/Scale", M_POSITION_SCALE);
\r
glutAddMenuEntry("Rotation/Texture Scale", M_ROTATION_TEXTURE_SCALE);
\r
//glutAddSubMenu("Material", materialMenu);
\r
-
//
glutAddSubMenu("Texture", textureMenu);
\r
+ glutAddSubMenu("Texture", textureMenu);
\r
glutAddSubMenu("Ground texture", gTextureMenu);
\r
//glutAddSubMenu("Lights", lightMenu);
\r
glutAddMenuEntry("Exit", M_EXIT);
\r
glutAddSubMenu("Ground texture", gTextureMenu);
\r
//glutAddSubMenu("Lights", lightMenu);
\r
glutAddMenuEntry("Exit", M_EXIT);
\r
@@
-196,6
+199,9
@@
void windowReshape(int w, int h) {
* @param y Mouse y position
\r
*/
\r
void mouse(int button, int state, int x, int y) {
\r
* @param y Mouse y position
\r
*/
\r
void mouse(int button, int state, int x, int y) {
\r
+ if ( button == GLUT_LEFT_BUTTON && glutGetModifiers() == GLUT_ACTIVE_SHIFT ) {
\r
+ button = GLUT_MIDDLE_BUTTON; // Holding shift with left button is the same as the middle button
\r
+ }
\r
switch(button) {
\r
case GLUT_LEFT_BUTTON:
\r
case GLUT_MIDDLE_BUTTON:
\r
switch(button) {
\r
case GLUT_LEFT_BUTTON:
\r
case GLUT_MIDDLE_BUTTON:
\r
@@
-278,44
+284,77
@@
void keyboard(unsigned char key, int x, int y) {
void motion(int x, int y) {
\r
if ( buttonSelected == -1 ) return; // No button selected, no action
\r
\r
void motion(int x, int y) {
\r
if ( buttonSelected == -1 ) return; // No button selected, no action
\r
\r
+ float diffx = x - startx;
\r
+ float diffy = y - starty;
\r
+
\r
switch ( manipulateState ) {
\r
case STATE_CAMERA_ROTATE_MOVE:
\r
switch ( manipulateState ) {
\r
case STATE_CAMERA_ROTATE_MOVE:
\r
- rotate += (x - startx);
\r
+ // w: rotate
\r
+ rotate += diffx;
\r
\r
if ( buttonSelected == GLUT_LEFT_BUTTON ) {
\r
\r
if ( buttonSelected == GLUT_LEFT_BUTTON ) {
\r
- //
w: rotate,
h: zoom
\r
- zoom +=
(y - starty)
;
\r
+ // h: zoom
\r
+ zoom +=
diffy
;
\r
} else if ( buttonSelected == GLUT_MIDDLE_BUTTON ) {
\r
} else if ( buttonSelected == GLUT_MIDDLE_BUTTON ) {
\r
- //
w: rotate,
h: tilt
\r
- camAngle +=
(y - starty)
;
\r
+ // h: tilt
\r
+ camAngle +=
diffy
;
\r
}
\r
}
\r
-
\r
- starty = y;
\r
- startx = x;
\r
-
\r
break;
\r
\r
case STATE_OBJECT_POSITION_SCALE:
\r
break;
\r
\r
case STATE_OBJECT_POSITION_SCALE:
\r
- //SceneObject co = sceneObjs[curObject];
\r
\r
if ( buttonSelected == GLUT_LEFT_BUTTON ) {
\r
// w: left/right, h: near/far
\r
\r
if ( buttonSelected == GLUT_LEFT_BUTTON ) {
\r
// w: left/right, h: near/far
\r
-
\r
+
\r
+ // **NOTE: Currently a work in progress, does not work correctly
\r
+ float angler = 2 * M_PI * ( (90 - rotate*camRotateFactor)/360.0 );
\r
+ printf("cam angle: %f\n", rotate*camRotateFactor);
\r
+ // float arc = arctan()
\r
+ sceneObjs[curObject].x += diffx * cos(angler) * 0.3;
\r
+ sceneObjs[curObject].z += diffx * sin(angler) * 0.3;
\r
+
\r
} else if ( buttonSelected == GLUT_MIDDLE_BUTTON ) {
\r
} else if ( buttonSelected == GLUT_MIDDLE_BUTTON ) {
\r
- // w: big/small, h: up/down
\r
+ // w: big/small
\r
+ float max = (float)height/bigsmallFactor;
\r
+ float scaling = (diffx + max) / max;
\r
+
\r
+ sceneObjs[curObject].scale[0] *= scaling;
\r
+ sceneObjs[curObject].scale[1] *= scaling;
\r
+ sceneObjs[curObject].scale[2] *= scaling;
\r
+
\r
+ // h: up/down
\r
+ sceneObjs[curObject].y -= diffy * updownFactor;
\r
}
\r
}
\r
+
\r
break;
\r
\r
case STATE_OBJECT_ROTATION_TEXTURE_SCALE:
\r
break;
\r
\r
case STATE_OBJECT_ROTATION_TEXTURE_SCALE:
\r
+
\r
if ( buttonSelected == GLUT_LEFT_BUTTON ) {
\r
if ( buttonSelected == GLUT_LEFT_BUTTON ) {
\r
- // w: rotate on width, h: rotate on h
\r
+ // w: rotate on y
\r
+ sceneObjs[curObject].rotation.y += diffx * rotateFactor;
\r
+
\r
+ // h: rotate on x
\r
+ sceneObjs[curObject].rotation.x += diffy * rotateFactor;
\r
+
\r
} else if ( buttonSelected == GLUT_MIDDLE_BUTTON ) {
\r
} else if ( buttonSelected == GLUT_MIDDLE_BUTTON ) {
\r
- // w & h, rotate on h
\r
+ // w: rotate on x
\r
+ sceneObjs[curObject].rotation.x += diffx * rotateFactor;
\r
+
\r
+ // h: texture scale
\r
+ float max = (float)height/texscaleFactor;
\r
+ float scaling = (diffy + max) / max;
\r
+ sceneObjs[curObject].texture.scale *= scaling;
\r
+
\r
}
\r
}
\r
+
\r
break;
\r
\r
}
\r
\r
break;
\r
\r
}
\r
\r
+ starty = y;
\r
+ startx = x;
\r
+
\r
glutPostRedisplay();
\r
}
\r
\r
glutPostRedisplay();
\r
}
\r
\r
@@
-352,7
+391,7
@@
void display() {
0.0, 10.0, 0.0 /* up is in postivie Y direction */
\r
);
\r
\r
0.0, 10.0, 0.0 /* up is in postivie Y direction */
\r
);
\r
\r
- glRotatef(camAngle*camAngleFactor, 1.0, 0.0, 0.0);
\r
+ glRotatef(camAngle*camAngleFactor, 1.0, 0.0, 0.0);
// Set camera angle upward
\r
\r
/* Reposition the light source 0. */
\r
lightPosition0[0] = 12*cos(lightAngle0);
\r
\r
/* Reposition the light source 0. */
\r
lightPosition0[0] = 12*cos(lightAngle0);
\r
@@
-375,7
+414,7
@@
void display() {
glPushMatrix();
\r
\r
/* Perform scene rotations based on user mouse/keyboard input. */
\r
glPushMatrix();
\r
\r
/* Perform scene rotations based on user mouse/keyboard input. */
\r
- glRotatef(rotate*
r
otateFactor, 0.0, 1.0, 0.0);
\r
+ glRotatef(rotate*
camR
otateFactor, 0.0, 1.0, 0.0);
\r
glTranslatef(camx, camy, camz);
\r
glRotatef(keyrot, 1.0, 0.0, 0.0);
\r
\r
glTranslatef(camx, camy, camz);
\r
glRotatef(keyrot, 1.0, 0.0, 0.0);
\r
\r
@@
-389,19
+428,24
@@
void display() {
glPushMatrix();
\r
SceneObject so = sceneObjs[i];
\r
\r
glPushMatrix();
\r
SceneObject so = sceneObjs[i];
\r
\r
- // Apply
rot
ation vector
\r
-
//glRotatef(so.rotation.amount, so.rotation.vector[0], so.rotation.vector[1], so.rotation.vector[2]
);
\r
+ // Apply
transl
ation vector
\r
+
glTranslatef(so.x, so.y, so.z
);
\r
\r
\r
- // Apply scaling vector
\r
- glScalef(1, 1, 1);
\r
+ // Apply independant rotation vectors
\r
+ glRotatef(so.rotation.x, 1.0, 0.0, 0.0);
\r
+ glRotatef(so.rotation.y, 0.0, 1.0, 0.0);
\r
+ glRotatef(so.rotation.z, 0.0, 0.0, 1.0);
\r
\r
\r
- // Apply
translation
vector
\r
-
//glTranslatef(so.x, so.y, so.z
);
\r
+ // Apply
scaling
vector
\r
+
glScalef(so.scale[0], so.scale[1], so.scale[2]
);
\r
\r
// Apply texture
\r
\r
// Apply texture
\r
- if ( so.texture > 0 ) {
\r
- getTexture(so.texture);
\r
- glBindTexture(GL_TEXTURE_2D, so.texture);
\r
+ if ( so.texture.id > 0 ) {
\r
+ getTexture(so.texture.id);
\r
+ glBindTexture(GL_TEXTURE_2D, so.texture.id);
\r
+ glMatrixMode(GL_TEXTURE);
\r
+ glScalef(so.texture.scale, so.texture.scale, so.texture.scale);
\r
+ glMatrixMode(GL_MODELVIEW);
\r
} else {
\r
glBindTexture(GL_TEXTURE_2D, 0);
\r
}
\r
} else {
\r
glBindTexture(GL_TEXTURE_2D, 0);
\r
}
\r
@@
-419,26
+463,23
@@
void display() {
glBindTexture(GL_TEXTURE_2D, 0);
\r
glPopMatrix();
\r
}
\r
glBindTexture(GL_TEXTURE_2D, 0);
\r
glPopMatrix();
\r
}
\r
-
\r
\r
\r
- // Draw a white ball over the light source
\r
+ // Draw a white ball over the light sources
\r
+ glDisable(GL_LIGHTING);
\r
+ glColor3f(1.0, 1.0, 1.0);
\r
+
\r
glPushMatrix();
\r
glPushMatrix();
\r
- glDisable(GL_LIGHTING);
\r
- glColor3f(1.0, 1.0, 1.0);
\r
glTranslatef(lightPosition0[0], lightPosition0[1], lightPosition0[2]);
\r
glutSolidSphere(0.5, 50, 50);
\r
glTranslatef(lightPosition0[0], lightPosition0[1], lightPosition0[2]);
\r
glutSolidSphere(0.5, 50, 50);
\r
- glEnable(GL_LIGHTING);
\r
glPopMatrix();
\r
\r
glPopMatrix();
\r
\r
- // Draw a white ball over the light source
\r
glPushMatrix();
\r
glPushMatrix();
\r
- glDisable(GL_LIGHTING);
\r
- glColor3f(1.0, 1.0, 1.0);
\r
glTranslatef(lightPosition1[0], lightPosition1[1], lightPosition1[2]);
\r
glutSolidSphere(0.5, 50, 50);
\r
glTranslatef(lightPosition1[0], lightPosition1[1], lightPosition1[2]);
\r
glutSolidSphere(0.5, 50, 50);
\r
- glEnable(GL_LIGHTING);
\r
glPopMatrix();
\r
\r
glPopMatrix();
\r
\r
+ glEnable(GL_LIGHTING);
\r
+
\r
drawAxisLines();
\r
\r
glPopMatrix();
\r
drawAxisLines();
\r
\r
glPopMatrix();
\r
@@
-490,8
+531,8
@@
int main(int argc, char **argv) {
\r
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
\r
\r
\r
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
\r
\r
- glutInitWindowSize(
500, 500
);
\r
- glutCreateWindow("Scene Editor");
\r
+ glutInitWindowSize(
width, height
);
\r
+ glutCreateWindow("Scene Editor
- Ashley Tyndall (20915779), Jenna de la Harpe (20367932)
");
\r
\r
glShadeModel(GL_SMOOTH); // Enables Smooth Shading
\r
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // Black Background
\r
\r
glShadeModel(GL_SMOOTH); // Enables Smooth Shading
\r
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // Black Background
\r
UCC
git Repository :: git.ucc.asn.au