diff --git a/Blocks3D.vcproj b/Blocks3D.vcproj
index d556d08..ea5e9d4 100644
--- a/Blocks3D.vcproj
+++ b/Blocks3D.vcproj
@@ -497,6 +497,10 @@
RelativePath=".\src\source\DataModel\SelectionService.cpp"
>
+
+
@@ -862,6 +866,10 @@
RelativePath=".\src\include\DataModelV2\SelectionService.h"
>
+
+
diff --git a/ThumbnailGeneratorInstance.cpp b/ThumbnailGeneratorInstance.cpp
new file mode 100644
index 0000000..cdf1164
--- /dev/null
+++ b/ThumbnailGeneratorInstance.cpp
@@ -0,0 +1,43 @@
+#include "DataModelV2/ThumbnailGeneratorInstance.h"
+#include "Application.h"
+#include "Globals.h"
+#include
+
+ThumbnailGeneratorInstance::ThumbnailGeneratorInstance(void)
+{
+ Instance::Instance();
+ name = "ThumbnailGenerator";
+ className = "ThumbnailGenerator";
+ canDelete = false;
+}
+
+ThumbnailGeneratorInstance::~ThumbnailGeneratorInstance(void) {}
+
+std::string ThumbnailGeneratorInstance::click(std::string fileType, int cx, int cy, bool hideSky)
+{
+ const G3D::GImage::Format format = G3D::GImage::stringToFormat(fileType);
+
+ RenderDevice* rd = g_usableApp->getRenderDevice();
+
+ // Disable the sky
+ if(hideSky)
+ g_usableApp->toggleSky();
+
+ // Update graphics
+ g_usableApp->onGraphics(rd);
+
+ // Sky SHOULD be gone now, and alpha channel should be present
+ G3D::GImage imgBuffer(cx, cy, 4);
+ rd->screenshotPic(imgBuffer, true, hideSky);
+
+ G3D::BinaryOutput binOut;
+ imgBuffer.encode(format, binOut);
+
+ // Temporary file saving
+ std::string fileSave = "./click_output." + fileType;
+ std::ofstream out(fileSave.c_str(), std::ios::out | std::ios::binary);
+ out.write(reinterpret_cast(binOut.getCArray()), binOut.length());
+
+ return "boop!";
+}
+
diff --git a/click_output.PNG b/click_output.PNG
new file mode 100644
index 0000000..eaa12a9
Binary files /dev/null and b/click_output.PNG differ
diff --git a/src/include/Application.h b/src/include/Application.h
index b2a45b1..0921f96 100644
--- a/src/include/Application.h
+++ b/src/include/Application.h
@@ -48,6 +48,7 @@ class Application { // : public GApp {
void setFocus(bool isFocused);
int getMode();
void unSetMode();
+ void toggleSky();
CameraController cameraController;
UserInput* userInput;
PropertyWindow* _propWindow;
@@ -55,6 +56,7 @@ class Application { // : public GApp {
RenderDevice* getRenderDevice();
void selectInstance(Instance* selectedInstance,PropertyWindow* propWindow);
void setMode(int mode);
+ SkyRef getSky();
Tool * tool;
void changeTool(Tool *);
@@ -82,6 +84,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/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/source/Application.cpp b/src/source/Application.cpp
index d58588c..e0f1510 100644
--- a/src/source/Application.cpp
+++ b/src/source/Application.cpp
@@ -117,8 +117,10 @@ Application::Application(HWND parentWindow) : _propWindow(NULL) { //: GApp(setti
quit=false;
rightButtonHolding=false;
mouseOnScreen=false;
+
// GApp replacement
renderDevice = new RenderDevice();
+
if (window != NULL) {
renderDevice->init(window, NULL);
}
@@ -194,6 +196,7 @@ void Application::onInit() {
_dataModel->setName("undefined");
_dataModel->font = g_fntdominant;
g_dataModel = _dataModel;
+ _hideSky = false;
#ifdef LEGACY_LOAD_G3DFUN_LEVEL
// Anchored this baseplate for XplicitNgine tests
@@ -503,9 +506,6 @@ void Application::exitApplication()
//endProgram = true;
}
-
-
-
void Application::onGraphics(RenderDevice* rd) {
G3D::uint8 num = 0;
@@ -514,27 +514,17 @@ 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)
@@ -547,14 +537,18 @@ 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));
+ // TODO: stick this into its own rendering thing
+ if(!_hideSky) {
+ renderDevice->clear(sky.isNull(), true, true);
+ if (sky.notNull()) sky->render(renderDevice, lighting);
+ } else {
+ printf("ThumbnailGenerator::click\n");
+
+ rd->setColorClearValue(Color4(0.0f, 0.0f, 0.0f, 0.0f));
+ renderDevice->clear(true, true, true);
+ toggleSky();
+ }
- renderDevice->clear(sky.isNull(), true, true);
- if (sky.notNull()) {
- sky->render(renderDevice, lighting);
- }
-
// Setup lighting
renderDevice->enableLighting();
@@ -564,115 +558,47 @@ 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.6F, 0.9F, 1.0F };
- //float lightDiffuse[] = { 0.6F, 0.4F, 0.9F, 1.0F };
- //float lightSpecular[] = { 0.8F, 0.6F, 1.0F, 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]))
{
- Vector3 size = part->getSize();
- Vector3 pos = part->getPosition();
- 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 size = part->getSize();
+ Vector3 pos = part->getPosition();
+ 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();
if (sky.notNull()) {
sky->renderLensFlare(renderDevice, lighting);
}
+
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();
}
@@ -709,6 +635,16 @@ G3D::RenderDevice* Application::getRenderDevice()
return renderDevice;
}
+G3D::SkyRef Application::getSky()
+{
+ return sky;
+}
+
+void Application::toggleSky()
+{
+ _hideSky = !_hideSky;
+}
+
void Application::onMouseLeftUp(G3D::RenderDevice* renderDevice, int x, int y)
{
_dataModel->getGuiRoot()->onMouseLeftUp(renderDevice, x, y);
@@ -731,7 +667,6 @@ void Application::onMouseMoved(int x,int y)
mouse.oldy = mouse.y;
mouse.x = x;
mouse.y = y;
- //tool->onMouseMoved(mouse);
mouseMoveState = true;
}
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/LevelInstance.cpp b/src/source/DataModelV2/LevelInstance.cpp
index 4b33578..14601f6 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/Listener/MenuButtonListener.cpp b/src/source/Listener/MenuButtonListener.cpp
index c595a4e..afd3bb4 100644
--- a/src/source/Listener/MenuButtonListener.cpp
+++ b/src/source/Listener/MenuButtonListener.cpp
@@ -15,6 +15,7 @@ void MenuButtonListener::onButton1MouseClick(BaseButtonInstance* button)
AppendMenu(mainmenu, MF_STRING, 100, "New");
AppendMenu(mainmenu, MF_STRING, 101, "Open...");
AppendMenu(mainmenu, MF_STRING, 102, "Close");
+ AppendMenu(mainmenu, MF_STRING, 103, "ThumbnailGenerator::click");
AppendMenu(mainmenu, MF_SEPARATOR, 0, NULL);
POINT p;
GetCursorPos(&p);
@@ -31,6 +32,8 @@ void MenuButtonListener::onButton1MouseClick(BaseButtonInstance* button)
case 102:
g_usableApp->QuitApp();
break;
+ case 103:
+ g_dataModel->getThumbnailGenerator()->click("PNG", 256, 256, true);
}
}
}
\ No newline at end of file