From 4bd4e5e357a2c5ad6424c274ba46909b74b7b4b2 Mon Sep 17 00:00:00 2001 From: dipsywong98 Date: Tue, 19 Mar 2019 21:17:34 +0800 Subject: [PATCH] dynamic amount of arms --- MyModel.cpp | 4 +- camera.h | 197 +++++++------- main.cpp | 20 +- modelerglobals.h | 4 +- modelerui.cxx | 688 +++++++++++++++++++++++------------------------ readme.md | 2 + 6 files changed, 461 insertions(+), 454 deletions(-) diff --git a/MyModel.cpp b/MyModel.cpp index ad07e4e..4a6fff8 100644 --- a/MyModel.cpp +++ b/MyModel.cpp @@ -168,7 +168,7 @@ void MyModel::draw() drawSphere(0.5); glPopMatrix(); - std::vector angles{ 0,0,0,0,0,0 }; + std::vector angles(2*(int)VAL(ARMCNT)); IkSolver ik; ik.baseHeight = VAL(HEIGHT); ik.minangle = VAL(IKMIN); @@ -210,7 +210,7 @@ void MyModel::draw() { glPushMatrix(); glTranslated(0, VAL(HEIGHT), 0); - drawArm(3); + drawArm((int)VAL(ARMCNT)); glPopMatrix(); } } diff --git a/camera.h b/camera.h index 13821ea..8d96cfb 100644 --- a/camera.h +++ b/camera.h @@ -1,99 +1,100 @@ -// This camera stuff mostly by ehsu - -#ifndef CAMERA_H -#define CAMERA_H - -#include "vec.h" -#include "mat.h" - -//==========[ class Camera ]=================================================== - -typedef enum { kActionNone, kActionTranslate, kActionRotate, kActionZoom, kActionTwist,} MouseAction_t; - -class Camera { - -protected: - - float mElevation; - float mAzimuth; - float mDolly; - float mTwist; // Not implemented yet - - Vec3f mLookAt; - - Vec3f mPosition; - Vec3f mUpVector; - bool mDirtyTransform; - - void calculateViewingTransformParameters(); - - Vec3f mLastMousePosition; - MouseAction_t mCurrentMouseAction; - int lastScroll; - - -public: - - //---[ Constructors ]---------------------------------- - - // defaults to (0,0,0) facing down negative z axis - Camera(); - - //---[ Settings ]-------------------------------------- - - inline void setElevation( float elevation ) - { - // don't want elevation to be negative - if (elevation<0) elevation+=6.28318530717f; - mElevation = elevation; mDirtyTransform = true; - } - inline float getElevation() const - { return mElevation; } - - inline void setAzimuth( float azimuth ) - { mAzimuth = azimuth; mDirtyTransform = true; } - inline float getAzimuth() const - { return mAzimuth; } - - inline void setDolly( float dolly ) - { mDolly = dolly; mDirtyTransform = true; } - inline float getDolly() const - { return mDolly; } - - inline void setTwist( float twist ) - { mTwist = twist; mDirtyTransform = true; } - inline float getTwist() const - { return mTwist; } - - inline void setLookAt( const Vec3f &lookAt ) - { mLookAt = lookAt; mDirtyTransform = true;} - inline Vec3f getLookAt() const - { return mLookAt; } - - inline void frameAll() - { - mElevation = 6.7054; - mAzimuth = 2.7193; - mDolly = -30; - mLookAt = Vec3(0.5, 2, -0.5); - mPosition = Vec3(-9.5, 15, 21.5); - mDirtyTransform = true; - } - - //---[ Interactive Adjustment ]------------------------ - // these should be used from a mouse event handling routine that calls - // the startX method on a mouse down, updateX on mouse move and finally - // endX on mouse up. - //----------------------------------------------------- - void clickMouse( MouseAction_t action, int x, int y ); - void dragMouse( int x, int y ); - void releaseMouse( int x, int y ); - - //---[ Viewing Transform ]-------------------------------- - void applyViewingTransform(); - - // gluLookAt equivalent - void lookAt(Vec3f eye, Vec3f at, Vec3f up); -}; - +// This camera stuff mostly by ehsu + +#ifndef CAMERA_H +#define CAMERA_H + +#include "modelerglobals.h" +#include "vec.h" +#include "mat.h" + +//==========[ class Camera ]=================================================== + +typedef enum { kActionNone, kActionTranslate, kActionRotate, kActionZoom, kActionTwist,} MouseAction_t; + +class Camera { + +protected: + + float mElevation; + float mAzimuth; + float mDolly; + float mTwist; // Not implemented yet + + Vec3f mLookAt; + + Vec3f mPosition; + Vec3f mUpVector; + bool mDirtyTransform; + + void calculateViewingTransformParameters(); + + Vec3f mLastMousePosition; + MouseAction_t mCurrentMouseAction; + int lastScroll; + + +public: + + //---[ Constructors ]---------------------------------- + + // defaults to (0,0,0) facing down negative z axis + Camera(); + + //---[ Settings ]-------------------------------------- + + inline void setElevation( float elevation ) + { + // don't want elevation to be negative + if (elevation<0) elevation+=6.28318530717f; + mElevation = elevation; mDirtyTransform = true; + } + inline float getElevation() const + { return mElevation; } + + inline void setAzimuth( float azimuth ) + { mAzimuth = azimuth; mDirtyTransform = true; } + inline float getAzimuth() const + { return mAzimuth; } + + inline void setDolly( float dolly ) + { mDolly = dolly; mDirtyTransform = true; } + inline float getDolly() const + { return mDolly; } + + inline void setTwist( float twist ) + { mTwist = twist; mDirtyTransform = true; } + inline float getTwist() const + { return mTwist; } + + inline void setLookAt( const Vec3f &lookAt ) + { mLookAt = lookAt; mDirtyTransform = true;} + inline Vec3f getLookAt() const + { return mLookAt; } + + inline void frameAll(double e) + { + mElevation = 6.7054; + mAzimuth = 2.7193; + mDolly = -10*e; + mLookAt = Vec3(0.5, 2, -0.5); + mPosition = Vec3(-3.5, 5, 7.5); + mDirtyTransform = true; + } + + //---[ Interactive Adjustment ]------------------------ + // these should be used from a mouse event handling routine that calls + // the startX method on a mouse down, updateX on mouse move and finally + // endX on mouse up. + //----------------------------------------------------- + void clickMouse( MouseAction_t action, int x, int y ); + void dragMouse( int x, int y ); + void releaseMouse( int x, int y ); + + //---[ Viewing Transform ]-------------------------------- + void applyViewingTransform(); + + // gluLookAt equivalent + void lookAt(Vec3f eye, Vec3f at, Vec3f up); +}; + #endif \ No newline at end of file diff --git a/main.cpp b/main.cpp index f2c82ca..dab8d0b 100644 --- a/main.cpp +++ b/main.cpp @@ -41,12 +41,14 @@ int main() controls[ZPOS] = ModelerControl("Z Position", -5, 5, 0.1f, 0); controls[HEIGHT] = ModelerControl("Height", 1, 2.5, 0.1f, 1); controls[ROTATE] = ModelerControl("Rotate", -135, 135, 1, 0); - controls[ARM1V] = ModelerControl("Arm1 Vertical Axis Rotation", -180, 180, 1, 0); - controls[ARM1H] = ModelerControl("Arm1 Horizontal Axis Rotation", -90, 90, 1, 0); - controls[ARM2V] = ModelerControl("Arm2 Vertical Axis Rotation", -180, 180, 1, 0); - controls[ARM2H] = ModelerControl("Arm2 Horizontal Axis Rotation", -90, 90, 1, 0); - controls[ARM3V] = ModelerControl("Arm3 Vertical Axis Rotation", -180, 180, 1, 0); - controls[ARM3H] = ModelerControl("Arm3 Horizontal Axis Rotation", -90, 90, 1, 0); + controls[ARMCNT] = ModelerControl("Arm Amount", 3, 6, 1, 3); + char namebuf[20]; + for (int i = 0; i < ARMMAXCNT; i++) { + sprintf(namebuf, "Arm %d Vertical Axis Rotation", i); + controls[ARM1V+2*i] = ModelerControl(namebuf, -180, 180, 1, 0); + sprintf(namebuf, "Arm %d Horizontal Axis Rotation", i); + controls[ARM1H+2*i] = ModelerControl(namebuf, -90, 90, 1, 0); + } controls[CLAMPWIDTH] = ModelerControl("Clamp Width", 0, 1, 0.01, 0); controls[LIGHTX] = ModelerControl("Light X", -30, 30, 0.1, -20); controls[LIGHTY] = ModelerControl("Light Y", -30, 30, 0.1, 12); @@ -65,9 +67,9 @@ int main() controls[BALLJOINTS] = ModelerControl("Ball joints", 0, 1,1, 1); controls[BOXARMS] = ModelerControl("Box Arms", 0, 1,1, 0); controls[IKENABLE] = ModelerControl("IK: enable", 0, 1,1, 0); - controls[IKX] = ModelerControl("IK: X", -10, 10,0.01, 3); - controls[IKY] = ModelerControl("IK: Y", -10, 10,0.01, 3); - controls[IKZ] = ModelerControl("IK: Z", -10, 10,0.01, 3); + controls[IKX] = ModelerControl("IK: X", -20, 20,0.01, 3); + controls[IKY] = ModelerControl("IK: Y", -20, 20,0.01, 3); + controls[IKZ] = ModelerControl("IK: Z", -20, 20,0.01, 3); controls[IKMIN] = ModelerControl("IK: Min", -180, 180,1, -90); controls[IKMAX] = ModelerControl("IK: Max", -180, 180,1, 90); controls[SHOWPRISM] = ModelerControl("Show Prism", 0, 1, 1, 0); diff --git a/modelerglobals.h b/modelerglobals.h index 1a0350e..6660c8c 100644 --- a/modelerglobals.h +++ b/modelerglobals.h @@ -14,7 +14,8 @@ enum SampleModelControls { XPOS, YPOS, ZPOS, HEIGHT, ROTATE, - ARM1V, ARM1H, ARM2V, ARM2H, ARM3V, ARM3H, CLAMPWIDTH, + ARM1V, ARM1H, ARM2V, ARM2H, ARM3V, ARM3H, ARM4V, ARM4H, ARM5V, ARM5H, ARM6V, ARM6H, + CLAMPWIDTH, ARMCNT, LIGHTX, LIGHTY, LIGHTZ, LIGHT_3_PT, LEVELDETAILS, ENABLEANIM, CYCLINGMOOD, LDISP, LDEPTH, LANGLE, LLEN, LTHICKNESS, LDECAYTHICKNESS, LDECAYLENGTH, @@ -27,6 +28,7 @@ enum SampleModelControls #define COLOR_RED 1.0f, 0.0f, 0.0f #define COLOR_GREEN 0.0f, 1.0f, 0.0f #define COLOR_BLUE 0.0f, 0.0f, 1.0f +#define ARMMAXCNT 6 // We'll be getting the instance of the application a lot; // might as well have it as a macro. diff --git a/modelerui.cxx b/modelerui.cxx index f071004..82ef57b 100644 --- a/modelerui.cxx +++ b/modelerui.cxx @@ -1,344 +1,344 @@ -// generated by Fast Light User Interface Designer (fluid) version 1.00 -#pragma warning( disable : 4786 ) - -#include "modelerui.h" -#include "modelerapp.h" - -#include "camera.h" - -#if _MSC_VER >= 1300 - -#include - -#else // _MSC_VER >= 1300 - -#include - -#endif // _MSC_VER >= 1300 - -#include -#include -using namespace std; - -inline void ModelerUserInterface::cb_m_controlsWindow_i(Fl_Window*, void*) { - 0;; -} -void ModelerUserInterface::cb_m_controlsWindow(Fl_Window* o, void* v) { - ((ModelerUserInterface*)(o->user_data()))->cb_m_controlsWindow_i(o,v); -} - -inline void ModelerUserInterface::cb_Save_i(Fl_Menu_*, void*) { - char *filename = NULL; -filename = fl_file_chooser("Save RAY File", "*.ray", NULL); -if (filename) -{ - if (openRayFile(filename) == false) - fl_alert("Error opening file."); - else - { - m_modelerView->draw(); - closeRayFile(); - } -}; -} -void ModelerUserInterface::cb_Save(Fl_Menu_* o, void* v) { - ((ModelerUserInterface*)(o->parent()->user_data()))->cb_Save_i(o,v); -} - -inline void ModelerUserInterface::cb_Save1_i(Fl_Menu_*, void*) { - char *filename = NULL; -filename = fl_file_chooser("Save BMP File", "*.bmp", NULL); -if (filename) -{ - int x = m_modelerView->x(); - int y = m_modelerView->y(); - int w = m_modelerView->w(); - int h = m_modelerView->h(); - - m_modelerWindow->show(); -// do {Sleep(10); } -// while (!m_modelerWindow->shown()); -// m_modelerView->draw(); - m_modelerView->make_current(); -m_modelerView->draw(); - - - unsigned char *imageBuffer = new unsigned char[3*w*h]; - - // Tell openGL to read from the front buffer when capturing - // out paint strokes - glReadBuffer(GL_BACK); - - glPixelStorei( GL_PACK_ALIGNMENT, 1 ); - glPixelStorei( GL_PACK_ROW_LENGTH, w ); - - glReadPixels( 0, 0, w, h, - GL_RGB, GL_UNSIGNED_BYTE, - imageBuffer ); - - - writeBMP(filename, w,h, imageBuffer); - - delete [] imageBuffer; -}; -} -void ModelerUserInterface::cb_Save1(Fl_Menu_* o, void* v) { - ((ModelerUserInterface*)(o->parent()->user_data()))->cb_Save1_i(o,v); -} - -// IANLI -// Implementation callback for saving the positions of the model into a file -// The first line of the file contains the values for the position/orientation of -// the camera. The values are ordered as the following: -// elevation azimuth dolly twist lookAtX lookAtY lookAtZ -// The lines after correspond to the values of the controls. The following lines -// have this format: -// controlNumber controlValue -inline void ModelerUserInterface::cb_SavePos_i(Fl_Menu_*, void*) { - char *filename = NULL; - filename = fl_file_chooser("Save .pos File", "*.pos", NULL); - - if (filename) - { - FILE* m_posFile = fopen(filename, "w"); - - float elevation, azimuth, dolly, twist; - Vec3f lookAt; - elevation = m_modelerView->m_camera->getElevation(); - dolly = m_modelerView->m_camera->getDolly(); - azimuth = m_modelerView->m_camera->getAzimuth(); - twist = m_modelerView->m_camera->getTwist(); - lookAt = m_modelerView->m_camera->getLookAt(); - - fprintf(m_posFile, "%f %f %f %f %f %f %f\n", elevation, azimuth, dolly, twist, lookAt[0], lookAt[1], lookAt[2]); - - double value; - for(int i = 0; i < NUMCONTROLS; i++) - { - value = ModelerApplication::Instance()->GetControlValue(i); - - fprintf(m_posFile, "%d %f\n", i, value); - } - - fclose(m_posFile); - }; -} -void ModelerUserInterface::cb_SavePos(Fl_Menu_* o, void* v) { - ((ModelerUserInterface*)(o->parent()->user_data()))->cb_SavePos_i(o,v); -} - -inline void ModelerUserInterface::cb_OpenPos_i(Fl_Menu_*, void*) { - char *filename = NULL; - filename = fl_file_chooser("Open .pos File", "*.pos", NULL); - - if (filename) - { - ifstream ifs( filename ); - if( !ifs ) { - cerr << "Error: couldn't read position file " << filename << endl; - return; - } - - float elevation, azimuth, dolly, twist, x, y, z; - ifs >> elevation >> azimuth >> dolly >> twist >> x >> y >> z; - - m_modelerView->m_camera->setElevation( elevation); - m_modelerView->m_camera->setAzimuth( azimuth ); - m_modelerView->m_camera->setDolly( dolly ); - m_modelerView->m_camera->setTwist( twist ); - m_modelerView->m_camera->setLookAt( Vec3f(x, y, z) ); - - int controlNum; - float value; - while( ifs >> controlNum >> value ) - { - if( controlNum >= NUMCONTROLS ) { - break; - } - - ModelerApplication::Instance()->SetControlValue(controlNum, value); - } - - m_modelerView->redraw(); - }; -} -void ModelerUserInterface::cb_OpenPos(Fl_Menu_* o, void* v) { - ((ModelerUserInterface*)(o->parent()->user_data()))->cb_OpenPos_i(o,v); -} - -inline void ModelerUserInterface::cb_Exit_i(Fl_Menu_*, void*) { - m_controlsWindow->hide(); -m_modelerWindow->hide(); -} -void ModelerUserInterface::cb_Exit(Fl_Menu_* o, void* v) { - ((ModelerUserInterface*)(o->parent()->user_data()))->cb_Exit_i(o,v); -} - -inline void ModelerUserInterface::cb_Normal_i(Fl_Menu_*, void*) { - setDrawMode(NORMAL); -m_modelerView->redraw(); -} -void ModelerUserInterface::cb_Normal(Fl_Menu_* o, void* v) { - ((ModelerUserInterface*)(o->parent()->user_data()))->cb_Normal_i(o,v); -} - -inline void ModelerUserInterface::cb_Flat_i(Fl_Menu_*, void*) { - setDrawMode(FLATSHADE); -m_modelerView->redraw(); -} -void ModelerUserInterface::cb_Flat(Fl_Menu_* o, void* v) { - ((ModelerUserInterface*)(o->parent()->user_data()))->cb_Flat_i(o,v); -} - -inline void ModelerUserInterface::cb_Wireframe_i(Fl_Menu_*, void*) { - setDrawMode(WIREFRAME); -m_modelerView->redraw(); -} -void ModelerUserInterface::cb_Wireframe(Fl_Menu_* o, void* v) { - ((ModelerUserInterface*)(o->parent()->user_data()))->cb_Wireframe_i(o,v); -} - -inline void ModelerUserInterface::cb_High_i(Fl_Menu_*, void*) { - setQuality(HIGH); -m_modelerView->redraw(); -} -void ModelerUserInterface::cb_High(Fl_Menu_* o, void* v) { - ((ModelerUserInterface*)(o->parent()->user_data()))->cb_High_i(o,v); -} - -inline void ModelerUserInterface::cb_Medium_i(Fl_Menu_*, void*) { - setQuality(MEDIUM); -m_modelerView->redraw(); -} -void ModelerUserInterface::cb_Medium(Fl_Menu_* o, void* v) { - ((ModelerUserInterface*)(o->parent()->user_data()))->cb_Medium_i(o,v); -} - -inline void ModelerUserInterface::cb_Low_i(Fl_Menu_*, void*) { - setQuality(LOW); -m_modelerView->redraw(); -} -void ModelerUserInterface::cb_Low(Fl_Menu_* o, void* v) { - ((ModelerUserInterface*)(o->parent()->user_data()))->cb_Low_i(o,v); -} - -inline void ModelerUserInterface::cb_Poor_i(Fl_Menu_*, void*) { - setQuality(POOR); -m_modelerView->redraw(); -} -void ModelerUserInterface::cb_Poor(Fl_Menu_* o, void* v) { - ((ModelerUserInterface*)(o->parent()->user_data()))->cb_Poor_i(o,v); -} - -// Callback function to look at origin again. -inline void ModelerUserInterface::cb_Focus_i(Fl_Menu_*, void*) { - m_modelerView->m_camera->setLookAt( Vec3f(0, 0, 0) ); - m_modelerView->redraw(); -} -void ModelerUserInterface::cb_Focus(Fl_Menu_* o, void* v) { - ((ModelerUserInterface*)(o->parent()->user_data()))->cb_Focus_i(o,v); -} - -// Callback function to look at origin again. -inline void ModelerUserInterface::cb_FrameAll_i(Fl_Menu_*, void*) { - m_modelerView->m_camera->frameAll(); - m_modelerView->redraw(); -} -void ModelerUserInterface::cb_FrameAll(Fl_Menu_* o, void* v) { - ((ModelerUserInterface*)(o->parent()->user_data()))->cb_FrameAll_i(o,v); -} - -inline void ModelerUserInterface::cb_m_controlsAnimOnMenu_i(Fl_Menu_*, void*) { - ModelerApplication::Instance()->m_animating = (m_controlsAnimOnMenu->value() == 0) ? false : true; -} -void ModelerUserInterface::cb_m_controlsAnimOnMenu(Fl_Menu_* o, void* v) { - ((ModelerUserInterface*)(o->parent()->user_data()))->cb_m_controlsAnimOnMenu_i(o,v); -} - -Fl_Menu_Item ModelerUserInterface::menu_m_controlsMenuBar[] = { - {"File", 0, 0, 0, 64, 0, 0, 14, 0}, - {"Save Raytracer File", 0, (Fl_Callback*)ModelerUserInterface::cb_Save, 0, 0, 0, 0, 14, 0}, - {"Save Bitmap File", 0, (Fl_Callback*)ModelerUserInterface::cb_Save1, 0, 128, 0, 0, 14, 0}, - {"Open Position File", 0, (Fl_Callback*)ModelerUserInterface::cb_OpenPos, 0, 0, 0, 0, 14, 0}, - {"Save Position File", 0, (Fl_Callback*)ModelerUserInterface::cb_SavePos, 0, 128, 0, 0, 14, 0}, - {"Exit", 0, (Fl_Callback*)ModelerUserInterface::cb_Exit, 0, 0, 0, 0, 14, 0}, - {0}, - {"View", 0, 0, 0, 64, 0, 0, 14, 0}, - {"Normal", 0, (Fl_Callback*)ModelerUserInterface::cb_Normal, 0, 12, 0, 0, 14, 0}, - {"Flat Shaded", 0, (Fl_Callback*)ModelerUserInterface::cb_Flat, 0, 8, 0, 0, 14, 0}, - {"Wireframe", 0, (Fl_Callback*)ModelerUserInterface::cb_Wireframe, 0, 136, 0, 0, 14, 0}, - {"High Quality", 0, (Fl_Callback*)ModelerUserInterface::cb_High, 0, 8, 0, 0, 14, 0}, - {"Medium Quality", 0, (Fl_Callback*)ModelerUserInterface::cb_Medium, 0, 12, 0, 0, 14, 0}, - {"Low Quality", 0, (Fl_Callback*)ModelerUserInterface::cb_Low, 0, 8, 0, 0, 14, 0}, - {"Poor Quality", 0, (Fl_Callback*)ModelerUserInterface::cb_Poor, 0, 136, 0, 0, 14, 0}, - {"Focus on Origin", 0, (Fl_Callback*)ModelerUserInterface::cb_Focus, 0, 0, 0, 0, 14, 0}, - {"Frame All", 0, (Fl_Callback*)ModelerUserInterface::cb_FrameAll, 0, 0, 0, 0, 14, 0}, - {0}, - {"Animate", 0, 0, 0, 64, 0, 0, 14, 0}, - //{"Enable", 0, (Fl_Callback*)ModelerUserInterface::cb_m_controlsAnimOnMenu, 0, 2, 0, 0, 14, 0}, - {0}, - {0} -}; -// 11-01-2001: fixed bug that caused animation problems -Fl_Menu_Item* ModelerUserInterface::m_controlsAnimOnMenu = ModelerUserInterface::menu_m_controlsMenuBar + 18; - -inline void ModelerUserInterface::cb_m_controlsBrowser_i(Fl_Browser*, void*) { - for (int i=0; im_numControls; i++) { - if (m_controlsBrowser->selected(i+1)) - ModelerApplication::Instance()->ShowControl(i); - else - ModelerApplication::Instance()->HideControl(i); -}; -} -void ModelerUserInterface::cb_m_controlsBrowser(Fl_Browser* o, void* v) { - ((ModelerUserInterface*)(o->parent()->user_data()))->cb_m_controlsBrowser_i(o,v); -} - -inline void ModelerUserInterface::cb_m_modelerWindow_i(Fl_Window*, void*) { - 0; -} -void ModelerUserInterface::cb_m_modelerWindow(Fl_Window* o, void* v) { - ((ModelerUserInterface*)(o->user_data()))->cb_m_modelerWindow_i(o,v); -} - -ModelerUserInterface::ModelerUserInterface() { - Fl_Window* w; - { Fl_Window* o = m_controlsWindow = new Fl_Window(395, 326, "CS 341 Modeler (SP02)"); - w = o; - o->callback((Fl_Callback*)cb_m_controlsWindow, (void*)(this)); - o->when(FL_WHEN_NEVER); - { Fl_Menu_Bar* o = m_controlsMenuBar = new Fl_Menu_Bar(0, 0, 395, 25); - o->menu(menu_m_controlsMenuBar); - } - { Fl_Browser* o = m_controlsBrowser = new Fl_Browser(0, 25, 140, 300, "Controls"); - o->type(3); - o->textsize(10); - o->callback((Fl_Callback*)cb_m_controlsBrowser); - Fl_Group::current()->resizable(o); - } - { Fl_Scroll* o = m_controlsScroll = new Fl_Scroll(145, 25, 250, 300); - o->type(6); - o->when(FL_WHEN_CHANGED); - { Fl_Pack* o = m_controlsPack = new Fl_Pack(145, 25, 225, 300); - o->end(); - } - o->end(); - } - o->end(); - } - { Fl_Window* o = m_modelerWindow = new Fl_Window(340, 296, "Model"); - w = o; - o->callback((Fl_Callback*)cb_m_modelerWindow, (void*)(this)); - o->when(FL_WHEN_NEVER); - { ModelerView* o = m_modelerView = new ModelerView(0, 0, 340, 295, "ModelerView"); - Fl_Group::current()->resizable(o); - } - o->end(); - } -} - -void ModelerUserInterface::show() { - m_controlsWindow->show(); -m_modelerWindow->show(); -m_modelerView->show(); -} +// generated by Fast Light User Interface Designer (fluid) version 1.00 +#pragma warning( disable : 4786 ) + +#include "modelerui.h" +#include "modelerapp.h" + +#include "camera.h" + +#if _MSC_VER >= 1300 + +#include + +#else // _MSC_VER >= 1300 + +#include + +#endif // _MSC_VER >= 1300 + +#include +#include +using namespace std; + +inline void ModelerUserInterface::cb_m_controlsWindow_i(Fl_Window*, void*) { + 0;; +} +void ModelerUserInterface::cb_m_controlsWindow(Fl_Window* o, void* v) { + ((ModelerUserInterface*)(o->user_data()))->cb_m_controlsWindow_i(o,v); +} + +inline void ModelerUserInterface::cb_Save_i(Fl_Menu_*, void*) { + char *filename = NULL; +filename = fl_file_chooser("Save RAY File", "*.ray", NULL); +if (filename) +{ + if (openRayFile(filename) == false) + fl_alert("Error opening file."); + else + { + m_modelerView->draw(); + closeRayFile(); + } +}; +} +void ModelerUserInterface::cb_Save(Fl_Menu_* o, void* v) { + ((ModelerUserInterface*)(o->parent()->user_data()))->cb_Save_i(o,v); +} + +inline void ModelerUserInterface::cb_Save1_i(Fl_Menu_*, void*) { + char *filename = NULL; +filename = fl_file_chooser("Save BMP File", "*.bmp", NULL); +if (filename) +{ + int x = m_modelerView->x(); + int y = m_modelerView->y(); + int w = m_modelerView->w(); + int h = m_modelerView->h(); + + m_modelerWindow->show(); +// do {Sleep(10); } +// while (!m_modelerWindow->shown()); +// m_modelerView->draw(); + m_modelerView->make_current(); +m_modelerView->draw(); + + + unsigned char *imageBuffer = new unsigned char[3*w*h]; + + // Tell openGL to read from the front buffer when capturing + // out paint strokes + glReadBuffer(GL_BACK); + + glPixelStorei( GL_PACK_ALIGNMENT, 1 ); + glPixelStorei( GL_PACK_ROW_LENGTH, w ); + + glReadPixels( 0, 0, w, h, + GL_RGB, GL_UNSIGNED_BYTE, + imageBuffer ); + + + writeBMP(filename, w,h, imageBuffer); + + delete [] imageBuffer; +}; +} +void ModelerUserInterface::cb_Save1(Fl_Menu_* o, void* v) { + ((ModelerUserInterface*)(o->parent()->user_data()))->cb_Save1_i(o,v); +} + +// IANLI +// Implementation callback for saving the positions of the model into a file +// The first line of the file contains the values for the position/orientation of +// the camera. The values are ordered as the following: +// elevation azimuth dolly twist lookAtX lookAtY lookAtZ +// The lines after correspond to the values of the controls. The following lines +// have this format: +// controlNumber controlValue +inline void ModelerUserInterface::cb_SavePos_i(Fl_Menu_*, void*) { + char *filename = NULL; + filename = fl_file_chooser("Save .pos File", "*.pos", NULL); + + if (filename) + { + FILE* m_posFile = fopen(filename, "w"); + + float elevation, azimuth, dolly, twist; + Vec3f lookAt; + elevation = m_modelerView->m_camera->getElevation(); + dolly = m_modelerView->m_camera->getDolly(); + azimuth = m_modelerView->m_camera->getAzimuth(); + twist = m_modelerView->m_camera->getTwist(); + lookAt = m_modelerView->m_camera->getLookAt(); + + fprintf(m_posFile, "%f %f %f %f %f %f %f\n", elevation, azimuth, dolly, twist, lookAt[0], lookAt[1], lookAt[2]); + + double value; + for(int i = 0; i < NUMCONTROLS; i++) + { + value = ModelerApplication::Instance()->GetControlValue(i); + + fprintf(m_posFile, "%d %f\n", i, value); + } + + fclose(m_posFile); + }; +} +void ModelerUserInterface::cb_SavePos(Fl_Menu_* o, void* v) { + ((ModelerUserInterface*)(o->parent()->user_data()))->cb_SavePos_i(o,v); +} + +inline void ModelerUserInterface::cb_OpenPos_i(Fl_Menu_*, void*) { + char *filename = NULL; + filename = fl_file_chooser("Open .pos File", "*.pos", NULL); + + if (filename) + { + ifstream ifs( filename ); + if( !ifs ) { + cerr << "Error: couldn't read position file " << filename << endl; + return; + } + + float elevation, azimuth, dolly, twist, x, y, z; + ifs >> elevation >> azimuth >> dolly >> twist >> x >> y >> z; + + m_modelerView->m_camera->setElevation( elevation); + m_modelerView->m_camera->setAzimuth( azimuth ); + m_modelerView->m_camera->setDolly( dolly ); + m_modelerView->m_camera->setTwist( twist ); + m_modelerView->m_camera->setLookAt( Vec3f(x, y, z) ); + + int controlNum; + float value; + while( ifs >> controlNum >> value ) + { + if( controlNum >= NUMCONTROLS ) { + break; + } + + ModelerApplication::Instance()->SetControlValue(controlNum, value); + } + + m_modelerView->redraw(); + }; +} +void ModelerUserInterface::cb_OpenPos(Fl_Menu_* o, void* v) { + ((ModelerUserInterface*)(o->parent()->user_data()))->cb_OpenPos_i(o,v); +} + +inline void ModelerUserInterface::cb_Exit_i(Fl_Menu_*, void*) { + m_controlsWindow->hide(); +m_modelerWindow->hide(); +} +void ModelerUserInterface::cb_Exit(Fl_Menu_* o, void* v) { + ((ModelerUserInterface*)(o->parent()->user_data()))->cb_Exit_i(o,v); +} + +inline void ModelerUserInterface::cb_Normal_i(Fl_Menu_*, void*) { + setDrawMode(NORMAL); +m_modelerView->redraw(); +} +void ModelerUserInterface::cb_Normal(Fl_Menu_* o, void* v) { + ((ModelerUserInterface*)(o->parent()->user_data()))->cb_Normal_i(o,v); +} + +inline void ModelerUserInterface::cb_Flat_i(Fl_Menu_*, void*) { + setDrawMode(FLATSHADE); +m_modelerView->redraw(); +} +void ModelerUserInterface::cb_Flat(Fl_Menu_* o, void* v) { + ((ModelerUserInterface*)(o->parent()->user_data()))->cb_Flat_i(o,v); +} + +inline void ModelerUserInterface::cb_Wireframe_i(Fl_Menu_*, void*) { + setDrawMode(WIREFRAME); +m_modelerView->redraw(); +} +void ModelerUserInterface::cb_Wireframe(Fl_Menu_* o, void* v) { + ((ModelerUserInterface*)(o->parent()->user_data()))->cb_Wireframe_i(o,v); +} + +inline void ModelerUserInterface::cb_High_i(Fl_Menu_*, void*) { + setQuality(HIGH); +m_modelerView->redraw(); +} +void ModelerUserInterface::cb_High(Fl_Menu_* o, void* v) { + ((ModelerUserInterface*)(o->parent()->user_data()))->cb_High_i(o,v); +} + +inline void ModelerUserInterface::cb_Medium_i(Fl_Menu_*, void*) { + setQuality(MEDIUM); +m_modelerView->redraw(); +} +void ModelerUserInterface::cb_Medium(Fl_Menu_* o, void* v) { + ((ModelerUserInterface*)(o->parent()->user_data()))->cb_Medium_i(o,v); +} + +inline void ModelerUserInterface::cb_Low_i(Fl_Menu_*, void*) { + setQuality(LOW); +m_modelerView->redraw(); +} +void ModelerUserInterface::cb_Low(Fl_Menu_* o, void* v) { + ((ModelerUserInterface*)(o->parent()->user_data()))->cb_Low_i(o,v); +} + +inline void ModelerUserInterface::cb_Poor_i(Fl_Menu_*, void*) { + setQuality(POOR); +m_modelerView->redraw(); +} +void ModelerUserInterface::cb_Poor(Fl_Menu_* o, void* v) { + ((ModelerUserInterface*)(o->parent()->user_data()))->cb_Poor_i(o,v); +} + +// Callback function to look at origin again. +inline void ModelerUserInterface::cb_Focus_i(Fl_Menu_*, void*) { + m_modelerView->m_camera->setLookAt( Vec3f(0, 0, 0) ); + m_modelerView->redraw(); +} +void ModelerUserInterface::cb_Focus(Fl_Menu_* o, void* v) { + ((ModelerUserInterface*)(o->parent()->user_data()))->cb_Focus_i(o,v); +} + +// Callback function to look at origin again. +inline void ModelerUserInterface::cb_FrameAll_i(Fl_Menu_*, void*) { + m_modelerView->m_camera->frameAll(VAL(ARMCNT)); + m_modelerView->redraw(); +} +void ModelerUserInterface::cb_FrameAll(Fl_Menu_* o, void* v) { + ((ModelerUserInterface*)(o->parent()->user_data()))->cb_FrameAll_i(o,v); +} + +inline void ModelerUserInterface::cb_m_controlsAnimOnMenu_i(Fl_Menu_*, void*) { + ModelerApplication::Instance()->m_animating = (m_controlsAnimOnMenu->value() == 0) ? false : true; +} +void ModelerUserInterface::cb_m_controlsAnimOnMenu(Fl_Menu_* o, void* v) { + ((ModelerUserInterface*)(o->parent()->user_data()))->cb_m_controlsAnimOnMenu_i(o,v); +} + +Fl_Menu_Item ModelerUserInterface::menu_m_controlsMenuBar[] = { + {"File", 0, 0, 0, 64, 0, 0, 14, 0}, + {"Save Raytracer File", 0, (Fl_Callback*)ModelerUserInterface::cb_Save, 0, 0, 0, 0, 14, 0}, + {"Save Bitmap File", 0, (Fl_Callback*)ModelerUserInterface::cb_Save1, 0, 128, 0, 0, 14, 0}, + {"Open Position File", 0, (Fl_Callback*)ModelerUserInterface::cb_OpenPos, 0, 0, 0, 0, 14, 0}, + {"Save Position File", 0, (Fl_Callback*)ModelerUserInterface::cb_SavePos, 0, 128, 0, 0, 14, 0}, + {"Exit", 0, (Fl_Callback*)ModelerUserInterface::cb_Exit, 0, 0, 0, 0, 14, 0}, + {0}, + {"View", 0, 0, 0, 64, 0, 0, 14, 0}, + {"Normal", 0, (Fl_Callback*)ModelerUserInterface::cb_Normal, 0, 12, 0, 0, 14, 0}, + {"Flat Shaded", 0, (Fl_Callback*)ModelerUserInterface::cb_Flat, 0, 8, 0, 0, 14, 0}, + {"Wireframe", 0, (Fl_Callback*)ModelerUserInterface::cb_Wireframe, 0, 136, 0, 0, 14, 0}, + {"High Quality", 0, (Fl_Callback*)ModelerUserInterface::cb_High, 0, 8, 0, 0, 14, 0}, + {"Medium Quality", 0, (Fl_Callback*)ModelerUserInterface::cb_Medium, 0, 12, 0, 0, 14, 0}, + {"Low Quality", 0, (Fl_Callback*)ModelerUserInterface::cb_Low, 0, 8, 0, 0, 14, 0}, + {"Poor Quality", 0, (Fl_Callback*)ModelerUserInterface::cb_Poor, 0, 136, 0, 0, 14, 0}, + {"Focus on Origin", 0, (Fl_Callback*)ModelerUserInterface::cb_Focus, 0, 0, 0, 0, 14, 0}, + {"Frame All", 0, (Fl_Callback*)ModelerUserInterface::cb_FrameAll, 0, 0, 0, 0, 14, 0}, + {0}, + {"Animate", 0, 0, 0, 64, 0, 0, 14, 0}, + //{"Enable", 0, (Fl_Callback*)ModelerUserInterface::cb_m_controlsAnimOnMenu, 0, 2, 0, 0, 14, 0}, + {0}, + {0} +}; +// 11-01-2001: fixed bug that caused animation problems +Fl_Menu_Item* ModelerUserInterface::m_controlsAnimOnMenu = ModelerUserInterface::menu_m_controlsMenuBar + 18; + +inline void ModelerUserInterface::cb_m_controlsBrowser_i(Fl_Browser*, void*) { + for (int i=0; im_numControls; i++) { + if (m_controlsBrowser->selected(i+1)) + ModelerApplication::Instance()->ShowControl(i); + else + ModelerApplication::Instance()->HideControl(i); +}; +} +void ModelerUserInterface::cb_m_controlsBrowser(Fl_Browser* o, void* v) { + ((ModelerUserInterface*)(o->parent()->user_data()))->cb_m_controlsBrowser_i(o,v); +} + +inline void ModelerUserInterface::cb_m_modelerWindow_i(Fl_Window*, void*) { + 0; +} +void ModelerUserInterface::cb_m_modelerWindow(Fl_Window* o, void* v) { + ((ModelerUserInterface*)(o->user_data()))->cb_m_modelerWindow_i(o,v); +} + +ModelerUserInterface::ModelerUserInterface() { + Fl_Window* w; + { Fl_Window* o = m_controlsWindow = new Fl_Window(395, 326, "CS 341 Modeler (SP02)"); + w = o; + o->callback((Fl_Callback*)cb_m_controlsWindow, (void*)(this)); + o->when(FL_WHEN_NEVER); + { Fl_Menu_Bar* o = m_controlsMenuBar = new Fl_Menu_Bar(0, 0, 395, 25); + o->menu(menu_m_controlsMenuBar); + } + { Fl_Browser* o = m_controlsBrowser = new Fl_Browser(0, 25, 140, 300, "Controls"); + o->type(3); + o->textsize(10); + o->callback((Fl_Callback*)cb_m_controlsBrowser); + Fl_Group::current()->resizable(o); + } + { Fl_Scroll* o = m_controlsScroll = new Fl_Scroll(145, 25, 250, 300); + o->type(6); + o->when(FL_WHEN_CHANGED); + { Fl_Pack* o = m_controlsPack = new Fl_Pack(145, 25, 225, 300); + o->end(); + } + o->end(); + } + o->end(); + } + { Fl_Window* o = m_modelerWindow = new Fl_Window(340, 296, "Model"); + w = o; + o->callback((Fl_Callback*)cb_m_modelerWindow, (void*)(this)); + o->when(FL_WHEN_NEVER); + { ModelerView* o = m_modelerView = new ModelerView(0, 0, 340, 295, "ModelerView"); + Fl_Group::current()->resizable(o); + } + o->end(); + } +} + +void ModelerUserInterface::show() { + m_controlsWindow->show(); +m_modelerWindow->show(); +m_modelerView->show(); +} diff --git a/readme.md b/readme.md index 6add802..4c3ad47 100644 --- a/readme.md +++ b/readme.md @@ -18,6 +18,8 @@ B: Bell, W: Whistle, 1B=2W - [x] **(1W)** Light source - [x] **(1W)** (hierarchical) level of details + - [X] (1W each) extra feature + - [x] Dynamic number of level of arms with ik supported - [x] **(1B)** Texture map - [x] **(1B)** Polygon faces shape - [x] **(1B)** Animated sequence