Skip to content

Commit

Permalink
Further improvements to overall system stability and other minor adju…
Browse files Browse the repository at this point in the history
…stments have been made to enhance the user experience
  • Loading branch information
jacob1 committed Apr 1, 2016
1 parent 535ade0 commit 46d0962
Show file tree
Hide file tree
Showing 8 changed files with 216 additions and 14 deletions.
1 change: 1 addition & 0 deletions src/PowderToy.h
@@ -1,6 +1,7 @@
#pragma once
#include <string>

extern int depth3d;
void EngineProcess();
void ClipboardPush(std::string text);
std::string ClipboardPull();
Expand Down
172 changes: 161 additions & 11 deletions src/PowderToySDL.cpp
Expand Up @@ -47,6 +47,7 @@ extern "C" {

#include "gui/dialogues/ErrorMessage.h"
#include "gui/dialogues/ConfirmPrompt.h"
#include "gui/dialogues/InformationMessage.h"
#include "gui/interface/Keys.h"
#include "gui/Style.h"

Expand All @@ -66,6 +67,7 @@ SDL_SysWMinfo sdl_wminfo;
Atom XA_CLIPBOARD, XA_TARGETS, XA_UTF8_STRING;
#endif

int depth3d = 0;
std::string clipboardText = "";

int desktopWidth = 1280, desktopHeight = 1024;
Expand Down Expand Up @@ -193,10 +195,78 @@ void blit()
SDL_GL_SwapBuffers();
}
#else
int mousex = 0, mousey = 0;
void DrawPixel(pixel * vid, pixel color, int x, int y)
{
if (x >= 0 && x < WINDOWW && y >= 0 && y < WINDOWH)
vid[x+y*WINDOWW] = color;
}

void DrawCursor(pixel * vid)
{
//vid[100+100*WINDOWW] = 255<<24|PIXRGB(100, 0, 100);
for (int j = 1; j <= 9; j++)
{
for (int i = 0; i <= j; i++)
{
if (i == 0 || i == j)
DrawPixel(vid, 0xFFFFFFFF, mousex+i, mousey+j);
else
DrawPixel(vid, 0xFF000000, mousex+i, mousey+j);
}
}
DrawPixel(vid, 0xFFFFFFFF, mousex, mousey+10);
for (int i = 0; i < 5; i++)
{
DrawPixel(vid, 0xFF000000, mousex+1+i, mousey+10);
DrawPixel(vid, 0xFFFFFFFF, mousex+6+i, mousey+10);
}
DrawPixel(vid, 0xFFFFFFFF, mousex, mousey+11);
DrawPixel(vid, 0xFF000000, mousex+1, mousey+11);
DrawPixel(vid, 0xFF000000, mousex+2, mousey+11);
DrawPixel(vid, 0xFFFFFFFF, mousex+3, mousey+11);
DrawPixel(vid, 0xFF000000, mousex+4, mousey+11);
DrawPixel(vid, 0xFF000000, mousex+5, mousey+11);
DrawPixel(vid, 0xFFFFFFFF, mousex+6, mousey+11);

DrawPixel(vid, 0xFFFFFFFF, mousex, mousey+12);
DrawPixel(vid, 0xFF000000, mousex+1, mousey+12);
DrawPixel(vid, 0xFFFFFFFF, mousex+2, mousey+12);
DrawPixel(vid, 0xFFFFFFFF, mousex+4, mousey+12);
DrawPixel(vid, 0xFF000000, mousex+5, mousey+12);
DrawPixel(vid, 0xFF000000, mousex+6, mousey+12);
DrawPixel(vid, 0xFFFFFFFF, mousex+7, mousey+12);

DrawPixel(vid, 0xFFFFFFFF, mousex, mousey+13);
DrawPixel(vid, 0xFFFFFFFF, mousex+1, mousey+13);
DrawPixel(vid, 0xFFFFFFFF, mousex+4, mousey+13);
DrawPixel(vid, 0xFF000000, mousex+5, mousey+13);
DrawPixel(vid, 0xFF000000, mousex+6, mousey+13);
DrawPixel(vid, 0xFFFFFFFF, mousex+7, mousey+13);

DrawPixel(vid, 0xFFFFFFFF, mousex, mousey+14);
for (int i = 0; i < 2; i++)
{
DrawPixel(vid, 0xFFFFFFFF, mousex+5, mousey+14+i);
DrawPixel(vid, 0xFF000000, mousex+6, mousey+14+i);
DrawPixel(vid, 0xFF000000, mousex+7, mousey+14+i);
DrawPixel(vid, 0xFFFFFFFF, mousex+8, mousey+14+i);

DrawPixel(vid, 0xFFFFFFFF, mousex+6, mousey+16+i);
DrawPixel(vid, 0xFF000000, mousex+7, mousey+16+i);
DrawPixel(vid, 0xFF000000, mousex+8, mousey+16+i);
DrawPixel(vid, 0xFFFFFFFF, mousex+9, mousey+16+i);
}

DrawPixel(vid, 0xFFFFFFFF, mousex+7, mousey+18);
DrawPixel(vid, 0xFFFFFFFF, mousex+8, mousey+18);
}
void blit(pixel * vid)
{
if(sdl_scrn)
{
if (depth3d)
DrawCursor(vid);
pixel * src = vid;
int j, x = 0, y = 0, w = WINDOWW, h = WINDOWH, pitch = WINDOWW;
pixel *dst;
Expand All @@ -208,26 +278,55 @@ void blit(pixel * vid)
{
//pixel format conversion
int i;
pixel px;
pixel px, lastpx, nextpx;
SDL_PixelFormat *fmt = sdl_scrn->format;
for (j=0; j<h; j++)
{
for (i=0; i<w; i++)
{
px = src[i];
dst[i] = ((PIXR(px)>>fmt->Rloss)<<fmt->Rshift)|
((PIXG(px)>>fmt->Gloss)<<fmt->Gshift)|
((PIXB(px)>>fmt->Bloss)<<fmt->Bshift);
if (depth3d)
{
// not supported properly, but give them some effect anyway
lastpx = i >= depth3d && i < w+depth3d ? src[i-depth3d] : 0;
nextpx = i >= -depth3d && i < w-depth3d ? src[i+depth3d] : 0;
dst[i] = ((PIXR(lastpx)>>fmt->Rloss)<<fmt->Rshift)|
((PIXG(nextpx)>>fmt->Gloss)<<fmt->Gshift)|
((PIXB(nextpx)>>fmt->Bloss)<<fmt->Bshift);
}
else
dst[i] = src[i];
}
dst+=sdl_scrn->pitch/PIXELSIZE;
src+=pitch;
}
}
else
{
int i;
pixel px, lastpx, nextpx;
for (j=0; j<h; j++)
{
memcpy(dst, src, w*PIXELSIZE);
for (i=0; i<w; i++)

{
px = src[i];
if (depth3d)
{
lastpx = i >= depth3d && i < w+depth3d ? src[i-depth3d] : 0;
nextpx = i >= -depth3d && i < w-depth3d ? src[i+depth3d] : 0;
float redshift = PIXB(lastpx)*.3f + PIXG(lastpx)*.3f;
if (redshift > 255*.3f)
redshift = 255*.3f;
float blueshift = PIXR(nextpx)*.3f + PIXG(nextpx)*.3f;
if (blueshift > 255*.3f)
blueshift = 255*.3f;
dst[i] = PIXRGB((int)(PIXR(lastpx)*.69f+redshift), (int)(PIXG(nextpx)*.3f), (int)(PIXB(nextpx)*.69f+blueshift));
}
else
dst[i] = src[i];
}
//memcpy(dst, src, w*PIXELSIZE);
dst+=sdl_scrn->pitch/PIXELSIZE;
src+=pitch;
}
Expand All @@ -241,9 +340,12 @@ void blit2(pixel * vid, int currentScale)
{
if(sdl_scrn)
{
if (depth3d)
DrawCursor(vid);
pixel * src = vid;
int j, x = 0, y = 0, w = WINDOWW, h = WINDOWH, pitch = WINDOWW;
pixel *dst;
pixel px, lastpx, nextpx;
int i,k;
if (SDL_MUSTLOCK(sdl_scrn))
if (SDL_LockSurface(sdl_scrn)<0)
Expand All @@ -252,7 +354,6 @@ void blit2(pixel * vid, int currentScale)
if (SDL_MapRGB(sdl_scrn->format,0x33,0x55,0x77)!=PIXPACK(0x335577))
{
//pixel format conversion
pixel px;
SDL_PixelFormat *fmt = sdl_scrn->format;
for (j=0; j<h; j++)
{
Expand All @@ -261,9 +362,15 @@ void blit2(pixel * vid, int currentScale)
for (i=0; i<w; i++)
{
px = src[i];
px = ((PIXR(px)>>fmt->Rloss)<<fmt->Rshift)|
((PIXG(px)>>fmt->Gloss)<<fmt->Gshift)|
((PIXB(px)>>fmt->Bloss)<<fmt->Bshift);
if (depth3d)
{
// not supported properly, but give them some effect anyway
lastpx = i >= depth3d/2 && i < w+depth3d/2 ? src[i-depth3d/2] : 0;
nextpx = i >= -depth3d/2 && i < w-depth3d/2 ? src[i+depth3d/2] : 0;
px = ((PIXR(lastpx)>>fmt->Rloss)<<fmt->Rshift)|
((PIXG(nextpx)>>fmt->Gloss)<<fmt->Gshift)|
((PIXB(nextpx)>>fmt->Bloss)<<fmt->Bshift);
}
dst[i*2]=px;
dst[i*2+1]=px;
}
Expand All @@ -280,8 +387,21 @@ void blit2(pixel * vid, int currentScale)
{
for (i=0; i<w; i++)
{
dst[i*2]=src[i];
dst[i*2+1]=src[i];
px = src[i];
if (depth3d)
{
lastpx = i >= depth3d/2 && i < w+depth3d/2 ? src[i-depth3d/2] : 0;
nextpx = i >= -depth3d/2 && i < w-depth3d/2 ? src[i+depth3d/2] : 0;
float redshift = PIXB(lastpx)*.3f + PIXG(lastpx)*.3f;
if (redshift > 255*.3f)
redshift = 255*.3f;
float blueshift = PIXR(nextpx)*.3f + PIXG(nextpx)*.3f;
if (blueshift > 255*.3f)
blueshift = 255*.3f;
px = PIXRGB((int)(PIXR(lastpx)*.69f+redshift), (int)(PIXG(nextpx)*.3f), (int)(PIXB(nextpx)*.69f+blueshift));
}
dst[i*2] = px;
dst[i*2+1] = px;
}
dst+=sdl_scrn->pitch/PIXELSIZE;
}
Expand Down Expand Up @@ -488,6 +608,8 @@ void EventProcess(SDL_Event event)
break;
case SDL_MOUSEMOTION:
engine->onMouseMove(event.motion.x*inputScale, event.motion.y*inputScale);
mousex = event.motion.x*inputScale;
mousey = event.motion.y*inputScale;
break;
case SDL_MOUSEBUTTONDOWN:
if (event.button.button == SDL_BUTTON_WHEELUP)
Expand All @@ -502,10 +624,14 @@ void EventProcess(SDL_Event event)
{
engine->onMouseClick(event.motion.x*inputScale, event.motion.y*inputScale, event.button.button);
}
mousex = event.motion.x*inputScale;
mousey = event.motion.y*inputScale;
break;
case SDL_MOUSEBUTTONUP:
if (event.button.button != SDL_BUTTON_WHEELUP && event.button.button != SDL_BUTTON_WHEELDOWN)
engine->onMouseUnclick(event.motion.x*inputScale, event.motion.y*inputScale, event.button.button);
mousex = event.motion.x*inputScale;
mousey = event.motion.y*inputScale;
break;
#ifdef OGLI
case SDL_VIDEORESIZE:
Expand Down Expand Up @@ -591,6 +717,25 @@ void DoubleScreenDialog()
#endif
}
}

void ThreeDeeDialog()
{
std::stringstream message;
message << "We hear your requests, everyone has been asking for a 3D version of TPT. It has long been rejected as 'impossible', but that just isn't true. Many hours of work have been put into finally making a full 3D TPT a reality. ";
message << "\nUpon hitting 'Confirm', 3D mode will enable.";
if (ConfirmPrompt::Blocking("Enable 3D Mode", message.str()))
{
depth3d = -3;
SDL_ShowCursor(0);
new InformationMessage("Success!", "3D Mode enabled!\nYou may disable this at any time in simulation settings for compatibility with 2D saves. I hope you brought your glasses!", false);
}
else
{
ErrorMessage::Blocking("Not using 3D Mode", "You make TPT sad");
}
}

bool show3dDialog = true;
void EngineProcess()
{
double frameTimeAvg = 0.0f, correctedFrameTimeAvg = 0.0f;
Expand Down Expand Up @@ -648,6 +793,11 @@ void EngineProcess()
showDoubleScreenDialog = false;
DoubleScreenDialog();
}
if (show3dDialog)
{
show3dDialog = false;
ThreeDeeDialog();
}
}
#ifdef DEBUG
std::cout << "Breaking out of EngineProcess" << std::endl;
Expand Down
20 changes: 18 additions & 2 deletions src/gui/options/OptionsController.cpp
Expand Up @@ -4,6 +4,7 @@
OptionsController::OptionsController(GameModel * gModel_, ControllerCallback * callback_):
gModel(gModel_),
callback(callback_),
temp_3ddepth(depth3d),
HasExited(false)
{
view = new OptionsView();
Expand Down Expand Up @@ -81,18 +82,33 @@ void OptionsController::SetFastQuit(bool fastquit)
model->SetFastQuit(fastquit);
}

void OptionsController::Set3dDepth(int depth)
{
temp_3ddepth = depth;
}

OptionsView * OptionsController::GetView()
{
return view;
}

#ifdef SDL_INC
#include "SDL/SDL.h"
#else
#include "SDL.h"
#endif
void OptionsController::Exit()
{
if(ui::Engine::Ref().GetWindow() == view)
if (ui::Engine::Ref().GetWindow() == view)
{
ui::Engine::Ref().CloseWindow();
}
if(callback)
depth3d = temp_3ddepth;
if (depth3d)
SDL_ShowCursor(0);
else
SDL_ShowCursor(1);
if (callback)
callback->ControllerExit();
HasExited = true;
}
Expand Down
2 changes: 2 additions & 0 deletions src/gui/options/OptionsController.h
Expand Up @@ -14,6 +14,7 @@ class OptionsController {
OptionsView * view;
OptionsModel * model;
ControllerCallback * callback;
int temp_3ddepth;
public:
bool HasExited;
OptionsController(GameModel * gModel_, ControllerCallback * callback_);
Expand All @@ -28,6 +29,7 @@ class OptionsController {
void SetScale(bool scale);
void SetFastQuit(bool fastquit);
void SetShowAvatars(bool showAvatars);
void Set3dDepth(int depth);
void Exit();
OptionsView * GetView();
virtual ~OptionsController();
Expand Down
19 changes: 18 additions & 1 deletion src/gui/options/OptionsView.cpp
Expand Up @@ -14,14 +14,15 @@
#endif

#include "OptionsView.h"
#include "Format.h"
#include "gui/Style.h"
#include "gui/interface/Button.h"
#include "gui/interface/Label.h"
#include "gui/interface/DropDown.h"
#include "gui/dialogues/ErrorMessage.h"

OptionsView::OptionsView():
ui::Window(ui::Point(-1, -1), ui::Point(300, 330)){
ui::Window(ui::Point(-1, -1), ui::Point(300, 348)){

ui::Label * tempLabel = new ui::Label(ui::Point(4, 5), ui::Point(Size.X-8, 14), "Simulation Options");
tempLabel->SetTextColour(style::Colour::InformationTitle);
Expand Down Expand Up @@ -217,6 +218,22 @@ OptionsView::OptionsView():
AddComponent(tempLabel);
AddComponent(showAvatars);

class DepthAction: public ui::TextboxAction
{
OptionsView * v;
public:
DepthAction(OptionsView * v_) { v = v_; }
virtual void TextChangedCallback(ui::Textbox * sender) { v->c->Set3dDepth(format::StringToNumber<int>(sender->GetText())); }
};
depthTextbox = new ui::Textbox(ui::Point(8, Size.Y-58), ui::Point(25, 16), format::NumberToString<int>(depth3d));
depthTextbox->SetInputType(ui::Textbox::Numeric);
depthTextbox->SetActionCallback(new DepthAction(this));
AddComponent(depthTextbox);

tempLabel = new ui::Label(ui::Point(depthTextbox->Position.X+depthTextbox->Size.X+3, depthTextbox->Position.Y), ui::Point(Size.X-28, 16), "\bg- Change the depth of the 3d effect");
tempLabel->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; tempLabel->Appearance.VerticalAlign = ui::Appearance::AlignMiddle;
AddComponent(tempLabel);

class DataFolderAction: public ui::ButtonAction
{
public:
Expand Down

1 comment on commit 46d0962

@iczero
Copy link
Contributor

@iczero iczero commented on 46d0962 Apr 1, 2016

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

YAY! 3D! :) And it actually works... This is awesome!

Please sign in to comment.