Merge pull request #111 from Vulpovile/modnark

Modnark
This commit is contained in:
Vulpovile
2022-10-14 08:24:53 -07:00
committed by GitHub
31 changed files with 921 additions and 201 deletions

View File

@@ -457,6 +457,10 @@
/>
</FileConfiguration>
</File>
<File
RelativePath=".\src\source\DataModelV2\LightingInstance.cpp"
>
</File>
<File
RelativePath=".\src\source\DataModelV2\PartInstance.cpp"
>
@@ -505,6 +509,14 @@
RelativePath=".\src\source\DataModel\SelectionService.cpp"
>
</File>
<File
RelativePath=".\src\source\DataModelV2\SoundInstance.cpp"
>
</File>
<File
RelativePath=".\src\source\DataModelV2\SoundService.cpp"
>
</File>
<File
RelativePath=".\ThumbnailGeneratorInstance.cpp"
>
@@ -866,6 +878,10 @@
RelativePath=".\src\include\DataModelV2\LevelInstance.h"
>
</File>
<File
RelativePath=".\src\include\DataModelV2\LightingInstance.h"
>
</File>
<File
RelativePath=".\src\include\DataModelV2\PartInstance.h"
>
@@ -878,6 +894,14 @@
RelativePath=".\src\include\DataModelV2\SelectionService.h"
>
</File>
<File
RelativePath=".\src\include\DataModelV2\SoundInstance.h"
>
</File>
<File
RelativePath=".\src\include\DataModelV2\SoundService.h"
>
</File>
<File
RelativePath=".\src\include\DataModelV2\ThumbnailGeneratorInstance.h"
>

View File

@@ -21,9 +21,15 @@ ThumbnailGeneratorInstance::~ThumbnailGeneratorInstance(void) {}
*/
std::string ThumbnailGeneratorInstance::click(std::string fileType, int cx, int cy, bool hideSky)
{
if(!G3D::GImage::supportedFormat(fileType)) {
printf("%s is not a valid fileType.", fileType);
return "";
}
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);
@@ -33,7 +39,7 @@ std::string ThumbnailGeneratorInstance::click(std::string fileType, int cx, int
g_usableApp->resize3DView(cx, cy);
if(hideSky)
g_usableApp->toggleSky();
g_dataModel->getLighting()->suppressSky(true);
g_usableApp->onGraphics(rd);
rd->screenshotPic(imgBuffer, true, hideSky);

BIN
content/sounds/bass.wav Normal file

Binary file not shown.

BIN
content/sounds/collide.wav Normal file

Binary file not shown.

Binary file not shown.

BIN
content/sounds/snap.wav Normal file

Binary file not shown.

BIN
content/sounds/splat.wav Normal file

Binary file not shown.

BIN
content/sounds/swoosh.wav Normal file

Binary file not shown.

BIN
content/sounds/victory.wav Normal file

Binary file not shown.

View File

@@ -48,7 +48,6 @@ class Application { // : public GApp {
int getMode();
void unSetMode();
void toggleSky();
CameraController cameraController;
UserInput* userInput;
PropertyWindow* _propWindow;
@@ -56,7 +55,6 @@ class Application { // : public GApp {
RenderDevice* getRenderDevice();
void selectInstance(Instance* selectedInstance,PropertyWindow* propWindow);
void setMode(int mode);
SkyRef getSky();
void resize3DView(int w, int h);
Tool * tool;
@@ -68,7 +66,6 @@ class Application { // : public GApp {
RenderDevice* renderDevice;
//void initGUI();
HWND _hWndMain;
SkyRef sky;
bool quit;
bool mouseOnScreen;
bool rightButtonHolding;
@@ -85,7 +82,6 @@ class Application { // : public GApp {
GAppSettings _settings;
double lightProjX, lightProjY, lightProjNear, lightProjFar;
IEBrowser* webBrowser;
bool _hideSky;
protected:
Stopwatch m_graphicsWatch;
Stopwatch m_logicWatch;

View File

@@ -6,6 +6,7 @@ class AudioPlayer
public:
AudioPlayer(void);
~AudioPlayer(void);
static void playSound(std::string);
static void init();
static void playSound(std::string);
};

View File

@@ -1,12 +1,18 @@
#pragma once
// Instances
#include "WorkspaceInstance.h"
#include "LevelInstance.h"
#include "PartInstance.h"
#include "ThumbnailGeneratorInstance.h"
#include "SelectionService.h"
#include "rapidxml/rapidxml.hpp"
#include "GuiRootInstance.h"
#include "ThumbnailGeneratorInstance.h"
#include "XplicitNgine/XplicitNgine.h"
#include "SoundService.h"
#include "LightingInstance.h"
// Libraries
#include "rapidxml/rapidxml.hpp"
class GuiRootInstance;
@@ -25,10 +31,13 @@ public:
bool readXMLFileStream(std::ifstream* file);
void drawMessage(RenderDevice*);
// Instance getters
WorkspaceInstance* getWorkspace();
LevelInstance* getLevel();
XplicitNgine* getEngine();
ThumbnailGeneratorInstance* getThumbnailGenerator();
SoundService* getSoundService();
LightingInstance* getLighting();
std::string message;
std::string _loadedFileName;
@@ -53,11 +62,16 @@ private:
std::string _errMsg;
bool _legacyLoad;
float _modY;
// Instances
WorkspaceInstance* workspace;
LevelInstance* level;
GuiRootInstance* guiRoot;
SelectionService* selectionService;
ThumbnailGeneratorInstance * thumbnailGenerator;
ThumbnailGeneratorInstance* thumbnailGenerator;
XplicitNgine* xplicitNgine;
SoundService* soundService;
LightingInstance* lightingInstance;
bool running;
XplicitNgine * xplicitNgine;
};

View File

@@ -2,7 +2,6 @@
#include <G3DAll.h>
#include "propertyGrid.h"
#include "map"
//#include "Properties/BoolProperty.h"
class Instance
{

View File

@@ -0,0 +1,44 @@
#pragma once
#include "Instance.h"
class LightingInstance :
public Instance
{
public:
LightingInstance(void);
~LightingInstance(void);
// Getters
G3D::Color3 getTopAmbient();
G3D::Color3 getBottomAmbient();
G3D::Color3 getSpotLight();
G3D::Color4 getClearColor();
G3D::SkyRef getSky();
G3D::LightingParameters getLightingParameters();
// Setters
void setTopAmbient(G3D::Color3 newValue);
void setBottomAmbient(G3D::Color3 newValue);
void setSpotLight(G3D::Color3 newValue);
void setClearColor(G3D::Color4 clearColor);
// Functions
void drawSky();
void suppressSky(bool doSuppress);
void update();
void drawEffects();
void drawOutlines(Vector3 from, Vector3 to, RenderDevice* rd, Vector3 size, Vector3 pos, CoordinateFrame c);
// Properties
void PropUpdate(LPPROPGRIDITEM &pItem);
std::vector<PROPGRIDITEM> getProperties();
private:
G3D::Color3 topAmbient;
G3D::Color3 bottomAmbient;
G3D::Color3 spotLight;
G3D::Color4 clearColor;
G3D::SkyRef sky;
G3D::LightingParameters lighting;
bool _hideSky;
};

View File

@@ -17,7 +17,7 @@ public:
virtual void PartInstance::postRender(RenderDevice* rd);
virtual void render(RenderDevice*);
virtual void renderName(RenderDevice*);
//Surfaces
Enum::SurfaceType::Value top;
Enum::SurfaceType::Value front;
@@ -25,8 +25,14 @@ public:
Enum::SurfaceType::Value back;
Enum::SurfaceType::Value left;
Enum::SurfaceType::Value bottom;
//Shapes
Enum::Shape::Value shape;
//OnTocuh
Enum::ActionType::Value OnTouchAction;
Enum::Sound::Value OnTouchSound;
//Variables
Color3 color;
bool canCollide;
@@ -43,6 +49,13 @@ public:
Box getScaledBox();
CoordinateFrame getCFrame();
//OnTouch Getters
bool isSingleShot();
int getTouchesToTrigger();
int getUniqueObjectsToTrigger();
int getChangeScore();
float getChangeTimer();
//Setters
void setParent(Instance* parent);
void setPosition(Vector3);
@@ -64,6 +77,9 @@ public:
bool collides(PartInstance * part);
bool collides(Box);
// onTouch
void onTouch();
//Properties
virtual std::vector<PROPGRIDITEM> getProperties();
virtual void PropUpdate(LPPROPGRIDITEM &pItem);
@@ -77,4 +93,12 @@ private:
bool dragging;
Box itemBox;
GLuint glList;
};
// OnTouch
bool singleShot;
int touchesToTrigger;
int uniqueObjectsToTrigger;
int changeScore;
float changeTimer;
bool _touchedOnce;
};

View File

@@ -0,0 +1,30 @@
#pragma once
#include "Instance.h"
class SoundInstance :
public Instance
{
public:
SoundInstance(void);
~SoundInstance(void);
// Getters
float getSoundVolume();
std::string getSoundId();
bool isPlayedOnRemove();
bool isLooped();
// Setters
void setSoundVolume(float newVolume);
void setSoundId(std::string newSoundId);
void setIsPlayedOnRemove(bool isPlayed);
void setIsLooped(bool isLooped);
// Functions
void play();
private:
float soundVolume;
std::string soundId;
bool playOnRemove;
bool looped;
};

View File

@@ -0,0 +1,16 @@
#pragma once
#include "Instance.h"
#include "SoundInstance.h"
class SoundService :
public Instance
{
public:
SoundService(void);
~SoundService(void);
float getMusicVolume();
void playSound(Instance* sound);
private:
float musicVolume;
};

View File

@@ -32,4 +32,12 @@ namespace Enum
NoChange = 0, Increase = 1, Decrease = 2
};
}
namespace Sound
{
enum Value {
NoSound = 0, Victory = 1, Boing = 2, Bomb = 3,
Ping = 4, Break = 5, Splat = 6, Swoosh = 7,
Snap = 8, Page = 9
};
}
}

View File

@@ -71,7 +71,6 @@ Application::Application(HWND parentWindow) : _propWindow(NULL) { //: GApp(setti
CreateDirectory(tempPath.c_str(), NULL);
_hWndMain = parentWindow;
_hideSky = false;
HMODULE hThisInstance = GetModuleHandle(NULL);
@@ -130,6 +129,8 @@ Application::Application(HWND parentWindow) : _propWindow(NULL) { //: GApp(setti
return;
}
AudioPlayer::init();
_window = renderDevice->window();
_window->makeCurrent();
@@ -294,7 +295,6 @@ void Application::onInit() {
void Application::onCleanup() {
clearInstances();
sky->~Sky();
}
void Application::onLogic() {
@@ -407,90 +407,10 @@ int Application::getMode()
return _mode;
}
void Application::drawOutline(Vector3 from, Vector3 to, RenderDevice* rd, LightingParameters lighting, Vector3 size, Vector3 pos, CoordinateFrame c)
{
rd->disableLighting();
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());
Draw::box(c.toWorldSpace(Box(Vector3(from.x - offsetSize, to.y + offsetSize, from.z + offsetSize), Vector3(to.x + offsetSize, to.y - offsetSize, from.z - offsetSize))), rd, outline, Color4::clear());
Draw::box(c.toWorldSpace(Box(Vector3(from.x - offsetSize, to.y + offsetSize, to.z + offsetSize), Vector3(to.x + offsetSize, to.y - offsetSize, to.z - offsetSize))), rd, outline, Color4::clear());
Draw::box(c.toWorldSpace(Box(Vector3(from.x - offsetSize, from.y + offsetSize, to.z + offsetSize), Vector3(to.x + offsetSize, from.y - offsetSize, to.z - offsetSize))), rd, outline, Color4::clear());
//Y
Draw::box(c.toWorldSpace(Box(Vector3(from.x + offsetSize, from.y - offsetSize + 0.1, from.z + offsetSize), Vector3(from.x - offsetSize, to.y + offsetSize - 0.1, from.z - offsetSize))), rd, outline, Color4::clear());
Draw::box(c.toWorldSpace(Box(Vector3(to.x + offsetSize, from.y - offsetSize + 0.1, from.z + offsetSize), Vector3(to.x - offsetSize, to.y + offsetSize - 0.1, from.z - offsetSize))), rd, outline, Color4::clear());
Draw::box(c.toWorldSpace(Box(Vector3(to.x + offsetSize, from.y - offsetSize + 0.1, to.z + offsetSize), Vector3(to.x - offsetSize, to.y + offsetSize-0.1, to.z - offsetSize))), rd, outline, Color4::clear());
Draw::box(c.toWorldSpace(Box(Vector3(from.x + offsetSize, from.y - offsetSize + 0.1, to.z + offsetSize), Vector3(from.x - offsetSize, to.y + offsetSize - 0.1, to.z - offsetSize))), rd, outline, Color4::clear());
//Z
Draw::box(c.toWorldSpace(Box(Vector3(from.x + offsetSize, from.y + offsetSize, from.z - offsetSize), Vector3(from.x - offsetSize, from.y - offsetSize, to.z + offsetSize))), rd, outline, Color4::clear());
Draw::box(c.toWorldSpace(Box(Vector3(from.x + offsetSize, to.y + offsetSize, from.z - offsetSize), Vector3(from.x - offsetSize, to.y - offsetSize, to.z + offsetSize))), rd, outline, Color4::clear());
Draw::box(c.toWorldSpace(Box(Vector3(to.x + offsetSize, from.y + offsetSize, from.z - offsetSize), Vector3(to.x - offsetSize, from.y - offsetSize, to.z + offsetSize))), rd, outline, Color4::clear());
Draw::box(c.toWorldSpace(Box(Vector3(to.x + offsetSize, to.y + offsetSize, from.z - offsetSize), Vector3(to.x - offsetSize, to.y - offsetSize, to.z + offsetSize))), rd, outline, Color4::clear());
if(_mode == ARROWS)
{
AABox box;
c.toWorldSpace(Box(from, to)).getBounds(box);
float max = box.high().y - pos.y;
Draw::arrow(pos, Vector3(0, 1.5+max, 0), rd);
Draw::arrow(pos, Vector3(0, (-1.5)-max, 0), rd);
max = box.high().x - pos.x;
Draw::arrow(pos, Vector3(1.5+max, 0, 0), rd);
Draw::arrow(pos, Vector3((-1.5)-max, 0, 0), rd);
max = box.high().z - pos.z;
Draw::arrow(pos, Vector3(0, 0, 1.5+max), rd);
Draw::arrow(pos, Vector3(0, 0, (-1.5)-max), rd);
}
else if(_mode == RESIZE)
{
Color3 sphereColor = outline;
Vector3 gamepoint = pos;
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 < 200)
{
float multiplier = distance * 0.025F/2;
if(multiplier < 0.25F)
multiplier = 0.25F;
Vector3 position = pos + (c.lookVector()*((size.z)+1));
Draw::sphere(Sphere(position, multiplier), rd, sphereColor, Color4::clear());
position = pos - (c.lookVector()*((size.z)+1));
Draw::sphere(Sphere(position, multiplier), rd, sphereColor, Color4::clear());
position = pos + (c.rightVector()*((size.x)+1));
Draw::sphere(Sphere(position, multiplier), rd, sphereColor, Color4::clear());
position = pos - (c.rightVector()*((size.x)+1));
Draw::sphere(Sphere(position, multiplier), rd, sphereColor, Color4::clear());
position = pos + (c.upVector()*((size.y)+1));
Draw::sphere(Sphere(position, multiplier), rd, sphereColor, Color4::clear());
position = pos - (c.upVector()*((size.y)+1));
Draw::sphere(Sphere(position, multiplier), rd, sphereColor, Color4::clear());
}
}
rd->enableLighting();
}
void Application::exitApplication()
{
}
void Application::onGraphics(RenderDevice* rd) {
G3D::uint8 num = 0;
@@ -519,57 +439,11 @@ void Application::onGraphics(RenderDevice* rd) {
ScreenToClient(_hWndMain, &mousepos);
}
LightingParameters lighting(G3D::toSeconds(2, 00, 00, PM));
lighting.ambient = Color3(0.6F,0.6F,0.6F);
renderDevice->setProjectionAndCameraMatrix(*cameraController.getCamera());
renderDevice->setProjectionAndCameraMatrix(*cameraController.getCamera());
// 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();
// Moved a lot of code to lighting
g_dataModel->getLighting()->update();
renderDevice->setShadeMode(RenderDevice::SHADE_SMOOTH);
renderDevice->setAmbientLightColor(Color3(1,1,1));
renderDevice->setLight(0, GLight::directional(lighting.lightDirection, lighting.lightColor, true, true));
renderDevice->setAmbientLightColor(lighting.ambient);
rd->beforePrimitive();
CoordinateFrame forDraw = rd->getObjectToWorldMatrix();
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
_dataModel->getWorkspace()->render(rd);
_dataModel->getWorkspace()->renderName(rd);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
rd->setObjectToWorldMatrix(forDraw);
rd->afterPrimitive();
for(size_t i = 0; i < _dataModel->getSelectionService()->getSelection().size(); i++)
{
if(PartInstance* part = dynamic_cast<PartInstance*>(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());
}
}
renderDevice->disableLighting();
if (sky.notNull()) {
sky->renderLensFlare(renderDevice, lighting);
}
renderDevice->push2D();
_dataModel->getGuiRoot()->renderGUI(renderDevice, m_graphicsWatch.FPS());
renderDevice->pop2D();
@@ -653,7 +527,6 @@ void Application::run() {
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/");
RealTime now=0, lastTime=0;
double simTimeRate = 1.0f;
float fps=30.0f;
@@ -732,17 +605,6 @@ 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);

View File

@@ -4,7 +4,7 @@
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#define NUM_SOUNDS 10
#define NUM_SOUNDS 32
static SDL_AudioSpec fmt;
static bool initiated = false;
@@ -23,7 +23,7 @@ void AudioPlayer::init()
initiated = true;
extern void mixaudio(void *unused, Uint8 *stream, int len);
fmt.freq = 22050;
fmt.format = AUDIO_S16;
fmt.format = AUDIO_S16LSB;
fmt.channels = 2;
fmt.samples = 1024; /* A good value for games */
fmt.callback = mixaudio;

View File

@@ -1,8 +1,12 @@
#include <string>
// Instances
#include "DataModelV2/GuiRootInstance.h"
#include "DataModelV2/ToggleImageButtonInstance.h"
#include "DataModelV2/DataModelInstance.h"
#include "DataModelV2/ThumbnailGeneratorInstance.h"
#include "DataModelV2/LightingInstance.h"
#include <fstream>
#include <iostream>
#include <sstream>
@@ -14,14 +18,16 @@
using namespace std;
using namespace rapidxml;
DataModelInstance::DataModelInstance(void)
{
// Instances
Instance::Instance();
workspace = new WorkspaceInstance();
guiRoot = new GuiRootInstance();
level = new LevelInstance();
thumbnailGenerator = new ThumbnailGeneratorInstance();
soundService = new SoundService();
lightingInstance = new LightingInstance();
selectionService = new SelectionService();
selectionService->setPropertyWindow(g_usableApp->_propWindow);
@@ -29,8 +35,13 @@ DataModelInstance::DataModelInstance(void)
showMessage = false;
canDelete = false;
_modY=0;
// Parent stuff
workspace->setParent(this);
level->setParent(this);
soundService->setParent(this);
lightingInstance->setParent(this);
_loadedFileName="..//skooter.rbxm";
listicon = 5;
running = false;
@@ -655,3 +666,13 @@ ThumbnailGeneratorInstance* DataModelInstance::getThumbnailGenerator()
{
return thumbnailGenerator;
}
SoundService* DataModelInstance::getSoundService()
{
return soundService;
}
LightingInstance* DataModelInstance::getLighting()
{
return lightingInstance;
}

View File

@@ -157,6 +157,8 @@ GuiRootInstance::GuiRootInstance() : _message(""), _messageTime(0)
button->fontLocationRelativeTo = Vector2(10, 0);
button->setAllColorsSame();
button->boxColorOvr = Color4(0.6F,0.6F,0.6F,0.4F);
button->name = "edit";
button->setButtonListener(menuListener);
button = makeTextButton();
button->boxBegin = Vector2(250, 0);
@@ -171,6 +173,8 @@ GuiRootInstance::GuiRootInstance() : _message(""), _messageTime(0)
button->fontLocationRelativeTo = Vector2(10, 0);
button->setAllColorsSame();
button->boxColorOvr = Color4(0.6F,0.6F,0.6F,0.4F);
button->name = "view";
button->setButtonListener(menuListener);
button = makeTextButton();
button->boxBegin = Vector2(375, 0);
@@ -185,6 +189,8 @@ GuiRootInstance::GuiRootInstance() : _message(""), _messageTime(0)
button->fontLocationRelativeTo = Vector2(10, 0);
button->setAllColorsSame();
button->boxColorOvr = Color4(0.6F,0.6F,0.6F,0.4F);
button->name = "insert";
button->setButtonListener(menuListener);
button = makeTextButton();
button->boxBegin = Vector2(500, 0);
@@ -199,7 +205,8 @@ GuiRootInstance::GuiRootInstance() : _message(""), _messageTime(0)
button->fontLocationRelativeTo = Vector2(10, 0);
button->setAllColorsSame();
button->boxColorOvr = Color4(0.6F,0.6F,0.6F,0.4F);
button->name = "format";
button->setButtonListener(menuListener);
//Menu
button = makeTextButton();

View File

@@ -20,11 +20,8 @@ Instance::Instance(const Instance &oinst)
className = oinst.className;
canDelete = oinst.canDelete;
listicon = oinst.listicon;
//setParent(oinst.parent);
}
void Instance::render(RenderDevice* rd)
{
for(size_t i = 0; i < children.size(); i++)

View File

@@ -123,7 +123,7 @@ std::vector<PROPGRIDITEM> LevelInstance::getProperties()
(LPARAM)scoreTxt,
PIT_EDIT));
properties.push_back(createPGI("Gameplay",
properties.push_back(createPGI("Gameplay",
"TimerUpAction",
"Some temporary string here",
(LPARAM)strActionType(TimerUpAction),
@@ -131,7 +131,7 @@ std::vector<PROPGRIDITEM> LevelInstance::getProperties()
TEXT("Nothing\0Pause\0Lose\0Draw\0Win\0")
));
properties.push_back(createPGI("Gameplay",
properties.push_back(createPGI("Gameplay",
"TimerAffectsScore",
"Some temporary string here",
(LPARAM)strAffectType(TimerAffectsScore),
@@ -140,6 +140,7 @@ std::vector<PROPGRIDITEM> LevelInstance::getProperties()
));
return properties;
}
void LevelInstance::PropUpdate(LPPROPGRIDITEM &pItem)
{
if(strcmp(pItem->lpszPropName, "InitialTimerValue") == 0)

View File

@@ -0,0 +1,260 @@
#include "DataModelV2/LightingInstance.h"
#include "Application.h"
#include "Globals.h"
#include "StringFunctions.h"
#include "Listener/ModeSelectionListener.h"
LightingInstance::LightingInstance(void)
{
Instance::Instance();
name = "Lighting";
className = "Lighting";
listicon = 10;
canDelete = false;
_hideSky = false;
lighting.setTime(G3D::toSeconds(2, 00, 00, PM));
// Maybe this is Top and Bottom Ambient?
lighting.ambient = Color3(0.5F, 0.5F, 0.5F);
lighting.lightColor = Color3(0.8F, 0.8F, 0.8F);
sky = Sky::create(NULL, ExePath() + "/content/sky/");
clearColor = Color4(0.0F, 0.0F, 0.0F, 0.0F);
}
LightingInstance::~LightingInstance(void)
{
sky->~Sky();
}
// Getters
G3D::SkyRef LightingInstance::getSky()
{
return sky;
}
G3D::LightingParameters LightingInstance::getLightingParameters()
{
return lighting;
}
std::vector<PROPGRIDITEM> LightingInstance::getProperties()
{
std::vector<PROPGRIDITEM> properties = Instance::getProperties();
properties.push_back(createPGI("Appearance",
"TopAmbient",
"The color of the TopAmbient for 3D Objects",
RGB((topAmbient.r*255),(topAmbient.g*255),(topAmbient.b*255)),
PIT_COLOR
));
properties.push_back(createPGI("Appearance",
"BottomAmbient",
"The color of the BottomAmbient for 3D Objects",
RGB((bottomAmbient.r*255),(bottomAmbient.g*255),(bottomAmbient.b*255)),
PIT_COLOR
));
properties.push_back(createPGI("Appearance",
"SpotLight",
"The color of the SpotLight",
RGB((spotLight.r*255),(spotLight.g*255),(spotLight.b*255)),
PIT_COLOR
));
properties.push_back(createPGI("Appearance",
"ClearColor",
"",
RGB((clearColor.r*255),(clearColor.g*255),(clearColor.b*255)),
PIT_COLOR
));
return properties;
}
void LightingInstance::PropUpdate(LPPROPGRIDITEM &item)
{
if(strcmp(item->lpszPropName, "TopAmbient") == 0)
{
topAmbient = Color3(
GetRValue(item->lpCurValue)/255.0F,
GetGValue(item->lpCurValue)/255.0F,
GetBValue(item->lpCurValue)/255.0F
);
}
if(strcmp(item->lpszPropName, "BottomAmbient") == 0)
{
bottomAmbient = Color3(
GetRValue(item->lpCurValue)/255.0F,
GetGValue(item->lpCurValue)/255.0F,
GetBValue(item->lpCurValue)/255.0F
);
}
if(strcmp(item->lpszPropName, "SpotLight") == 0)
{
spotLight = Color3(
GetRValue(item->lpCurValue)/255.0F,
GetGValue(item->lpCurValue)/255.0F,
GetBValue(item->lpCurValue)/255.0F
);
}
if(strcmp(item->lpszPropName, "ClearColor") == 0)
{
clearColor = Color3(
GetRValue(item->lpCurValue)/255.0F,
GetGValue(item->lpCurValue)/255.0F,
GetBValue(item->lpCurValue)/255.0F
);
}
else
Instance::PropUpdate(item);
}
// Functions
void LightingInstance::suppressSky(bool doSuppress)
{
_hideSky = doSuppress;
}
void LightingInstance::update()
{
RenderDevice* rd = g_usableApp->getRenderDevice();
if(!_hideSky) {
rd->clear(sky.isNull(), true, true);
if (sky.notNull()) sky->render(rd, lighting);
} else {
rd->setColorClearValue(clearColor);
rd->clear(true, true, true);
suppressSky(false);
}
// Setup lighting
rd->enableLighting();
rd->setShadeMode(RenderDevice::SHADE_SMOOTH);
rd->setAmbientLightColor(Color3(1,1,1));
rd->setLight(0, GLight::directional(lighting.lightDirection, lighting.lightColor, true, true));
rd->setAmbientLightColor(lighting.ambient);
rd->beforePrimitive();
CoordinateFrame forDraw = rd->getObjectToWorldMatrix();
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
g_dataModel->getWorkspace()->render(rd);
g_dataModel->getWorkspace()->renderName(rd);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
rd->setObjectToWorldMatrix(forDraw);
rd->afterPrimitive();
// Draw outlines
for(size_t i = 0; i < g_dataModel->getSelectionService()->getSelection().size(); i++)
{
if(PartInstance* part = dynamic_cast<PartInstance*>(g_dataModel->getSelectionService()->getSelection()[i]))
{
Vector3 size = part->getSize();
Vector3 pos = part->getPosition();
drawOutlines(
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,
Vector3(size.x/2, size.y/2, size.z/2),
Vector3(pos.x, pos.y, pos.z),
part->getCFrame()
);
}
}
rd->disableLighting();
drawEffects();
}
void LightingInstance::drawEffects()
{
RenderDevice* rd = g_usableApp->getRenderDevice();
if (sky.notNull()) {
sky->renderLensFlare(rd, lighting);
}
}
void LightingInstance::drawOutlines(Vector3 from, Vector3 to, RenderDevice* rd, Vector3 size, Vector3 pos, CoordinateFrame c)
{
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());
Draw::box(c.toWorldSpace(Box(Vector3(from.x - offsetSize, to.y + offsetSize, from.z + offsetSize), Vector3(to.x + offsetSize, to.y - offsetSize, from.z - offsetSize))), rd, outline, Color4::clear());
Draw::box(c.toWorldSpace(Box(Vector3(from.x - offsetSize, to.y + offsetSize, to.z + offsetSize), Vector3(to.x + offsetSize, to.y - offsetSize, to.z - offsetSize))), rd, outline, Color4::clear());
Draw::box(c.toWorldSpace(Box(Vector3(from.x - offsetSize, from.y + offsetSize, to.z + offsetSize), Vector3(to.x + offsetSize, from.y - offsetSize, to.z - offsetSize))), rd, outline, Color4::clear());
//Y
Draw::box(c.toWorldSpace(Box(Vector3(from.x + offsetSize, from.y - offsetSize + 0.1, from.z + offsetSize), Vector3(from.x - offsetSize, to.y + offsetSize - 0.1, from.z - offsetSize))), rd, outline, Color4::clear());
Draw::box(c.toWorldSpace(Box(Vector3(to.x + offsetSize, from.y - offsetSize + 0.1, from.z + offsetSize), Vector3(to.x - offsetSize, to.y + offsetSize - 0.1, from.z - offsetSize))), rd, outline, Color4::clear());
Draw::box(c.toWorldSpace(Box(Vector3(to.x + offsetSize, from.y - offsetSize + 0.1, to.z + offsetSize), Vector3(to.x - offsetSize, to.y + offsetSize-0.1, to.z - offsetSize))), rd, outline, Color4::clear());
Draw::box(c.toWorldSpace(Box(Vector3(from.x + offsetSize, from.y - offsetSize + 0.1, to.z + offsetSize), Vector3(from.x - offsetSize, to.y + offsetSize - 0.1, to.z - offsetSize))), rd, outline, Color4::clear());
//Z
Draw::box(c.toWorldSpace(Box(Vector3(from.x + offsetSize, from.y + offsetSize, from.z - offsetSize), Vector3(from.x - offsetSize, from.y - offsetSize, to.z + offsetSize))), rd, outline, Color4::clear());
Draw::box(c.toWorldSpace(Box(Vector3(from.x + offsetSize, to.y + offsetSize, from.z - offsetSize), Vector3(from.x - offsetSize, to.y - offsetSize, to.z + offsetSize))), rd, outline, Color4::clear());
Draw::box(c.toWorldSpace(Box(Vector3(to.x + offsetSize, from.y + offsetSize, from.z - offsetSize), Vector3(to.x - offsetSize, from.y - offsetSize, to.z + offsetSize))), rd, outline, Color4::clear());
Draw::box(c.toWorldSpace(Box(Vector3(to.x + offsetSize, to.y + offsetSize, from.z - offsetSize), Vector3(to.x - offsetSize, to.y - offsetSize, to.z + offsetSize))), rd, outline, Color4::clear());
if(g_usableApp->getMode() == ARROWS)
{
AABox box;
c.toWorldSpace(Box(from, to)).getBounds(box);
float max = box.high().y - pos.y;
Draw::arrow(pos, Vector3(0, 1.5+max, 0), rd);
Draw::arrow(pos, Vector3(0, (-1.5)-max, 0), rd);
max = box.high().x - pos.x;
Draw::arrow(pos, Vector3(1.5+max, 0, 0), rd);
Draw::arrow(pos, Vector3((-1.5)-max, 0, 0), rd);
max = box.high().z - pos.z;
Draw::arrow(pos, Vector3(0, 0, 1.5+max), rd);
Draw::arrow(pos, Vector3(0, 0, (-1.5)-max), rd);
}
else if(g_usableApp->getMode() == RESIZE)
{
Color3 sphereColor = outline;
Vector3 gamepoint = pos;
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 < 200)
{
float multiplier = distance * 0.025F/2;
if(multiplier < 0.25F)
multiplier = 0.25F;
Vector3 position = pos + (c.lookVector()*((size.z)+1));
Draw::sphere(Sphere(position, multiplier), rd, sphereColor, Color4::clear());
position = pos - (c.lookVector()*((size.z)+1));
Draw::sphere(Sphere(position, multiplier), rd, sphereColor, Color4::clear());
position = pos + (c.rightVector()*((size.x)+1));
Draw::sphere(Sphere(position, multiplier), rd, sphereColor, Color4::clear());
position = pos - (c.rightVector()*((size.x)+1));
Draw::sphere(Sphere(position, multiplier), rd, sphereColor, Color4::clear());
position = pos + (c.upVector()*((size.y)+1));
Draw::sphere(Sphere(position, multiplier), rd, sphereColor, Color4::clear());
position = pos - (c.upVector()*((size.y)+1));
Draw::sphere(Sphere(position, multiplier), rd, sphereColor, Color4::clear());
}
}
}

View File

@@ -4,6 +4,8 @@
#include <sstream>
#include <iomanip>
#include "Faces.h"
#include "AudioPlayer.h"
#include "StringFunctions.h"
PartInstance::PartInstance(void)
{
@@ -27,6 +29,15 @@ PartInstance::PartInstance(void)
left = Enum::SurfaceType::Smooth;
bottom = Enum::SurfaceType::Smooth;
shape = Enum::Shape::Block;
_touchedOnce = false;
// OnTouch
singleShot = true;
touchesToTrigger = 1;
uniqueObjectsToTrigger = 1;
changeScore = 0;
changeTimer = 0;
singleShot = true;
}
bool PartInstance::isDragging()
@@ -60,6 +71,32 @@ Vector3 PartInstance::getRotVelocity()
return rotVelocity;
}
// OnTouch
bool PartInstance::isSingleShot()
{
return singleShot;
}
int PartInstance::getTouchesToTrigger()
{
return touchesToTrigger;
}
int PartInstance::getUniqueObjectsToTrigger()
{
return uniqueObjectsToTrigger;
}
int PartInstance::getChangeScore()
{
return changeScore;
}
float PartInstance::getChangeTimer()
{
return changeTimer;
}
void PartInstance::setVelocity(Vector3 v)
{
velocity = v;
@@ -169,8 +206,6 @@ PartInstance::PartInstance(const PartInstance &oinst)
PVInstance::PVInstance(oinst);
physBody = NULL;
glList = glGenLists(1);
//name = oinst.name;
//className = "Part";
name = oinst.name;
canCollide = oinst.canCollide;
setParent(oinst.parent);
@@ -188,6 +223,17 @@ PartInstance::PartInstance(const PartInstance &oinst)
bottom = oinst.bottom;
shape = oinst.shape;
changed = true;
// OnTouch
singleShot = oinst.singleShot;
touchesToTrigger = oinst.touchesToTrigger;
uniqueObjectsToTrigger = oinst.uniqueObjectsToTrigger;
changeScore = oinst.changeScore;
changeTimer = oinst.changeTimer;
OnTouchAction = oinst.OnTouchAction;
OnTouchSound = oinst.OnTouchSound;
singleShot = oinst.singleShot;
_touchedOnce = false;
}
void PartInstance::setSize(Vector3 newSize)
@@ -368,6 +414,7 @@ char pto[512];
char pto2[512];
#include <sstream>
// Shape
static Enum::Shape::Value strEnum(TCHAR* shape)
{
if(strcmp("Block", shape) == 0)
@@ -391,12 +438,166 @@ static TCHAR* enumStr(int shape)
return "Block";
}
// ActionType
static TCHAR* strActionType(int option)
{
switch(option)
{
case Enum::ActionType::Nothing:
return "Nothing";
case Enum::ActionType::Pause:
return "Pause";
case Enum::ActionType::Lose:
return "Lose";
case Enum::ActionType::Draw:
return "Draw";
case Enum::ActionType::Win:
return "Win";
}
return "Nothing";
}
static Enum::ActionType::Value EnumOnTouchActionType(TCHAR* option)
{
if(strcmp("Nothing", option) == 0)
return Enum::ActionType::Nothing;
if(strcmp("Pause", option) == 0)
return Enum::ActionType::Pause;
if(strcmp("Lose", option) == 0)
return Enum::ActionType::Lose;
if(strcmp("Draw", option) == 0)
return Enum::ActionType::Draw;
return Enum::ActionType::Win;
}
// SoundType
static TCHAR* strSoundType(int option)
{
switch(option)
{
case Enum::Sound::NoSound:
return "NoSound";
case Enum::Sound::Victory:
return "Victory";
case Enum::Sound::Boing:
return "Boing";
case Enum::Sound::Splat:
return "Splat";
case Enum::Sound::Snap:
return "Snap";
case Enum::Sound::Bomb:
return "Bomb";
case Enum::Sound::Break:
return "Break";
case Enum::Sound::Ping:
return "Ping";
case Enum::Sound::Swoosh:
return "Swoosh";
case Enum::Sound::Page:
return "Page";
}
return "NoSound";
}
static Enum::Sound::Value EnumOnTouchSoundType(TCHAR* option)
{
if(strcmp("Nothing", option) == 0)
return Enum::Sound::NoSound;
if(strcmp("Victory", option) == 0)
return Enum::Sound::Victory;
if(strcmp("Boing", option) == 0)
return Enum::Sound::Boing;
if(strcmp("Splat", option) == 0)
return Enum::Sound::Splat;
if(strcmp("Bomb", option) == 0)
return Enum::Sound::Bomb;
if(strcmp("Break", option) == 0)
return Enum::Sound::Break;
if(strcmp("Swoosh", option) == 0)
return Enum::Sound::Swoosh;
if(strcmp("Page", option) == 0)
return Enum::Sound::Page;
if(strcmp("Ping", option) == 0)
return Enum::Sound::Ping;
if(strcmp("Snap", option) == 0)
return Enum::Sound::Snap;
return Enum::Sound::NoSound;
}
void PartInstance::onTouch()
{
if(singleShot && _touchedOnce)
return;
if(singleShot && !_touchedOnce)
_touchedOnce = true;
g_dataModel->getLevel()->score += changeScore;
g_dataModel->getLevel()->timer += changeTimer;
switch(OnTouchAction)
{
case Enum::ActionType::Nothing:
break;
case Enum::ActionType::Pause:
break;
case Enum::ActionType::Lose:
g_dataModel->getLevel()->loseCondition();
break;
case Enum::ActionType::Draw:
break;
case Enum::ActionType::Win:
g_dataModel->getLevel()->winCondition();
break;
}
SoundService* sndService = g_dataModel->getSoundService();
switch(OnTouchSound)
{
case Enum::Sound::NoSound:
break;
case Enum::Sound::Victory:
sndService->playSound(sndService->findFirstChild("Victory"));
break;
case Enum::Sound::Boing:
sndService->playSound(sndService->findFirstChild("Boing"));
break;
case Enum::Sound::Break:
sndService->playSound(sndService->findFirstChild("Break"));
break;
case Enum::Sound::Snap:
sndService->playSound(sndService->findFirstChild("Snap"));
break;
case Enum::Sound::Bomb:
sndService->playSound(sndService->findFirstChild("Bomb"));
break;
case Enum::Sound::Splat:
sndService->playSound(sndService->findFirstChild("Splat"));
break;
case Enum::Sound::Page:
sndService->playSound(sndService->findFirstChild("Page"));
break;
case Enum::Sound::Ping:
sndService->playSound(sndService->findFirstChild("Ping"));
break;
case Enum::Sound::Swoosh:
sndService->playSound(sndService->findFirstChild("Swoosh"));
break;
}
}
void PartInstance::PropUpdate(LPPROPGRIDITEM &item)
{
setChanged();
if(strcmp(item->lpszPropName, "Color3") == 0)
{
color = Color3(GetRValue(item->lpCurValue)/255.0F,GetGValue(item->lpCurValue)/255.0F,GetBValue(item->lpCurValue)/255.0F);
color = Color3(
GetRValue(item->lpCurValue)/255.0F,
GetGValue(item->lpCurValue)/255.0F,
GetBValue(item->lpCurValue)/255.0F
);
}
else if(strcmp(item->lpszPropName, "Anchored") == 0)
{
@@ -417,13 +618,6 @@ void PartInstance::PropUpdate(LPPROPGRIDITEM &item)
ss.ignore();
}
//if(vect.size() != 3)
//{
//sprintf(pto, "%g, %g, %g", cFrame.translation.x, cFrame.translation.y, cFrame.translation.z, "what");
//LPCSTR str = LPCSTR(pto);
//item->lpCurValue = (LPARAM)str;
//}
//else
if(vect.size() == 3)
{
Vector3 pos(vect.at(0),vect.at(1),vect.at(2));
@@ -446,13 +640,6 @@ void PartInstance::PropUpdate(LPPROPGRIDITEM &item)
ss.ignore();
}
/*if(vect.size() != 3)
{
sprintf(pto, "%g, %g, %g", cFrame.translation.x, cFrame.translation.y, cFrame.translation.z, "what");
LPCSTR str = LPCSTR(pto);
item->lpCurValue = (LPARAM)str;
}
else*/
if(vect.size() == 3)
{
Vector3 size(vect.at(0),vect.at(1),vect.at(2));
@@ -464,52 +651,104 @@ void PartInstance::PropUpdate(LPPROPGRIDITEM &item)
printf("%s", enumStr(strEnum((TCHAR*)item->lpCurValue)));
setShape(strEnum((TCHAR*)item->lpCurValue));
}
else if(strcmp(item->lpszPropName, "Action") == 0)
{
OnTouchAction = EnumOnTouchActionType((TCHAR*)item->lpCurValue);
}
else if (strcmp(item->lpszPropName, "Sound") == 0)
{
OnTouchSound = EnumOnTouchSoundType((TCHAR*)item->lpCurValue);
}
else if (strcmp(item->lpszPropName, "ChangeScore") == 0)
{
changeScore = atoi((LPSTR)item->lpCurValue);
}
else if (strcmp(item->lpszPropName, "ChangeTimer") == 0)
{
changeTimer = atof((LPSTR)item->lpCurValue);
}
else if (strcmp(item->lpszPropName, "SingleShot") == 0)
{
singleShot = item->lpCurValue == TRUE;
}
else PVInstance::PropUpdate(item);
}
// This needs to be changed, buffer size of 12 is way too small
// Crash occurs if you put a huge number in
char changeTimerTxt[12];
char changeScoreTxt[12];
std::vector<PROPGRIDITEM> PartInstance::getProperties()
{
std::vector<PROPGRIDITEM> properties = PVInstance::getProperties();
properties.push_back(createPGI(
"Properties",
properties.push_back(createPGI("Properties",
"Color3",
"The color of the selected part",
RGB((color.r*255),(color.g*255),(color.b*255)),
PIT_COLOR
));
properties.push_back(createPGI(
"Item",
properties.push_back(createPGI("Item",
"Anchored",
"Whether the block can move or not",
(LPARAM)anchored,
PIT_CHECK
));
sprintf_s(pto, "%g, %g, %g", position.x, position.y, position.z);
properties.push_back(createPGI(
"Item",
properties.push_back(createPGI("Item",
"Offset",
"The position of the object in the workspace",
(LPARAM)pto,
PIT_EDIT
));
sprintf_s(pto2, "%g, %g, %g", size.x, size.y, size.z);
properties.push_back(createPGI(
"Item",
properties.push_back(createPGI("Item",
"Size",
"The position of the object in the workspace",
"The size of the object in the workspace",
(LPARAM)pto2,
PIT_EDIT
));
properties.push_back(createPGI(
"Item",
properties.push_back(createPGI("Item",
"Shape",
"The shape of the object in the workspace",
(LPARAM)enumStr(shape),
PIT_COMBO,
TEXT("Ball\0Block\0Cylinder\0")
));
properties.push_back(createPGI("OnTouch",
"Action",
"What action is taken when touched",
(LPARAM)strActionType(OnTouchAction),
PIT_COMBO,
TEXT("Nothing\0Pause\0Lose\0Draw\0Win\0")
));
properties.push_back(createPGI("OnTouch",
"Sound",
"What sound plays when touched",
(LPARAM)strSoundType(OnTouchSound),
PIT_COMBO,
TEXT("NoSound\0Victory\0Boing\0Break\0Snap\0Bomb\0Splat\0Page\0Ping\0Swoosh\0")
));
sprintf_s(changeScoreTxt, "%d", changeScore);
sprintf_s(changeTimerTxt, "%g", changeTimer);
properties.push_back(createPGI("OnTouch",
"ChangeScore",
"How the score is affected when touched",
(LPARAM)changeScoreTxt,
PIT_EDIT));
properties.push_back(createPGI("OnTouch",
"ChangeTimer",
"How the timer is affected when touched",
(LPARAM)changeTimerTxt,
PIT_EDIT));
properties.push_back(createPGI("OnTouch",
"SingleShot",
"Whether or not Action happens only once",
(LPARAM)singleShot,
PIT_CHECK
));
return properties;
}

View File

@@ -0,0 +1,53 @@
#include "DataModelV2/SoundInstance.h"
#include "Globals.h"
SoundInstance::SoundInstance()
{
name = "Sound";
className = "Sound";
listicon = 8;
soundVolume = 0.5;
soundId = "";
playOnRemove = false;
looped = false;
}
SoundInstance::~SoundInstance(void)
{
if(isPlayedOnRemove())
play();
}
// Functions
void SoundInstance::play()
{
g_dataModel->getSoundService()->playSound(this);
}
// Getters
float SoundInstance::getSoundVolume()
{
return soundVolume;
}
bool SoundInstance::isPlayedOnRemove()
{
return playOnRemove;
}
std::string SoundInstance::getSoundId()
{
return soundId;
}
bool SoundInstance::isLooped()
{
return looped;
}
// Setters
void SoundInstance::setSoundId(std::string newSoundId)
{
soundId = newSoundId;
}

View File

@@ -0,0 +1,90 @@
#include "DataModelV2/SoundService.h"
#include "StringFunctions.h"
#include "AudioPlayer.h"
#include "Globals.h"
SoundService::SoundService()
{
name = "SoundService";
className = "SoundService";
musicVolume = 0.3f;
listicon = 8;
canDelete = false;
// Create stock sounds
SoundInstance* stockSound = new SoundInstance();
// Victory
stockSound = new SoundInstance();
stockSound->setName("Victory");
stockSound->setSoundId("/content/sounds/victory.wav");
stockSound->setParent(this);
// Boing
stockSound = new SoundInstance();
stockSound->setName("Boing");
stockSound->setSoundId("/content/sounds/bass.wav");
stockSound->setParent(this);
// Bomb
stockSound = new SoundInstance();
stockSound->setName("Bomb");
stockSound->setSoundId("/content/sounds/collide.wav");
stockSound->setParent(this);
// Ping
stockSound = new SoundInstance();
stockSound->setName("Ping");
stockSound->setSoundId("/content/sounds/electronicpingshort.wav");
stockSound->setParent(this);
// Break
stockSound = new SoundInstance();
stockSound->setName("Break");
stockSound->setSoundId("/content/sounds/glassbreak.wav");
stockSound->setParent(this);
// Splat
stockSound = new SoundInstance();
stockSound->setName("Splat");
stockSound->setSoundId("/content/sounds/splat.wav");
stockSound->setParent(this);
// Swoosh
stockSound = new SoundInstance();
stockSound->setName("Swoosh");
stockSound->setSoundId("/content/sounds/swoosh.wav");
stockSound->setParent(this);
// Snap
stockSound = new SoundInstance();
stockSound->setName("Snap");
stockSound->setSoundId("/content/sounds/snap.wav");
stockSound->setParent(this);
// Page
stockSound = new SoundInstance();
stockSound->setName("Page");
stockSound->setSoundId("/content/sounds/pageturn.wav");
stockSound->setParent(this);
}
SoundService::~SoundService(void)
{
}
void SoundService::playSound(Instance* sound)
{
// Try to dynamic_cast it to SoundInstance
SoundInstance* sndInst = dynamic_cast<SoundInstance*>(sound);
if(sndInst != NULL)
{
std::string soundId = sndInst->getSoundId();
AudioPlayer::playSound(GetFileInPath(soundId));
}
}
float SoundService::getMusicVolume()
{
return musicVolume;
}

View File

@@ -34,4 +34,19 @@ void MenuButtonListener::onButton1MouseClick(BaseButtonInstance* button)
break;
}
}
else if(button->name == "view")
{
HMENU mainmenu = CreatePopupMenu();
AppendMenu(mainmenu, MF_STRING, 103, "Image Server Model View");
POINT p;
GetCursorPos(&p);
int menuClick = TrackPopupMenu(mainmenu, TPM_LEFTBUTTON | TPM_RETURNCMD, p.x, p.y, 0, Globals::mainHwnd, 0);
switch (menuClick)
{
case 103:
g_dataModel->getThumbnailGenerator()->click("PNG", 512, 512, true);
break;
}
}
}

View File

@@ -25,10 +25,10 @@ XplicitNgine::~XplicitNgine()
dCloseODE();
}
void XplicitNgine::resetBody(PartInstance* partInstance)
{
deleteBody(partInstance);
createBody(partInstance);
void XplicitNgine::resetBody(PartInstance* partInstance)
{
deleteBody(partInstance);
createBody(partInstance);
}
void collisionCallback(void *data, dGeomID o1, dGeomID o2)
@@ -37,10 +37,12 @@ void collisionCallback(void *data, dGeomID o1, dGeomID o2)
dBodyID b1 = dGeomGetBody(o1);
dBodyID b2 = dGeomGetBody(o2);
if (b1 && b2 && dAreConnected(b1, b2))
return;
const int N = 4;
dContact contact[N];
n = dCollide (o1,o2,N,&contact[0].geom,sizeof(dContact));
@@ -62,8 +64,17 @@ void collisionCallback(void *data, dGeomID o1, dGeomID o2)
g_xplicitNgine->contactgroup,
contact+i
);
dJointAttach (c,b1,b2);
if(b1 != NULL)
{
PartInstance* touched = (PartInstance*)dGeomGetData(o2);
if(touched != NULL)
{
touched->onTouch();
}
}
}
}
}
@@ -123,6 +134,7 @@ void XplicitNgine::createBody(PartInstance* partInstance)
partInstance->physBody = dBodyCreate(physWorld);
dBodySetData(partInstance->physBody, partInstance);
// Create geom
if(partInstance->shape == Enum::Shape::Block)
{
@@ -140,6 +152,9 @@ void XplicitNgine::createBody(PartInstance* partInstance)
partInstance->physGeom[0] = dCreateSphere(physSpace, partSize[0]/2);
}
if(partInstance->physGeom[0])
dGeomSetData(partInstance->physGeom[0], partInstance);
dMass mass;
mass.setBox(sqrt(partSize.x*2), sqrt(partSize.y*2), sqrt(partSize.z*2), 0.7F);
dBodySetMass(partInstance->physBody, &mass);

View File

@@ -159,8 +159,6 @@ int main(int argc, char** argv) {
icc.dwICC = ICC_WIN95_CLASSES/*|ICC_COOL_CLASSES|ICC_DATE_CLASSES|
ICC_PAGESCROLLER_CLASS|ICC_USEREX_CLASSES*/;
InitCommonControlsEx(&icc);
AudioPlayer::init();
HMODULE hThisInstance = GetModuleHandle(NULL);
if (!createWindowClass("mainHWND",WndProc,hThisInstance))