From 59510383e689ee5f3fa7719f2ad3d555b07facfa Mon Sep 17 00:00:00 2001 From: MusicalProgrammer <38636805+MusicalProgrammer@users.noreply.github.com> Date: Sun, 29 Apr 2018 23:47:40 -0400 Subject: [PATCH] What I have thus far Camera panning still needs work. --- AudioPlayer.cpp | 113 +++++++ AudioPlayer.h | 11 + PhysicalInstance.cpp | 20 +- PhysicalInstance.h | 2 + content/sounds/SWITCH3.wav | Bin 0 -> 4628 bytes content/sounds/electronicpingshort.wav | Bin 0 -> 10317 bytes content/sounds/pageturn.wav | Bin 0 -> 25548 bytes content/sounds/switch.wav | Bin 0 -> 13498 bytes main.cpp | 445 ++++++++++++++++++++++--- 9 files changed, 536 insertions(+), 55 deletions(-) create mode 100644 AudioPlayer.cpp create mode 100644 AudioPlayer.h create mode 100644 content/sounds/SWITCH3.wav create mode 100644 content/sounds/electronicpingshort.wav create mode 100644 content/sounds/pageturn.wav create mode 100644 content/sounds/switch.wav diff --git a/AudioPlayer.cpp b/AudioPlayer.cpp new file mode 100644 index 0000000..bfbc2c1 --- /dev/null +++ b/AudioPlayer.cpp @@ -0,0 +1,113 @@ +#include "AudioPlayer.h" +#include "SDL.h" +#include "SDL_audio.h" +#include +#include +#include +#define NUM_SOUNDS 10 +static SDL_AudioSpec fmt; +static bool initiated = false; + +AudioPlayer::AudioPlayer(void) +{ + +} + +AudioPlayer::~AudioPlayer(void) +{ + SDL_CloseAudio(); +} + +void AudioPlayer::init() +{ + initiated = true; + extern void mixaudio(void *unused, Uint8 *stream, int len); + fmt.freq = 22050; + fmt.format = AUDIO_S16; + fmt.channels = 2; + fmt.samples = 1024; /* A good value for games */ + fmt.callback = mixaudio; + fmt.userdata = NULL; + + /* Open the audio device and start playing sound! */ + if ( SDL_OpenAudio(&fmt, NULL) < 0 ) { + fprintf(stderr, "Unable to open audio: %s\n", SDL_GetError()); + exit(1); + } + SDL_PauseAudio(0); +} + +static struct sample { + Uint8 *data; + Uint32 dpos; + Uint32 dlen; +} sounds[NUM_SOUNDS]; + +void mixaudio(void *unused, Uint8 *stream, int len) +{ + int i; + Uint32 amount; + + for ( i=0; i (Uint32)len ) { + amount = len; + } + SDL_MixAudio(stream, &sounds[i].data[sounds[i].dpos], amount, SDL_MIX_MAXVOLUME); + sounds[i].dpos += amount; + } +} + +void AudioPlayer::PlaySound(std::string fileString) +{ + + if(initiated) + { + char *file = new char[fileString.length() + 1]; + strcpy(file, fileString.c_str()); + + + int index; + SDL_AudioSpec wave; + Uint8 *data; + Uint32 dlen; + SDL_AudioCVT cvt; + + /* Look for an empty (or finished) sound slot */ + for ( index=0; index +#pragma once + +class AudioPlayer +{ +public: + AudioPlayer(void); + ~AudioPlayer(void); + static void PlaySound(std::string); + static void init(); +}; diff --git a/PhysicalInstance.cpp b/PhysicalInstance.cpp index 247dc49..faa740a 100644 --- a/PhysicalInstance.cpp +++ b/PhysicalInstance.cpp @@ -1,5 +1,4 @@ #include "PhysicalInstance.h" - bool canCollide = true; bool anchored = false; Vector3 size; @@ -8,6 +7,8 @@ Vector3 velocity; Vector3 rotVelocity; CoordinateFrame cFrame; Color3 color; +bool changed = true; +Box itemBox = Box(); PhysicalInstance::PhysicalInstance(void) { @@ -31,6 +32,7 @@ void PhysicalInstance::setPosition(Vector3 pos) { position = pos; cFrame = CoordinateFrame(pos); + changed = true; } CoordinateFrame PhysicalInstance::getCFrame() { @@ -40,8 +42,24 @@ void PhysicalInstance::setCFrame(CoordinateFrame coordinateFrame) { cFrame = coordinateFrame; position = coordinateFrame.translation; + changed = true; } +CoordinateFrame PhysicalInstance::getCFrameRenderBased() +{ + return CoordinateFrame(getCFrame().rotation,Vector3(getCFrame().translation.x/2, getCFrame().translation.y/2, getCFrame().translation.z/2)); +} + +Box PhysicalInstance::getBox() +{ + if(changed) + { + Box box = Box(Vector3(0+size.x/4, 0+size.y/4, 0+size.z/4) ,Vector3(0-size.x/4,0-size.y/4,0-size.z/4)); + CoordinateFrame c = getCFrameRenderBased(); + itemBox = c.toWorldSpace(box); + } + return itemBox; +} PhysicalInstance::~PhysicalInstance(void) { diff --git a/PhysicalInstance.h b/PhysicalInstance.h index 4dd9cfe..bc3f859 100644 --- a/PhysicalInstance.h +++ b/PhysicalInstance.h @@ -16,6 +16,8 @@ public: void setPosition(Vector3); CoordinateFrame getCFrame(); void setCFrame(CoordinateFrame); + Box getBox(); + CoordinateFrame getCFrameRenderBased(); private: Vector3 position; }; diff --git a/content/sounds/SWITCH3.wav b/content/sounds/SWITCH3.wav new file mode 100644 index 0000000000000000000000000000000000000000..195138e013c413d77b7d683aa4f0160409eb29e3 GIT binary patch literal 4628 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 hfOF>AB_4!SFrJ{|86z;KTp` literal 0 HcmV?d00001 diff --git a/content/sounds/electronicpingshort.wav b/content/sounds/electronicpingshort.wav new file mode 100644 index 0000000000000000000000000000000000000000..2f82ae26e5a2c9ad767e00680029e03a20f10666 GIT binary patch literal 10317 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 literal 0 HcmV?d00001 diff --git a/content/sounds/pageturn.wav b/content/sounds/pageturn.wav new file mode 100644 index 0000000000000000000000000000000000000000..7070da531a528c072130e9697960915856bed7fd GIT binary patch literal 25548 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 cJ(xT6%&}J*(^b literal 0 HcmV?d00001 diff --git a/main.cpp b/main.cpp index 9472e70..c6faf5c 100644 --- a/main.cpp +++ b/main.cpp @@ -16,7 +16,8 @@ #include "PhysicalInstance.h" #include "TextButtonInstance.h" #include "ImageButtonInstance.h" - +#include "AudioPlayer.h" +#include #if G3D_VER < 61000 #error Requires G3D 6.10 @@ -30,17 +31,23 @@ static std::vector instances_2D; static Instance* dataModel; GFontRef fntdominant = NULL; GFontRef fntlighttrek = NULL; +Ray testRay; static bool democ = true; static std::string message = ""; static G3D::RealTime messageTime = 0; +static std::string tempPath = ""; static G3D::RealTime inputTime = 0; static int FPSVal[8] = {10, 20, 30, 60, 120, 240, INT_MAX,1}; static int index = 2; +static std::string cameraSound = ""; +static std::string clickSound = ""; +static std::string dingSound = ""; static float TIMERVAL = 60.0F; static int SCOREVAL = 0; static G3D::TextureRef go = NULL; static G3D::TextureRef go_ovr = NULL; static G3D::TextureRef go_dn = NULL; +VARAreaRef varStatic = NULL; static float mousex = 0; static float mousey = 0; static int cursorid = 0; @@ -55,11 +62,14 @@ static bool backwards = false; static bool left = false; static bool right = false; static bool centerCam = false; +static bool panRight = false; +static bool tiltUp = false; static const int CURSOR = 0; static const int ARROWS = 1; static const int RESIZE = 2; static int mode = CURSOR; Vector3 cameraPos = Vector3(0,2,10); +Vector3 focalPointT = Vector3(0,0,0); Vector2 oldMouse = Vector2(0,0); float moveRate = 0.5; Instance* selectedInstance = NULL; @@ -134,13 +144,23 @@ class App : public GApp { HWND getHWND(); HWND getPropertyHWND(); HWND getMainHWND(); - //void addHWND(HWND hwnd); + Vector3 getFocalPoint(); + void setFocalPoint(Vector3 vect); private: HWND hwnd; HWND propertyHWnd; HWND mainHWnd; + Vector3 focalPoint; }; +Vector3 App::getFocalPoint() +{ + return focalPoint; +} +void App::setFocalPoint(Vector3 vect) +{ + focalPoint=vect; +} App *usableApp = NULL; HWND App::getHWND() @@ -158,6 +178,7 @@ HWND App::getMainHWND() Demo::Demo(App* _app) : GApplet(_app), app(_app) { + varStatic = VARArea::create(1024 * 1024); } @@ -172,6 +193,8 @@ void clearInstances() void OnError(int err, std::string msg = "") { + usableApp->window()->setInputCaptureCount(0); + usableApp->window()->setMouseVisible(true); std::string emsg = "An unexpected error has occured and DUOM 5 has to quit. We're sorry!" + msg; clearInstances(); //DialogBox(NULL, MAKEINTRESOURCE(IDD_DIALOG1), NULL, NULL); @@ -241,6 +264,7 @@ public: void CameraButtonListener::onButton1MouseClick(BaseButtonInstance* button) { + AudioPlayer::PlaySound(cameraSound); CoordinateFrame frame = usableApp->debugCamera.getCoordinateFrame(); if(button->name == "CenterCam") centerCam = true; @@ -248,14 +272,91 @@ void CameraButtonListener::onButton1MouseClick(BaseButtonInstance* button) cameraPos = Vector3(cameraPos.x, cameraPos.y, cameraPos.z) + frame.lookVector()*2; else if(button->name == "ZoomOut") cameraPos = Vector3(cameraPos.x, cameraPos.y, cameraPos.z) - frame.lookVector()*2; + else if(button->name == "PanRight") + panRight = true; + else if(button->name == "TiltUp") + tiltUp = true; } +class GUDButtonListener : public ButtonListener { +public: + void onButton1MouseClick(BaseButtonInstance*); +}; + +void GUDButtonListener::onButton1MouseClick(BaseButtonInstance* button) +{ + if(selectedInstance != NULL) + { + AudioPlayer::PlaySound(dingSound); + if(button->name == "Duplicate") + { + + } + } + +} + +class RotateButtonListener : public ButtonListener { +public: + void onButton1MouseClick(BaseButtonInstance*); +}; + +void RotateButtonListener::onButton1MouseClick(BaseButtonInstance* button) +{ + if(selectedInstance != NULL) + { + AudioPlayer::PlaySound(clickSound); + if(selectedInstance->className == "Part") + { + PhysicalInstance* part = (PhysicalInstance*) selectedInstance; + if(button->name == "Tilt") + part->setCFrame(part->getCFrame()*Matrix3::fromEulerAnglesXYZ(0,0,toRadians(90))); + else if(button->name == "Rotate") + part->setCFrame(part->getCFrame()*Matrix3::fromEulerAnglesXYZ(0,toRadians(90),0)); + } + } + +} + + +void deleteInstance() +{ + if(selectedInstance != NULL) + { + for(size_t i = 0; i < instances.size(); i++) + { + if(instances.at(i) == selectedInstance) + { + Instance* deleting = instances.at(i); + instances.erase(instances.begin() + i); + delete deleting; + selectedInstance = NULL; + AudioPlayer::PlaySound(GetFileInPath("/content/sounds/pageturn.wav")); + } + } + } +} + + +class DeleteListener : public ButtonListener { +public: + void onButton1MouseClick(BaseButtonInstance*); +}; + +void DeleteListener::onButton1MouseClick(BaseButtonInstance* button) +{ + deleteInstance(); +} + + + class ModeSelectionListener : public ButtonListener { public: void onButton1MouseClick(BaseButtonInstance*); }; + void ModeSelectionListener::onButton1MouseClick(BaseButtonInstance* button) { CoordinateFrame frame = usableApp->debugCamera.getCoordinateFrame(); @@ -407,6 +508,51 @@ void initGUI() button->fontLocationRelativeTo = Vector2(10, 0); button->setAllColorsSame(); + + + button = makeTextButton(); + button->boxBegin = Vector2(0,215); + button->boxEnd = Vector2(80,235); + button->textOutlineColor = Color4(0.5F,0.5F,0.5F,0.5F); + button->textColor = Color3::white(); + button->boxColor = Color4::clear(); + button->textSize = 12; + button->title = "Group"; + button->setAllColorsSame(); + button->font = fntlighttrek; + button->fontLocationRelativeTo = Vector2(10, 0); + button->parent = dataModel; + + + button = makeTextButton(); + button->boxBegin = Vector2(0,240); + button->boxEnd = Vector2(80,260); + button->textOutlineColor = Color4(0.5F,0.5F,0.5F,0.5F); + button->textColor = Color3::white(); + button->boxColor = Color4::clear(); + button->textSize = 12; + button->title = "UnGroup"; + button->setAllColorsSame(); + button->font = fntlighttrek; + button->fontLocationRelativeTo = Vector2(10, 0); + button->parent = dataModel; + + button = makeTextButton(); + button->boxBegin = Vector2(0,265); + button->boxEnd = Vector2(80,285); + button->textOutlineColor = Color4(0.5F,0.5F,0.5F,0.5F); + button->textColor = Color3::white(); + button->boxColor = Color4::clear(); + button->textSize = 12; + button->title = "Duplicate"; + button->setAllColorsSame(); + button->font = fntlighttrek; + button->fontLocationRelativeTo = Vector2(10, 0); + button->parent = dataModel; + button->name = "Duplicate"; + button->setButtonListener(new GUDButtonListener()); + + ImageButtonInstance* instance = makeImageButton(go, go_ovr, go_dn); instance->name = "go"; instance->size = Vector2(65,65); @@ -453,6 +599,8 @@ void initGUI() instance->size = Vector2(30,30); instance->position = Vector2(10, 175); instance->parent = dataModel; + instance->name = "Rotate"; + instance->setButtonListener(new RotateButtonListener()); instance = makeImageButton( Texture::fromFile(GetFileInPath("/content/images/SelectionTilt.png")), @@ -462,6 +610,8 @@ void initGUI() instance->size = Vector2(30,30); instance->position = Vector2(40, 175); instance->parent = dataModel; + instance->name = "Tilt"; + instance->setButtonListener(new RotateButtonListener()); instance = makeImageButton( @@ -472,15 +622,8 @@ void initGUI() instance->size = Vector2(40,46); instance->position = Vector2(20, 284); instance->parent = dataModel; - - instance = makeImageButton( - Texture::fromFile(GetFileInPath("/content/images/Delete.png")), - Texture::fromFile(GetFileInPath("/content/images/Delete_ovr.png")), - Texture::fromFile(GetFileInPath("/content/images/Delete_dn.png")), - Texture::fromFile(GetFileInPath("/content/images/Delete_ds.png"))); - instance->size = Vector2(40,46); - instance->position = Vector2(20, 284); - instance->parent = dataModel; + instance->name = "Delete"; + instance->setButtonListener(new DeleteListener()); instance = makeImageButton( Texture::fromFile(GetFileInPath("/content/images/CameraZoomIn.png")), @@ -584,27 +727,22 @@ void Demo::onInit() { test->parent = dataModel; test->color = Color3(0.2F,0.3F,1); test->size = Vector3(24,1,24); - test->setCFrame(CoordinateFrame(Matrix3::fromEulerAnglesXYZ(toRadians(90),toRadians(45),toRadians(45)), Vector3(0,0,0))); - selectedInstance = test; + test->setPosition(Vector3(0,0,0)); + test->setCFrame(test->getCFrame() * Matrix3::fromEulerAnglesXYZ(0,toRadians(90),0)); + //selectedInstance = test; - test = makePart(); - test->parent = dataModel; - test->color = Color3(.5F,1,.5F); - test->size = Vector3(4,1,2); - test->setPosition(Vector3(10,1,0)); test = makePart(); test->parent = dataModel; test->color = Color3(.5F,1,.5F); test->size = Vector3(4,1,2); test->setPosition(Vector3(-10,1,0)); - test = makePart(); test->parent = dataModel; - test->color = Color3::gray(); + test->color = Color3(.5F,1,.5F); test->size = Vector3(4,1,2); - test->setPosition(Vector3(-7,2,0)); + test->setPosition(Vector3(10,1,0)); test = makePart(); test->parent = dataModel; @@ -616,31 +754,38 @@ void Demo::onInit() { test->parent = dataModel; test->color = Color3::gray(); test->size = Vector3(4,1,2); - test->setPosition(Vector3(-4,3,0)); + test->setPosition(Vector3(-7,2,0)); test = makePart(); test->parent = dataModel; test->color = Color3::gray(); test->size = Vector3(4,1,2); - test->setPosition(Vector3(5,3,0)); + test->setPosition(Vector3(4,3,0)); test = makePart(); test->parent = dataModel; test->color = Color3::gray(); test->size = Vector3(4,1,2); - test->setPosition(Vector3(-1,4,0)); + test->setPosition(Vector3(-5,3,0)); test = makePart(); test->parent = dataModel; test->color = Color3::gray(); test->size = Vector3(4,1,2); - test->setPosition(Vector3(3,4,0)); + test->setPosition(Vector3(1,4,0)); test = makePart(); test->parent = dataModel; test->color = Color3::gray(); test->size = Vector3(4,1,2); - test->setPosition(Vector3(2,5,0)); + test->setPosition(Vector3(-3,4,0)); + + test = makePart(); + test->parent = dataModel; + test->color = Color3::gray(); + test->size = Vector3(4,1,2); + test->setPosition(Vector3(-2,5,0)); + @@ -653,8 +798,8 @@ void Demo::onInit() { test = makePart(); test->parent = dataModel; test->color = Color3::gray(); - test->size = Vector3(4,1,2); - test->setPosition(Vector3(-2,7,0)); + test->size = Vector3(-4,-1,-2); + test->setPosition(Vector3(2,7,0)); @@ -694,6 +839,19 @@ void Demo::onCleanup() { void Demo::onLogic() { // Add non-simulation game logic and AI code here + for(size_t i = 0; i < instances_2D.size(); i++) + { + if(instances_2D.at(i)->name == "Delete") + { + ImageButtonInstance* button = (ImageButtonInstance*)instances_2D.at(i); + if(selectedInstance == NULL) + button->disabled = true; + else + button->disabled = false; + + } + } + } @@ -702,6 +860,11 @@ void Demo::onNetwork() { } +double getVectorDistance(Vector3 vector1, Vector3 vector2) +{ + return pow(pow((double)vector1.x - (double)vector2.x, 2) + pow((double)vector1.y - (double)vector2.y, 2) + pow((double)vector1.z - (double)vector2.z, 2), 0.5); +} + void Demo::onSimulation(RealTime rdt, SimTime sdt, SimTime idt) { if(dataModel->name != title) { @@ -731,16 +894,79 @@ void Demo::onSimulation(RealTime rdt, SimTime sdt, SimTime idt) { right = false; cameraPos = Vector3(cameraPos.x, cameraPos.y, cameraPos.z) + frame.rightVector()*moveRate; } - app->debugCamera.setPosition(cameraPos); + //app->debugCamera.setPosition(cameraPos); if(centerCam) { CoordinateFrame frame = CoordinateFrame(app->debugCamera.getCoordinateFrame().translation); + Vector3 focalPos; if(selectedInstance == NULL) - frame.lookAt(Vector3(0,0,0)); + { + focalPos=Vector3(0,0,0); + frame.lookAt(focalPos); + app->setFocalPoint(focalPos); + } else - frame.lookAt(((PhysicalInstance*)selectedInstance)->getPosition()); + { + focalPos=((PhysicalInstance*)selectedInstance)->getPosition(); + frame.lookAt(focalPos); + app->setFocalPoint(focalPos); + } + app->debugController.setCoordinateFrame(frame); centerCam = false; + + } + + float camAngleY=0; + float camAngleX=0; + float camAngleZ=0; + //test+=0.1f; + + + //app->debugController.setCoordinateFrame(cf); + + //app->setFocalPoint(Vector3(0,0,0)); + + if(panRight) + { + + float addOrSubtractThis=toRadians(45); + Vector3 camPos = frame.translation; + Vector3 focalPoint = app->getFocalPoint(); + CoordinateFrame localFrame = CoordinateFrame(); + CoordinateFrame cf = CoordinateFrame(Vector3(focalPoint.x,focalPoint.y,focalPoint.z)); + cf.lookAt(Vector3(camPos.x,focalPoint.y,camPos.z)); + cf=cf*Matrix3::fromEulerAnglesXYZ(0,addOrSubtractThis,0); + float distd = (Vector3(camPos.x,0,camPos.z)-Vector3(focalPoint.x,0,focalPoint.z)).magnitude(); + cf=cf+cf.lookVector()*distd; // Distance + cf=cf+Vector3(0,camPos.y,0); + cf.lookAt(focalPoint); + panRight = false; + Vector3 camerapoint = frame.translation; + messageTime = System::time(); + cameraPos=camPos; + + app->debugController.setCoordinateFrame(cf); + } + + if(tiltUp) + { + tiltUp = false; + CoordinateFrame frame = CoordinateFrame(app->debugCamera.getCoordinateFrame().rotation, app->debugCamera.getCoordinateFrame().translation); + Vector3 camerapoint = frame.translation; + + Vector3 focalPoint = camerapoint + frame.lookVector() * 25; + float distance = pow(pow((double)focalPoint.x - (double)camerapoint.x, 2) + pow((double)camerapoint.y - (double)camerapoint.y, 2) + pow((double)focalPoint.z - (double)camerapoint.z, 2), 0.5); + float x = distance * cos(22.5 * G3D::pi() / 180) + focalPoint.x; + float z = distance * sin(22.5 * G3D::pi() / 180) + focalPoint.z; + camerapoint = Vector3(camerapoint.x, camerapoint.y+2, camerapoint.z); + + CoordinateFrame newFrame = CoordinateFrame(camerapoint); + newFrame.lookAt(focalPoint); + cameraPos = camerapoint; + app->debugController.setCoordinateFrame(newFrame); + + } } @@ -762,6 +988,7 @@ double getOSVersion() { return ::atof(version.c_str()); } +//User Input void Demo::onUserInput(UserInput* ui) { if (ui->keyPressed(SDLK_ESCAPE)) { @@ -800,15 +1027,22 @@ void Demo::onUserInput(UserInput* ui) { if(ui->keyPressed(SDL_MOUSE_WHEEL_UP_KEY)) { + AudioPlayer::PlaySound(cameraSound); CoordinateFrame frame = app->debugCamera.getCoordinateFrame(); cameraPos = cameraPos + frame.lookVector()*2; } if(ui->keyPressed(SDL_MOUSE_WHEEL_DOWN_KEY)) { + AudioPlayer::PlaySound(cameraSound); CoordinateFrame frame = app->debugCamera.getCoordinateFrame(); cameraPos = cameraPos - frame.lookVector()*2; } + if(ui->keyPressed(SDLK_DELETE)) + { + deleteInstance(); + } + if(ui->keyDown(SDLK_LCTRL)) { if(ui->keyPressed('d')) @@ -861,6 +1095,51 @@ void Demo::onUserInput(UserInput* ui) { right = true; } + if(ui->keyPressed(SDL_LEFT_MOUSE_KEY)) + { + bool onGUI = false; + for(size_t i = 0; i < instances_2D.size(); i++) + { + if(instances_2D.at(i)->className == "TextButton" || instances_2D.at(i)->className == "ImageButton") + { + BaseButtonInstance* button = (BaseButtonInstance*)instances_2D.at(i); + if(button->mouseInButton(ui->mouseXY().x, ui->mouseXY().y, app->renderDevice)) + { + onGUI = true; + break; + } + } + } + if(!onGUI) + { + selectedInstance = NULL; + testRay = app->debugCamera.worldRay(mousex, mousey, app->renderDevice->getViewport()); + float nearest=std::numeric_limits::infinity(); + Vector3 camPos = app->debugCamera.getCoordinateFrame().translation; + for(size_t i = 0; i < instances.size(); i++) + { + if(instances.at(i)->className == "Part" && instances.at(i)->parent == dataModel) + { + PhysicalInstance* test = (PhysicalInstance*)instances.at(i); + float time = testRay.intersectionTime(test->getBox()); + if (time != inf()) + { + if (nearest>time) + { + nearest=time; + selectedInstance = test; + } + } + } + } + + + + //message = Convert(closest); + + } + } + if(ui->keyReleased(SDL_LEFT_MOUSE_KEY)) { @@ -1020,10 +1299,35 @@ void Demo::exitApplication() app->endProgram = true; } +void makeBeveledBox(Box box, RenderDevice* rd, Color4 color, CoordinateFrame cFrame) +{ + Vector3 v0, v1, v2, v3; + //glDiffuse(); + rd->setColor(color); + rd->setObjectToWorldMatrix(CoordinateFrame()); + rd->beginPrimitive(RenderDevice::QUADS); + for (int f = 0; f < 6; ++f) { + box.getFaceCorners(f, v0, v1, v2, v3); + glShadeModel(GL_SMOOTH); + //rd->setNormal((v1 - v0).cross(v3 - v0).direction()); + rd->sendVertex(v0); + rd->sendVertex(v1); + rd->sendVertex(v2); + rd->sendVertex(v3); + } + rd->setColor(Color3::white()); + rd->endPrimitive(); +} + + void Demo::onGraphics(RenderDevice* rd) { - + float angle, x, z; + app->debugCamera.getCoordinateFrame().rotation.toEulerAnglesXYZ(x, angle, z); + //message = Convert(toDegrees(angle)) + " X: " + Convert(app->debugCamera.getCoordinateFrame().translation.x) + " Z: " + Convert(app->debugCamera.getCoordinateFrame().translation.z); + //messageTime = System::time(); + CoordinateFrame frame = CoordinateFrame(app->debugCamera.getCoordinateFrame().rotation, app->debugCamera.getCoordinateFrame().translation); Vector2 mousepos = Vector2(0,0); G3D::uint8 num = 0; rd->window()->getRelativeMouseState(mousepos, num); @@ -1056,45 +1360,46 @@ void Demo::onGraphics(RenderDevice* rd) { } - + // Setup lighting app->renderDevice->enableLighting(); + app->renderDevice->setShadeMode(RenderDevice::SHADE_SMOOTH); app->renderDevice->setAmbientLightColor(Color3(1,1,1)); - Draw::axes(CoordinateFrame(Vector3(0, 0, 0)), app->renderDevice); - - makeFlag(Vector3(-1, 3.5, 0), rd); + //Draw::axes(CoordinateFrame(Vector3(0, 0, 0)), app->renderDevice); + //makeFlag(Vector3(-1, 3.5, 0), rd); + //Vector3 vector = app->debugCamera.getCoordinateFrame().translation + app->debugCamera.getCoordinateFrame().lookVector()*20; app->renderDevice->setLight(0, GLight::directional(lighting.lightDirection, lighting.lightColor)); app->renderDevice->setAmbientLightColor(lighting.ambient); + //app->renderDevice->pushState(); + //app->renderDevice->popState(); + for(size_t i = 0; i < instances.size(); i++) { Instance* instance = instances.at(i); if(instance->className == "Part" && instance->parent != NULL) { + PhysicalInstance* part = (PhysicalInstance*)instance; - Vector3 size = part->size; - Vector3 pos = part->getCFrame().translation; - rd->setObjectToWorldMatrix(CoordinateFrame()); - Vector3 pos2 = Vector3((pos.x-size.x/2)/2,(pos.y-size.y/2)/2,(pos.z-size.z/2)/2); - Vector3 pos3 = Vector3((pos.x+size.x/2)/2,(pos.y+size.y/2)/2,(pos.z+size.z/2)/2); - Box box = Box(Vector3(0+size.x/4, 0+size.y/4, 0+size.z/4) ,Vector3(0-size.x/4,0-size.y/4,0-size.z/4)); - CoordinateFrame c = CoordinateFrame(part->getCFrame().rotation,Vector3(part->getCFrame().translation.x/2, part->getCFrame().translation.y/2, part->getCFrame().translation.z/2)); - Draw::box(c.toWorldSpace(box), app->renderDevice, part->color, Color4::clear()); + Draw::box(part->getBox(), app->renderDevice, part->color, Color4::clear()); if(selectedInstance == part) { - drawOutline(Vector3(0+size.x/4, 0+size.y/4, 0+size.z/4) ,Vector3(0-size.x/4,0-size.y/4,0-size.z/4), rd, lighting, Vector3(size.x/2, size.y/2, size.z/2), Vector3(pos.x/2, pos.y/2, pos.z/2), c); + Vector3 size = part->size; + Vector3 pos = part->getCFrame().translation; + drawOutline(Vector3(0+size.x/4, 0+size.y/4, 0+size.z/4) ,Vector3(0-size.x/4,0-size.y/4,0-size.z/4), rd, lighting, Vector3(size.x/2, size.y/2, size.z/2), Vector3(pos.x/2, pos.y/2, pos.z/2), part->getCFrameRenderBased()); } } } - + Box box; + //Draw::ray(testRay, rd, Color3::orange(), 1); - Vector3 gamepoint = Vector3(0, 5, 0); + /*Vector3 gamepoint = Vector3(0, 5, 0); Vector3 camerapoint = rd->getCameraToWorldMatrix().translation; float distance = pow(pow((double)gamepoint.x - (double)camerapoint.x, 2) + pow((double)gamepoint.y - (double)camerapoint.y, 2) + pow((double)gamepoint.z - (double)camerapoint.z, 2), 0.5); if(distance < 50 && distance > -50) @@ -1103,7 +1408,8 @@ void Demo::onGraphics(RenderDevice* rd) { if(distance < 0) distance = distance*-1; fntdominant->draw3D(rd, "Testing", CoordinateFrame(rd->getCameraToWorldMatrix().rotation, gamepoint), 0.04*distance, Color3::yellow(), Color3::black(), G3D::GFont::XALIGN_CENTER, G3D::GFont::YALIGN_CENTER); - } + }*/ + app->renderDevice->disableLighting(); if (app->sky.notNull()) { @@ -1153,9 +1459,6 @@ void Demo::onGraphics(RenderDevice* rd) { //Tools menu Draw::box(G3D::Box(Vector3(5, 185+offset,0),Vector3(75, 185+offset,0)),rd,Color4(0.6F,0.6F,0.6F,0.4F), Color4(0.6F,0.6F,0.6F,0.4F)); - fntlighttrek->draw2D(rd,"Group", Vector2(10,190+offset), 12, Color3::white(), Color4(0.5F,0.5F,0.5F,0.5F)); - fntlighttrek->draw2D(rd,"UnGroup", Vector2(10,215+offset), 12, Color3::white(), Color4(0.5F,0.5F,0.5F,0.5F)); - fntlighttrek->draw2D(rd,"Duplicate", Vector2(10,240+offset), 12, Color3::white(), Color4(0.5F,0.5F,0.5F,0.5F)); fntlighttrek->draw2D(rd,"MENU", Vector2(10,307+offset), 14, Color3::white(), Color4(0.5F,0.5F,0.5F,0.5F)); //G3D::GFont::draw2D("Debug Mode Enabled", Vector2(0,30), 20, Color3::white(), Color3::black()); //app->debugFont->draw2D("Dynamica 2004-2005 Simulation Client version " + VERSION + str, Vector2(0,0), 20, Color3::white(), Color3::black()); @@ -1220,6 +1523,9 @@ void App::main() { cursor = Texture::fromFile(GetFileInPath("/content/cursor2.png")); fntdominant = GFont::fromFile(GetFileInPath("/content/font/dominant.fnt")); fntlighttrek = GFont::fromFile(GetFileInPath("/content/font/lighttrek.fnt")); + cameraSound = GetFileInPath("/content/sounds/SWITCH3.wav"); + clickSound = GetFileInPath("/content/sounds/switch.wav"); + dingSound = GetFileInPath("/content/sounds/electronicpingshort.wav"); sky = Sky::create(NULL, ExePath() + "/content/sky/"); cursorid = cursor->openGLID(); applet->run(); @@ -1283,6 +1589,25 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) SetWindowPos(g3DWind, NULL, 0, 0, width, height, NULL); } break; + case WM_MOUSEMOVE: + { + if(app != 0) + { + POINT p; + if(GetCursorPos(&p)) + { + HWND wnd = WindowFromPoint(p); + if(wnd != app->getHWND()) + { + app->window()->setInputCaptureCount(0); + } + else + { + app->window()->setInputCaptureCount(200); + } + } + } + } default: { return DefWindowProc(hwnd, msg, wParam, lParam); @@ -1294,14 +1619,21 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) int main(int argc, char** argv) { //_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); //_CrtSetBreakAlloc(1279); - + try{ + tempPath = ((std::string)getenv("temp")) + "/Dynamica"; + CreateDirectory(tempPath.c_str(), NULL); + + message = tempPath; + messageTime = System::time(); + AudioPlayer::init(); GAppSettings settings; settings.window.resizable = true; - settings.window.fsaaSamples = 8; + //settings.window.fsaaSamples = 8; settings.writeLicenseFile = false; + settings.logFilename = tempPath + "/g3dlog.txt"; settings.window.center = true; //Using the damned SDL window now - SDLWindow* wnd = new SDLWindow(settings.window); + G3D::SDLWindow* wnd = new SDLWindow(settings.window); //wnd->setInputCaptureCount(200); wnd->setMouseVisible(false); @@ -1386,5 +1718,10 @@ int main(int argc, char** argv) { //messageTime = G3D::System::time(); app.run(); + } + catch(std::exception) + { + OnError(-1); + } return 0; }