diff --git a/.gitignore b/.gitignore index 0fd87dc..1ecebc4 100644 --- a/.gitignore +++ b/.gitignore @@ -58,3 +58,5 @@ desktop.ini #Redist !Installer/Redist/* UpgradeLog.htm +click_output.JPEG +click_output.PNG diff --git a/Blocks3D.vcproj b/Blocks3D.vcproj index e061a64..e67dd6c 100644 --- a/Blocks3D.vcproj +++ b/Blocks3D.vcproj @@ -505,6 +505,10 @@ RelativePath=".\src\source\DataModel\SelectionService.cpp" > + + @@ -666,6 +670,14 @@ > + + + + + + @@ -919,6 +935,14 @@ > + + + + + +ThumbnailGeneratorInstance::ThumbnailGeneratorInstance(void) +{ + Instance::Instance(); + name = "ThumbnailGenerator"; + className = "ThumbnailGenerator"; + canDelete = false; +} + +ThumbnailGeneratorInstance::~ThumbnailGeneratorInstance(void) {} + +/* + * TODO: + * Move functions like toggleSky into their own "Lighting" instance + * Make this headless, and allow for resolutions greater than the screen resolution +*/ +std::string ThumbnailGeneratorInstance::click(std::string fileType, int cx, int cy, bool hideSky) +{ + RenderDevice* rd = g_usableApp->getRenderDevice(); + GuiRootInstance* guiRoot = g_dataModel->getGuiRoot(); + const G3D::GImage::Format format = G3D::GImage::stringToFormat(fileType); + int prevWidth = rd->width(); + int prevHeight = rd->height(); + G3D::GImage imgBuffer(cx, cy, 4); + G3D::BinaryOutput binOut; + + guiRoot->hideGui(true); + g_usableApp->resize3DView(cx, cy); + + if(hideSky) + g_usableApp->toggleSky(); + + g_usableApp->onGraphics(rd); + rd->screenshotPic(imgBuffer, true, hideSky); + imgBuffer.encode(format, binOut); + + // Convert to Base64 string + std::string base64ImgStr = base64_encode(reinterpret_cast(binOut.getCArray()), binOut.length(), false); + + guiRoot->hideGui(false); + g_usableApp->resize3DView(prevWidth, prevHeight); + + return base64ImgStr; +} + diff --git a/src/include/Application.h b/src/include/Application.h index b2a45b1..d72fd0f 100644 --- a/src/include/Application.h +++ b/src/include/Application.h @@ -7,7 +7,6 @@ #include "IEBrowser.h" #include "Mouse.h" #include "Tool/Tool.h" -//#include "GuiRoot.h" class TextButtonInstance; class ImageButtonInstance; @@ -48,14 +47,18 @@ class Application { // : public GApp { void setFocus(bool isFocused); int getMode(); void unSetMode(); + + void toggleSky(); CameraController cameraController; UserInput* userInput; PropertyWindow* _propWindow; - void generateShadowMap(const CoordinateFrame& lightViewMatrix) const; + void generateShadowMap(const CoordinateFrame& lightViewMatrix) const; RenderDevice* getRenderDevice(); void selectInstance(Instance* selectedInstance,PropertyWindow* propWindow); void setMode(int mode); - + SkyRef getSky(); + void resize3DView(int w, int h); + Tool * tool; void changeTool(Tool *); Mouse mouse; @@ -82,6 +85,7 @@ class Application { // : public GApp { GAppSettings _settings; double lightProjX, lightProjY, lightProjNear, lightProjFar; IEBrowser* webBrowser; + bool _hideSky; protected: Stopwatch m_graphicsWatch; Stopwatch m_logicWatch; diff --git a/src/include/DataModelV2/DataModelInstance.h b/src/include/DataModelV2/DataModelInstance.h index 8dab766..9591ffa 100644 --- a/src/include/DataModelV2/DataModelInstance.h +++ b/src/include/DataModelV2/DataModelInstance.h @@ -2,6 +2,7 @@ #include "WorkspaceInstance.h" #include "LevelInstance.h" #include "PartInstance.h" +#include "ThumbnailGeneratorInstance.h" #include "SelectionService.h" #include "rapidxml/rapidxml.hpp" #include "GuiRootInstance.h" @@ -23,9 +24,12 @@ public: bool load(const char* filename,bool clearObjects); bool readXMLFileStream(std::ifstream* file); void drawMessage(RenderDevice*); - WorkspaceInstance* getWorkspace(); - LevelInstance * getLevel(); - XplicitNgine * getEngine(); + + WorkspaceInstance* getWorkspace(); + LevelInstance* getLevel(); + XplicitNgine* getEngine(); + ThumbnailGeneratorInstance* getThumbnailGenerator(); + std::string message; std::string _loadedFileName; bool showMessage; @@ -50,9 +54,10 @@ private: bool _legacyLoad; float _modY; WorkspaceInstance* workspace; - LevelInstance * level; + LevelInstance* level; GuiRootInstance* guiRoot; SelectionService* selectionService; + ThumbnailGeneratorInstance * thumbnailGenerator; bool running; XplicitNgine * xplicitNgine; }; diff --git a/src/include/DataModelV2/GuiRootInstance.h b/src/include/DataModelV2/GuiRootInstance.h index 5f916d0..7c5c812 100644 --- a/src/include/DataModelV2/GuiRootInstance.h +++ b/src/include/DataModelV2/GuiRootInstance.h @@ -18,7 +18,9 @@ public: void update(); bool mouseInGUI(G3D::RenderDevice* renderDevice,int x,int y); void onMouseLeftUp(G3D::RenderDevice* renderDevice, int x,int y); + void hideGui(bool doHide); private: std::string _message; G3D::RealTime _messageTime; + bool _hideGui; }; \ No newline at end of file diff --git a/src/include/DataModelV2/ThumbnailGeneratorInstance.h b/src/include/DataModelV2/ThumbnailGeneratorInstance.h new file mode 100644 index 0000000..988a15d --- /dev/null +++ b/src/include/DataModelV2/ThumbnailGeneratorInstance.h @@ -0,0 +1,14 @@ +#pragma once +#include "instance.h" + +class ThumbnailGeneratorInstance : + public Instance +{ +public: + // Constructor / Destructor + ThumbnailGeneratorInstance(void); + ~ThumbnailGeneratorInstance(void); + + // Functions + std::string click(std::string fileType, int cx, int cy, bool hideSky); +}; diff --git a/src/include/Globals.h b/src/include/Globals.h index d01fb67..ca7673b 100644 --- a/src/include/Globals.h +++ b/src/include/Globals.h @@ -29,6 +29,8 @@ extern bool running; extern DataModelInstance* g_dataModel; extern XplicitNgine* g_xplicitNgine; extern Application* g_usableApp; +extern SkyRef g_sky; +extern RenderDevice g_renderDevice; extern GFontRef g_fntdominant; extern GFontRef g_fntlighttrek; diff --git a/src/include/base64.h b/src/include/base64.h new file mode 100644 index 0000000..866505e --- /dev/null +++ b/src/include/base64.h @@ -0,0 +1,35 @@ +// +// base64 encoding and decoding with C++. +// Version: 2.rc.08 (release candidate) +// + +#ifndef BASE64_H_C0CE2A47_D10E_42C9_A27C_C883944E704A +#define BASE64_H_C0CE2A47_D10E_42C9_A27C_C883944E704A + +#include + +#if __cplusplus >= 201703L +#include +#endif // __cplusplus >= 201703L + +std::string base64_encode (std::string const& s, bool url = false); +std::string base64_encode_pem (std::string const& s); +std::string base64_encode_mime(std::string const& s); + +std::string base64_decode(std::string const& s, bool remove_linebreaks = false); +std::string base64_encode(unsigned char const*, size_t len, bool url = false); + +#if __cplusplus >= 201703L +// +// Interface with std::string_view rather than const std::string& +// Requires C++17 +// Provided by Yannic Bonenberger (https://github.com/Yannic) +// +std::string base64_encode (std::string_view s, bool url = false); +std::string base64_encode_pem (std::string_view s); +std::string base64_encode_mime(std::string_view s); + +std::string base64_decode(std::string_view s, bool remove_linebreaks = false); +#endif // __cplusplus >= 201703L + +#endif /* BASE64_H_C0CE2A47_D10E_42C9_A27C_C883944E704A */ diff --git a/src/source/Application.cpp b/src/source/Application.cpp index 8e0ef5e..5a7d908 100644 --- a/src/source/Application.cpp +++ b/src/source/Application.cpp @@ -33,10 +33,7 @@ #include "Listener/RotateButtonListener.h" #include "Faces.h" #define LEGACY_LOAD_G3DFUN_LEVEL -//Ray testRay; -//static int cursorid = 0; -//static int cursorOvrid = 0; -//static int currentcursorid = 0; + static bool mouseMovedBeginMotion = false; static POINT oldGlobalMouse; Vector2 oldMouse = Vector2(0,0); @@ -74,6 +71,7 @@ Application::Application(HWND parentWindow) : _propWindow(NULL) { //: GApp(setti CreateDirectory(tempPath.c_str(), NULL); _hWndMain = parentWindow; + _hideSky = false; HMODULE hThisInstance = GetModuleHandle(NULL); @@ -110,6 +108,10 @@ Application::Application(HWND parentWindow) : _propWindow(NULL) { //: GApp(setti _settings.writeLicenseFile = false; _settings.logFilename = tempPath + "/g3dlog.txt"; _settings.window.center = true; + + // Needs to be enabled if "B3DCCService" (still need to finalize that name) + //_settings.window.fsaaSamples = 8; + Win32Window* window = Win32Window::create(_settings.window,_hwndRenderer); ShowWindow(_hwndRenderer, SW_SHOW); ShowWindow(_hWndMain, SW_SHOW); @@ -288,16 +290,6 @@ void Application::onInit() { _dataModel->getSelectionService()->clearSelection(); _dataModel->getSelectionService()->addSelected(_dataModel); - - - - //setDesiredFrameRate(60); - - - - - //GApplet::onInit(); - } void Application::onCleanup() { @@ -313,12 +305,6 @@ void Application::onNetwork() { // Poll net messages here } - -//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 Application::onSimulation(RealTime rdt, SimTime sdt, SimTime idt) { if(_dataModel->isRunning()) @@ -425,7 +411,7 @@ int Application::getMode() void Application::drawOutline(Vector3 from, Vector3 to, RenderDevice* rd, LightingParameters lighting, Vector3 size, Vector3 pos, CoordinateFrame c) { rd->disableLighting(); - Color3 outline = Color3::cyan();//Color3(0.098F,0.6F,1.0F); + Color3 outline = Color3::cyan(); float offsetSize = 0.05F; //X Draw::box(c.toWorldSpace(Box(Vector3(from.x - offsetSize, from.y + offsetSize, from.z + offsetSize), Vector3(to.x + offsetSize, from.y - offsetSize, from.z - offsetSize))), rd, outline, Color4::clear()); @@ -500,8 +486,6 @@ void Application::drawOutline(Vector3 from, Vector3 to, RenderDevice* rd, Lighti void Application::exitApplication() { - //endApplet = true; - //endProgram = true; } @@ -515,27 +499,18 @@ void Application::onGraphics(RenderDevice* rd) { if (GetCursorPos(&mousepos)) { POINT pointm = mousepos; - if (ScreenToClient(_hWndMain, &mousepos)) - { - //mouseOnScreen = true; - //POINT pointm; - ///GetCursorPos(&pointm); - if(_hwndRenderer != WindowFromPoint(pointm)) //OLD: mousepos.x < 1 || mousepos.y < 1 || mousepos.x >= rd->getViewport().width()-1 || mousepos.y >= rd->getViewport().height()-1 + if (ScreenToClient(_hWndMain, &mousepos)) { - mouseOnScreen = false; - //ShowCursor(true); - //_window->setMouseVisible(true); - //rd->window()->setInputCaptureCount(0); + if(_hwndRenderer != WindowFromPoint(pointm)) + { + mouseOnScreen = false; + } + else + { + mouseOnScreen = true; + } + } - else - { - mouseOnScreen = true; - //SetCursor(NULL); - //_window->setMouseVisible(false); - //rd->window()->setInputCaptureCount(1); - } - - } } if(Globals::useMousePoint) @@ -548,13 +523,15 @@ void Application::onGraphics(RenderDevice* rd) { lighting.ambient = Color3(0.6F,0.6F,0.6F); renderDevice->setProjectionAndCameraMatrix(*cameraController.getCamera()); - // Cyan background - //renderDevice->setColorClearValue(Color3(0.0f, 0.5f, 1.0f)); - - renderDevice->clear(sky.isNull(), true, true); - if (sky.notNull()) { - sky->render(renderDevice, lighting); - } + // TODO: stick this into its own rendering thing + if(!_hideSky) { + renderDevice->clear(sky.isNull(), true, true); + if (sky.notNull()) sky->render(renderDevice, lighting); + } else { + rd->setColorClearValue(Color4(0.0f, 0.0f, 0.0f, 0.0f)); + renderDevice->clear(true, true, true); + toggleSky(); + } // Setup lighting renderDevice->enableLighting(); @@ -565,41 +542,18 @@ void Application::onGraphics(RenderDevice* rd) { renderDevice->setLight(0, GLight::directional(lighting.lightDirection, lighting.lightColor, true, true)); renderDevice->setAmbientLightColor(lighting.ambient); - //renderDevice->setBlendFunc(RenderDevice::BLEND_ONE, RenderDevice::BLEND_ONE); - - - - //renderDevice->setShininess(70); - //renderDevice->setSpecularCoefficient(Color3(0.1F, 0.1F, 0.1F)); - - //float lightAmbient[] = { 0.5F, 0.5F, 0.5F, 1.0F }; - //float lightDiffuse[] = { 0.6F, 0.6F, 0.6F, 1.0F }; - //float lightSpecular[] = { 0.8F, 0.8F, 0.8F, 1.0F }; - - //glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, lightAmbient); - //glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, lightDiffuse); - //glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, lightSpecular); - //glMateriali(GL_FRONT_AND_BACK, GL_SHININESS, 70); - - rd->beforePrimitive(); CoordinateFrame forDraw = rd->getObjectToWorldMatrix(); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); - //if(_dataModel->getWorkspace() != NULL) - _dataModel->getWorkspace()->render(rd); - //else throw std::exception("Workspace not found"); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_NORMAL_ARRAY); rd->setObjectToWorldMatrix(forDraw); rd->afterPrimitive(); - - //Draw::box(G3D::Box(mouse.getPosition()-Vector3(2,0.5F,1),mouse.getPosition()+Vector3(2,0.5F,1)), rd, Color3::cyan(), Color4::clear()); - for(size_t i = 0; i < _dataModel->getSelectionService()->getSelection().size(); i++) { if(PartInstance* part = dynamic_cast(g_dataModel->getSelectionService()->getSelection()[i])) @@ -609,18 +563,6 @@ void Application::onGraphics(RenderDevice* rd) { drawOutline(Vector3(0+size.x/2, 0+size.y/2, 0+size.z/2) ,Vector3(0-size.x/2,0-size.y/2,0-size.z/2), rd, lighting, Vector3(size.x/2, size.y/2, size.z/2), Vector3(pos.x, pos.y, pos.z), part->getCFrame()); } } - - - //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) - - //{ - // 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); - //} renderDevice->disableLighting(); @@ -629,51 +571,6 @@ void Application::onGraphics(RenderDevice* rd) { } renderDevice->push2D(); _dataModel->getGuiRoot()->renderGUI(renderDevice, m_graphicsWatch.FPS()); - /*rd->pushState(); - rd->beforePrimitive(); - - if(Globals::showMouse && mouseOnScreen) - { - glEnable( GL_TEXTURE_2D ); - glEnable(GL_BLEND);// you enable blending function - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - /* - std::vector instances = _dataModel->getWorkspace()->getAllChildren(); - currentcursorid = cursorid; - for(size_t i = 0; i < instances.size(); i++) - { - if(PartInstance* test = dynamic_cast(instances.at(i))) - { - float time = cameraController.getCamera()->worldRay(_dataModel->mousex, _dataModel->mousey, renderDevice->getViewport()).intersectionTime(test->getBox()); - //float time = testRay.intersectionTime(test->getBox()); - if (time != inf()) - { - currentcursorid = cursorOvrid; - break; - } - - } - } - */ - /*glBindTexture( GL_TEXTURE_2D, tool->getCursorId()); - - - glBegin( GL_QUADS ); - glTexCoord2d(0.0,0.0); - glVertex2f(mousepos.x-64, mousepos.y-64); - glTexCoord2d( 1.0,0.0 ); - glVertex2f(mousepos.x+64, mousepos.y-64); - glTexCoord2d(1.0,1.0 ); - glVertex2f(mousepos.x+64, mousepos.y+64 ); - glTexCoord2d( 0.0,1.0 ); - glVertex2f( mousepos.x-64, mousepos.y+64 ); - glEnd(); - - glDisable( GL_TEXTURE_2D );*/ - //} - - /*rd->afterPrimitive(); - rd->popState();*/ renderDevice->pop2D(); } @@ -732,7 +629,6 @@ void Application::onMouseMoved(int x,int y) mouse.oldy = mouse.y; mouse.x = x; mouse.y = y; - //tool->onMouseMoved(mouse); mouseMoveState = true; } @@ -748,26 +644,9 @@ void Application::onMouseWheel(int x,int y,short delta) void Application::run() { g_usableApp = this; - //setDebugMode(false); - //debugController.setActive(false); - /* - if (!createWindowClass("ToolWindowClass",ToolProc,GetModuleHandle(0))) - { - return; - } - - HWND propertyHWnd = CreateWindowEx( - WS_EX_TOOLWINDOW,"ToolWindowClass", "ToolWindow", - WS_SYSMENU | WS_VISIBLE | WS_CHILD, - 0, 0, 800, 64, - hWndMain, NULL, GetModuleHandle(0), NULL); - - ShowWindow(propertyHWnd,SW_SHOW); - */ UpdateWindow(_hWndMain); // Load objects here= - Globals::surface = Texture::fromFile(GetFileInPath("/content/images/surfacebr.png")); Globals::surfaceId = Globals::surface->getOpenGLID(); cameraSound = GetFileInPath("/content/sounds/SWITCH3.wav"); @@ -783,12 +662,7 @@ void Application::run() { RealTime lastWaitTime=0; MSG messages; - //RECT cRect; - //GetClientRect(_hWndMain,&cRect); - //renderDevice->notifyResize(cRect.right,cRect.bottom); - //Rect2D viewportRect = Rect2D::xywh(0,0,cRect.right,cRect.bottom); - //renderDevice->setViewport(viewportRect); - //window()->setInputCaptureCount(1); + resizeWithParent(_hWndMain); glEnable(GL_CULL_FACE); while (!quit) @@ -800,21 +674,15 @@ void Application::run() { m_userInputWatch.tick(); onUserInput(userInput); - //m_moduleManager->onUserInput(_userInput); m_userInputWatch.tock(); m_simulationWatch.tick(); - //debugController.doSimulation(clamp(timeStep, 0.0, 0.1)); - //g3dCamera.setCoordinateFrame - //(debugController.getCoordinateFrame()); double rate = simTimeRate; RealTime rdt = timeStep; SimTime sdt = timeStep * rate; SimTime idt = desiredFrameDuration * rate; - - onSimulation(rdt,sdt,idt); m_simulationWatch.tock(); @@ -863,6 +731,24 @@ void Application::resizeWithParent(HWND parentWindow) } +// These should be moved into a "Lighting" class +G3D::SkyRef Application::getSky() +{ + return sky; +} + +void Application::toggleSky() +{ + _hideSky = !_hideSky; +} + +void Application::resize3DView(int w, int h) +{ + Rect2D newViewport = Rect2D::xywh(0, 0, w, h); + renderDevice->notifyResize(w, h); + renderDevice->setViewport(newViewport); +} + void Application::QuitApp() { PostQuitMessage(0); @@ -871,7 +757,4 @@ void Application::QuitApp() void Application::onCreate(HWND parentWindow) { - //SetWindowLongPtr(hwndRenderer,GWL_USERDATA,(LONG)this); - //SetWindowLongPtr(hwndToolbox,GWL_USERDATA,(LONG)this); - //SetWindowLongPtr(hwndMain,GWL_USERDATA,(LONG)&app); } \ No newline at end of file diff --git a/src/source/DataModelV2/DataModelInstance.cpp b/src/source/DataModelV2/DataModelInstance.cpp index 162e16a..4da558f 100644 --- a/src/source/DataModelV2/DataModelInstance.cpp +++ b/src/source/DataModelV2/DataModelInstance.cpp @@ -2,6 +2,7 @@ #include "DataModelV2/GuiRootInstance.h" #include "DataModelV2/ToggleImageButtonInstance.h" #include "DataModelV2/DataModelInstance.h" +#include "DataModelV2/ThumbnailGeneratorInstance.h" #include #include #include @@ -20,14 +21,11 @@ DataModelInstance::DataModelInstance(void) workspace = new WorkspaceInstance(); guiRoot = new GuiRootInstance(); level = new LevelInstance(); + thumbnailGenerator = new ThumbnailGeneratorInstance(); + selectionService = new SelectionService(); selectionService->setPropertyWindow(g_usableApp->_propWindow); - //children.push_back(workspace); - //children.push_back(level); className = "dataModel"; - //mousex = 0; - //mousey = 0; - //mouseButton1Down = false; showMessage = false; canDelete = false; _modY=0; @@ -652,3 +650,8 @@ LevelInstance* DataModelInstance::getLevel() { return level; } + +ThumbnailGeneratorInstance* DataModelInstance::getThumbnailGenerator() +{ + return thumbnailGenerator; +} diff --git a/src/source/DataModelV2/GuiRootInstance.cpp b/src/source/DataModelV2/GuiRootInstance.cpp index 45c1762..fa83d96 100644 --- a/src/source/DataModelV2/GuiRootInstance.cpp +++ b/src/source/DataModelV2/GuiRootInstance.cpp @@ -43,6 +43,7 @@ GuiRootInstance::GuiRootInstance() : _message(""), _messageTime(0) { g_fntdominant = GFont::fromFile(GetFileInPath("/content/font/dominant.fnt")); g_fntlighttrek = GFont::fromFile(GetFileInPath("/content/font/lighttrek.fnt")); + _hideGui = false; //Bottom Left TextButtonInstance* button = makeTextButton(); @@ -434,6 +435,7 @@ void GuiRootInstance::setDebugMessage(std::string msg, G3D::RealTime msgTime) void GuiRootInstance::renderGUI(G3D::RenderDevice* rd, double fps) { + if(_hideGui) return; //TODO--Move these to their own instance std::stringstream stream; @@ -539,3 +541,7 @@ void GuiRootInstance::onMouseLeftUp(G3D::RenderDevice* renderDevice, int x,int y } } } + +void GuiRootInstance::hideGui(bool doHide) { + _hideGui = doHide; +} \ No newline at end of file diff --git a/src/source/DataModelV2/LevelInstance.cpp b/src/source/DataModelV2/LevelInstance.cpp index 08a25cc..cd51b6d 100644 --- a/src/source/DataModelV2/LevelInstance.cpp +++ b/src/source/DataModelV2/LevelInstance.cpp @@ -5,6 +5,7 @@ LevelInstance::LevelInstance(void) { Instance::Instance(); name = "Level"; + className = "LevelService"; winMessage = "You Won!"; loseMessage = "You Lost. Try Again"; timer = 60.0F; diff --git a/src/source/ErrorFunctions.cpp b/src/source/ErrorFunctions.cpp index 4b224f1..dd22c72 100644 --- a/src/source/ErrorFunctions.cpp +++ b/src/source/ErrorFunctions.cpp @@ -6,11 +6,8 @@ void OnError(int err, std::string msg) { - //g_usableApp->window()->setInputCaptureCount(0); - //g_usableApp->window()->setMouseVisible(true); std::string emsg = "An unexpected error has occured and "+g_appName+" has to quit. We're sorry!" + msg; std::string title = g_appName+" Crash"; - //clearInstances(); MessageBox(NULL, emsg.c_str(), title.c_str(), MB_OK); exit(err); } diff --git a/src/source/Globals.cpp b/src/source/Globals.cpp index f120eb4..ad1bc61 100644 --- a/src/source/Globals.cpp +++ b/src/source/Globals.cpp @@ -2,7 +2,6 @@ #include "Application.h" int Globals::surfaceId = 2; -//bool Globals::showMouse = true; bool Globals::useMousePoint = false; std::vector postRenderStack = std::vector(); diff --git a/src/source/IEBrowser.cpp b/src/source/IEBrowser.cpp index f88f173..c6ee146 100644 --- a/src/source/IEBrowser.cpp +++ b/src/source/IEBrowser.cpp @@ -54,9 +54,6 @@ HRESULT IEBrowser::doExternal(std::wstring funcName, else if (funcName==L"SetController") { bool ding = false; - //int len = SysStringLen(pDispParams->rgvarg->bstrVal)+1; - //char * args = new char[len]; - //WideCharToMultiByte(CP_ACP, 0, pDispParams->rgvarg->bstrVal, len, args, len, NULL, (LPBOOL)TRUE); if(pDispParams->rgvarg->intVal < 0 || pDispParams->rgvarg->intVal > 7) return S_OK; Enum::Controller::Value cont = (Enum::Controller::Value)pDispParams->rgvarg->intVal; @@ -78,20 +75,9 @@ HRESULT IEBrowser::doExternal(std::wstring funcName, return E_NOTIMPL; int j = pDispParams->rgvarg->intVal; int i = (pDispParams->rgvarg+1)->intVal; - //printf("Got values %d and %d", i, j); if(i > 5 || i < 0) return E_NOTIMPL; g_usableApp->changeTool(new SurfaceTool(i, j)); - /*VARIANT val1; - VARIANT val2; - unsigned int puArgErr; - HRESULT res = DispGetParam(pDispParams,1,VT_VARIANT,&val1, &puArgErr); - if(res != S_OK) - return res; - //res = DispGetParam(pDispParams,1,VT_UI4,&val2, &puArgErr); - //if(res != S_OK) - //return res; - */ return S_OK; } else if(funcName==L"SetColor") @@ -112,11 +98,6 @@ HRESULT IEBrowser::doExternal(std::wstring funcName, color.Flags = CC_FULLOPEN | CC_RGBINIT; if(ChooseColorA((LPCHOOSECOLOR)&color)) { - //DWORD dwR = GetRValue(color.rgbResult); - //DWORD dwG = GetGValue(color.rgbResult); - //DWORD dwB = GetBValue(color.rgbResult); - //wchar_t * str = L"Test"; - //swprintf_s(str, 16, L"#%02X%02X%02X", dwR, dwG, dwB); pVarResult->vt = VT_UI4; pVarResult->ulVal = color.rgbResult; } diff --git a/src/source/Listener/MenuButtonListener.cpp b/src/source/Listener/MenuButtonListener.cpp index c595a4e..4f0b02b 100644 --- a/src/source/Listener/MenuButtonListener.cpp +++ b/src/source/Listener/MenuButtonListener.cpp @@ -16,6 +16,7 @@ void MenuButtonListener::onButton1MouseClick(BaseButtonInstance* button) AppendMenu(mainmenu, MF_STRING, 101, "Open..."); AppendMenu(mainmenu, MF_STRING, 102, "Close"); AppendMenu(mainmenu, MF_SEPARATOR, 0, NULL); + POINT p; GetCursorPos(&p); int menuClick = TrackPopupMenu(mainmenu, TPM_LEFTBUTTON | TPM_RETURNCMD, p.x, p.y, 0, Globals::mainHwnd, 0); diff --git a/src/source/Listener/ModeSelectionListener.cpp b/src/source/Listener/ModeSelectionListener.cpp index a311e0d..15bbdf5 100644 --- a/src/source/Listener/ModeSelectionListener.cpp +++ b/src/source/Listener/ModeSelectionListener.cpp @@ -6,7 +6,6 @@ void ModeSelectionListener::onButton1MouseClick(BaseButtonInstance* button) { - //CoordinateFrame frame = g_usableApp->g3dCamera.getCoordinateFrame(); int mode = g_usableApp->getMode(); std::vector instances_2D = g_dataModel->getGuiRoot()->getAllChildren(); diff --git a/src/source/Mouse.cpp b/src/source/Mouse.cpp index de551ed..faf1cd8 100644 --- a/src/source/Mouse.cpp +++ b/src/source/Mouse.cpp @@ -20,7 +20,6 @@ void eprt(PartInstance * instance) { nearest=time; selectedInstance = instance; - //This is where dead code below was } } } @@ -30,7 +29,6 @@ PartInstance * Mouse::getTarget() selectedInstance = NULL; testRay = g_usableApp->cameraController.getCamera()->worldRay(x, y, g_usableApp->getRenderDevice()->getViewport()); nearest=std::numeric_limits::infinity(); - //Vector3 camPos = g_usableApp->cameraController.getCamera()->getCoordinateFrame().translation; for_each (g_dataModel->getWorkspace()->partObjects.begin(), g_dataModel->getWorkspace()->partObjects.end(), eprt); return selectedInstance; } diff --git a/src/source/PropertyWindow.cpp b/src/source/PropertyWindow.cpp index 855cadd..70890a2 100644 --- a/src/source/PropertyWindow.cpp +++ b/src/source/PropertyWindow.cpp @@ -73,7 +73,6 @@ LRESULT CALLBACK PropProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) break; case WM_DRAWITEM: { - std::cout << "Drawing?" << "\r\n"; COLORREF clrBackground; COLORREF clrForeground; TEXTMETRIC tm; diff --git a/src/source/Tool/ArrowTool.cpp b/src/source/Tool/ArrowTool.cpp index 106482c..2b64584 100644 --- a/src/source/Tool/ArrowTool.cpp +++ b/src/source/Tool/ArrowTool.cpp @@ -105,7 +105,6 @@ void ArrowTool::onMouseMoved(Mouse mouse) return; } PartInstance * target = mouse.getTarget(); - //if(target == NULL) } void ArrowTool::onSelect(Mouse mouse) { diff --git a/src/source/Tool/Tool.cpp b/src/source/Tool/Tool.cpp index 19c49cf..9cf0a11 100644 --- a/src/source/Tool/Tool.cpp +++ b/src/source/Tool/Tool.cpp @@ -2,8 +2,7 @@ Tool::Tool(void) { - //cursorString = GetFileInPath("/content/images/ArrowFarCursor.png"); - //cursorId = cursorRef->openGLID(); + } Tool::~Tool(void) @@ -21,12 +20,4 @@ void Tool::onSelect(Mouse mouse){} void Tool::onDeselect(Mouse mouse){} void Tool::onMouseScroll(Mouse mouse){} void Tool::onKeyDown(int key){} -void Tool::onKeyUp(int key){} -/*void Tool::setCursor(std::string str) -{ - //cursorString = str; -}*/ -/*int Tool::getCursorId() -{ - return TextureHandler::getTexturePermanent(cursorString); -}*/ \ No newline at end of file +void Tool::onKeyUp(int key){} \ No newline at end of file diff --git a/src/source/XplicitNgine/XplicitNgine.cpp b/src/source/XplicitNgine/XplicitNgine.cpp index 8a434ff..7421fb7 100644 --- a/src/source/XplicitNgine/XplicitNgine.cpp +++ b/src/source/XplicitNgine/XplicitNgine.cpp @@ -1,14 +1,6 @@ #include "XplicitNgine/XplicitNgine.h" #include "Globals.h" -//#define SIDE (0.5f) -//#define MASS (1.0) - -// constraints -//#define MAX_BODIES 65535 -//#define OBJ_DENSITY (5.0) -//#define MAX_CONTACT_PER_BODY 4 - XplicitNgine::XplicitNgine() { @@ -23,7 +15,6 @@ XplicitNgine::XplicitNgine() dWorldSetAutoDisableSteps(physWorld, 20); this->name = "PhysicsService"; - //dGeomID ground_geom = dCreatePlane(physSpace, 0, 1, 0, 0); } XplicitNgine::~XplicitNgine() @@ -58,7 +49,6 @@ void collisionCallback(void *data, dGeomID o1, dGeomID o2) contact[i].surface.mode = dContactBounce | dContactSlip1 | dContactSlip2 | dContactSoftERP | dContactSoftCFM | dContactApprox1; // Define contact surface properties - contact[i].surface.bounce = 0.5; //Elasticity contact[i].surface.mu = 0.4F; //Friction contact[i].surface.slip1 = 0.0; @@ -121,9 +111,6 @@ void XplicitNgine::deleteBody(PartInstance* partInstance) void XplicitNgine::createBody(PartInstance* partInstance) { - // calculate collisions - //dSpaceCollide (physSpace,0,&collisionCallback); - if(partInstance->physBody == NULL) { @@ -131,6 +118,7 @@ void XplicitNgine::createBody(PartInstance* partInstance) Vector3 partPosition = partInstance->getPosition(); Vector3 velocity = partInstance->getVelocity(); Vector3 rotVelocity = partInstance->getRotVelocity(); + // init body partInstance->physBody = dBodyCreate(physWorld); dBodySetData(partInstance->physBody, partInstance); @@ -146,11 +134,6 @@ void XplicitNgine::createBody(PartInstance* partInstance) dVector3 result; dGeomBoxGetLengths(partInstance->physGeom[0], result); - //printf("[XplicitNgine] Part Geom Size: %.1f, %.1f, %.1f\n", - // result[0], - // result[1], - // result[2] - //); } else { @@ -161,11 +144,7 @@ void XplicitNgine::createBody(PartInstance* partInstance) mass.setBox(sqrt(partSize.x*2), sqrt(partSize.y*2), sqrt(partSize.z*2), 0.7F); dBodySetMass(partInstance->physBody, &mass); - // Debug output - - // Create rigid body - //printf("[XplicitNgine] Created Geom for PartInstance\n"); dBodySetPosition(partInstance->physBody, partPosition.x, partPosition.y, @@ -187,8 +166,6 @@ void XplicitNgine::createBody(PartInstance* partInstance) dGeomSetRotation(partInstance->physGeom[0], rotation); dBodySetRotation(partInstance->physBody, rotation); - //printf("[XplicitNgine] Created Body for PartInstance\n"); - if(!partInstance->isAnchored() && !partInstance->isDragging()) dGeomSetBody(partInstance->physGeom[0], partInstance->physBody); @@ -203,10 +180,7 @@ void XplicitNgine::createBody(PartInstance* partInstance) const dReal* physPosition = dBodyGetPosition(partInstance->physBody); - // TODO: Rotation code - // Probably should be done AFTER we get physics KINDA working!!! const dReal* physRotation = dGeomGetRotation(partInstance->physGeom[0]); - //partInstance->setPosition(Vector3(physPosition[0], physPosition[1], physPosition[2])); partInstance->setCFrameNoSync(CoordinateFrame( Matrix3(physRotation[0],physRotation[1],physRotation[2], physRotation[4],physRotation[5],physRotation[6], @@ -214,9 +188,6 @@ void XplicitNgine::createBody(PartInstance* partInstance) Vector3(physPosition[0], physPosition[1], physPosition[2]))); } } -//STEP SHOULD NOT BE HERE! - //dWorldQuickStep(physWorld, stepSize); - //dJointGroupEmpty(contactgroup); } void XplicitNgine::step(float stepSize) @@ -224,8 +195,6 @@ void XplicitNgine::step(float stepSize) dJointGroupEmpty(contactgroup); dSpaceCollide (physSpace,0,&collisionCallback); dWorldQuickStep(physWorld, stepSize); - //dWorldStepFast1(physWorld, stepSize*2, 100); - //dWorldStep(physWorld, stepSize); } void XplicitNgine::updateBody(PartInstance *partInstance) diff --git a/src/source/base64.cpp b/src/source/base64.cpp new file mode 100644 index 0000000..7666ef8 --- /dev/null +++ b/src/source/base64.cpp @@ -0,0 +1,282 @@ +/* + base64.cpp and base64.h + + base64 encoding and decoding with C++. + More information at + https://renenyffenegger.ch/notes/development/Base64/Encoding-and-decoding-base-64-with-cpp + + Version: 2.rc.08 (release candidate) + + Copyright (C) 2004-2017, 2020, 2021 René Nyffenegger + + This source code is provided 'as-is', without any express or implied + warranty. In no event will the author be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this source code must not be misrepresented; you must not + claim that you wrote the original source code. If you use this source code + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original source code. + + 3. This notice may not be removed or altered from any source distribution. + + René Nyffenegger rene.nyffenegger@adp-gmbh.ch + +*/ + +#include "base64.h" + +#include +#include + + // + // Depending on the url parameter in base64_chars, one of + // two sets of base64 characters needs to be chosen. + // They differ in their last two characters. + // +static const char* base64_chars[2] = { + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789" + "+/", + + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789" + "-_"}; + +static unsigned int pos_of_char(const unsigned char chr) { + // + // Return the position of chr within base64_encode() + // + + if (chr >= 'A' && chr <= 'Z') return chr - 'A'; + else if (chr >= 'a' && chr <= 'z') return chr - 'a' + ('Z' - 'A') + 1; + else if (chr >= '0' && chr <= '9') return chr - '0' + ('Z' - 'A') + ('z' - 'a') + 2; + else if (chr == '+' || chr == '-') return 62; // Be liberal with input and accept both url ('-') and non-url ('+') base 64 characters ( + else if (chr == '/' || chr == '_') return 63; // Ditto for '/' and '_' + else + // + // 2020-10-23: Throw std::exception rather than const char* + //(Pablo Martin-Gomez, https://github.com/Bouska) + // + throw std::runtime_error("Input is not valid base64-encoded data."); +} + +static std::string insert_linebreaks(std::string str, size_t distance) { + // + // Provided by https://github.com/JomaCorpFX, adapted by me. + // + if (!str.length()) { + return ""; + } + + size_t pos = distance; + + while (pos < str.size()) { + str.insert(pos, "\n"); + pos += distance + 1; + } + + return str; +} + +template +static std::string encode_with_line_breaks(String s) { + return insert_linebreaks(base64_encode(s, false), line_length); +} + +template +static std::string encode_pem(String s) { + return encode_with_line_breaks(s); +} + +template +static std::string encode_mime(String s) { + return encode_with_line_breaks(s); +} + +template +static std::string encode(String s, bool url) { + return base64_encode(reinterpret_cast(s.data()), s.length(), url); +} + +std::string base64_encode(unsigned char const* bytes_to_encode, size_t in_len, bool url) { + + size_t len_encoded = (in_len +2) / 3 * 4; + + unsigned char trailing_char = url ? '.' : '='; + + // + // Choose set of base64 characters. They differ + // for the last two positions, depending on the url + // parameter. + // A bool (as is the parameter url) is guaranteed + // to evaluate to either 0 or 1 in C++ therefore, + // the correct character set is chosen by subscripting + // base64_chars with url. + // + const char* base64_chars_ = base64_chars[url]; + + std::string ret; + ret.reserve(len_encoded); + + unsigned int pos = 0; + + while (pos < in_len) { + ret.push_back(base64_chars_[(bytes_to_encode[pos + 0] & 0xfc) >> 2]); + + if (pos+1 < in_len) { + ret.push_back(base64_chars_[((bytes_to_encode[pos + 0] & 0x03) << 4) + ((bytes_to_encode[pos + 1] & 0xf0) >> 4)]); + + if (pos+2 < in_len) { + ret.push_back(base64_chars_[((bytes_to_encode[pos + 1] & 0x0f) << 2) + ((bytes_to_encode[pos + 2] & 0xc0) >> 6)]); + ret.push_back(base64_chars_[ bytes_to_encode[pos + 2] & 0x3f]); + } + else { + ret.push_back(base64_chars_[(bytes_to_encode[pos + 1] & 0x0f) << 2]); + ret.push_back(trailing_char); + } + } + else { + + ret.push_back(base64_chars_[(bytes_to_encode[pos + 0] & 0x03) << 4]); + ret.push_back(trailing_char); + ret.push_back(trailing_char); + } + + pos += 3; + } + + + return ret; +} + +template +static std::string decode(String encoded_string, bool remove_linebreaks) { + // + // decode(…) is templated so that it can be used with String = const std::string& + // or std::string_view (requires at least C++17) + // + + if (encoded_string.empty()) return std::string(); + + if (remove_linebreaks) { + + std::string copy(encoded_string); + + copy.erase(std::remove(copy.begin(), copy.end(), '\n'), copy.end()); + + return base64_decode(copy, false); + } + + size_t length_of_string = encoded_string.length(); + size_t pos = 0; + + // + // The approximate length (bytes) of the decoded string might be one or + // two bytes smaller, depending on the amount of trailing equal signs + // in the encoded string. This approximation is needed to reserve + // enough space in the string to be returned. + // + size_t approx_length_of_decoded_string = length_of_string / 4 * 3; + std::string ret; + ret.reserve(approx_length_of_decoded_string); + + while (pos < length_of_string) { + // + // Iterate over encoded input string in chunks. The size of all + // chunks except the last one is 4 bytes. + // + // The last chunk might be padded with equal signs or dots + // in order to make it 4 bytes in size as well, but this + // is not required as per RFC 2045. + // + // All chunks except the last one produce three output bytes. + // + // The last chunk produces at least one and up to three bytes. + // + + size_t pos_of_char_1 = pos_of_char(encoded_string[pos+1] ); + + // + // Emit the first output byte that is produced in each chunk: + // + ret.push_back(static_cast( ( (pos_of_char(encoded_string[pos+0]) ) << 2 ) + ( (pos_of_char_1 & 0x30 ) >> 4))); + + if ( ( pos + 2 < length_of_string ) && // Check for data that is not padded with equal signs (which is allowed by RFC 2045) + encoded_string[pos+2] != '=' && + encoded_string[pos+2] != '.' // accept URL-safe base 64 strings, too, so check for '.' also. + ) + { + // + // Emit a chunk's second byte (which might not be produced in the last chunk). + // + unsigned int pos_of_char_2 = pos_of_char(encoded_string[pos+2] ); + ret.push_back(static_cast( (( pos_of_char_1 & 0x0f) << 4) + (( pos_of_char_2 & 0x3c) >> 2))); + + if ( ( pos + 3 < length_of_string ) && + encoded_string[pos+3] != '=' && + encoded_string[pos+3] != '.' + ) + { + // + // Emit a chunk's third byte (which might not be produced in the last chunk). + // + ret.push_back(static_cast( ( (pos_of_char_2 & 0x03 ) << 6 ) + pos_of_char(encoded_string[pos+3]) )); + } + } + + pos += 4; + } + + return ret; +} + +std::string base64_decode(std::string const& s, bool remove_linebreaks) { + return decode(s, remove_linebreaks); +} + +std::string base64_encode(std::string const& s, bool url) { + return encode(s, url); +} + +std::string base64_encode_pem (std::string const& s) { + return encode_pem(s); +} + +std::string base64_encode_mime(std::string const& s) { + return encode_mime(s); +} + +#if __cplusplus >= 201703L +// +// Interface with std::string_view rather than const std::string& +// Requires C++17 +// Provided by Yannic Bonenberger (https://github.com/Yannic) +// + +std::string base64_encode(std::string_view s, bool url) { + return encode(s, url); +} + +std::string base64_encode_pem(std::string_view s) { + return encode_pem(s); +} + +std::string base64_encode_mime(std::string_view s) { + return encode_mime(s); +} + +std::string base64_decode(std::string_view s, bool remove_linebreaks) { + return decode(s, remove_linebreaks); +} + +#endif // __cplusplus >= 201703L diff --git a/src/source/main.cpp b/src/source/main.cpp index 6eade86..18a8bd3 100644 --- a/src/source/main.cpp +++ b/src/source/main.cpp @@ -63,12 +63,7 @@ LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) LRESULT CALLBACK ToolboxProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { - //Application *app = (Application *)GetWindowLongPtr(hwnd, GWL_USERDATA); MessageBox(NULL, (LPCSTR)wParam, (LPCSTR)lParam, 1); - //if (app==NULL) - //{ - //return DefWindowProc(hwnd, msg, wParam, lParam); - //} switch(msg) { case WM_SIZE: @@ -152,24 +147,11 @@ int main(int argc, char** argv) { try{ #endif hresult = OleInitialize(NULL); - -/* IInternetSecurityManager *pSecurityMgr; - IInternetZoneManager *pZoneMgr; - LPCWSTR site1 = SysAllocString(L"http://www.androdome.com"); - - hr = CoCreateInstance(CLSID_InternetSecurityManager, NULL, CLSCTX_INPROC_SERVER, IID_IInternetSecurityManager, (void**)&pSecurityMgr); - - pSecurityMgr->SetZoneMapping((DWORD)2, site1, (DWORD)0); // 2 = Trusted Site, site1 is the URL to add, and 0 is to create the entry. -*/ - - - if (!AXRegister()) return 0; INITCOMMONCONTROLSEX icc; -// WNDCLASSEX wcx; /* Initialize common controls. Also needed for MANIFEST's */ @@ -179,10 +161,6 @@ int main(int argc, char** argv) { InitCommonControlsEx(&icc); AudioPlayer::init(); - /* GAppSettings settings; - settings.window.resizable = true; - settings.writeLicenseFile = false; - settings.window.center = true; */ HMODULE hThisInstance = GetModuleHandle(NULL); if (!createWindowClass("mainHWND",WndProc,hThisInstance))