102 Commits

Author SHA1 Message Date
DirtPiper
f42c5a4a08 Fixed level loading 2019-10-26 17:19:45 -04:00
DirtPiper
4a82c67fdc Added getMass to part 2019-10-26 15:54:48 -04:00
andreja6
3417a34f37 Sped up rendering 2019-05-15 12:16:51 -07:00
DirtPiper
d16bf9e39b Added Spawn to SurfaceType 2018-12-10 21:45:39 -05:00
MusicalProgrammer
d12654b4d3 Merge remote-tracking branch 'origin/Brickcolors' into MusicalProgrammer 2018-10-30 19:29:57 -04:00
MusicalProgrammer
5a20b4aefc Objects now clear on load. 2018-10-30 19:19:30 -04:00
MusicalProgrammer
08a3f9f307 Open now works by pressing CTRL+O 2018-10-30 19:14:17 -04:00
andreja6
77ce5c9a5a Brickcolors 2018-10-30 15:10:41 -07:00
andreja6
8a097f7eb1 Completely removed shadows 2018-10-30 13:31:57 -07:00
MusicalProgrammer
e9a13b8163 2005 Model works, but is mirrored 2018-10-30 16:10:24 -04:00
MusicalProgrammer
33a43c5072 Merge branch 'master' into MusicalProgrammer 2018-10-29 14:33:27 -04:00
MusicalProgrammer
f2347970c4 Updated vcproj 2018-10-28 21:03:16 -04:00
MusicalProgrammer
d0b0ffd7f1 Very unstable and broken XML loader added. 2018-10-28 21:00:34 -04:00
andreja6
ab242470b6 Added tilt and rotate to drag, made drag a bit cleaner 2018-10-27 21:14:24 -07:00
andreja6
03eceeae93 Merge pull request #27 from andreja6/Shadows
Dragging
2018-10-27 20:39:25 -07:00
andreja6
2919f4ebaa Disabled shadows 2018-10-27 20:38:33 -07:00
andreja6
1dd930af49 fixed crashing 2018-10-27 20:32:48 -07:00
andreja6
98e73cd7ca Kinda sorta works 2018-10-27 19:40:41 -07:00
MusicalProgrammer
057d86e05a Using new part dragging code... (Needs adjusting) 2018-10-27 19:32:28 -04:00
andreja6
89f9e0bfa2 Moving works-ish, fixed box selection 2018-10-27 11:21:09 -07:00
andreja6
61d07a8557 "Drag" 2018-10-27 09:00:39 -07:00
andreja6
948835df98 Shadows work (?) 2018-10-26 19:43:46 -07:00
andreja6
e83a67ade2 hm 2018-10-27 02:24:08 -07:00
MusicalProgrammer
6ec4ab466d RapidXML imported and ready to test 2018-10-26 18:09:36 -04:00
andreja6
f5f5f269d5 Fixed CoordinateFrame 2018-10-26 14:03:00 -07:00
andreja6
d492e438d2 Fixed camera a bit 2018-10-26 13:34:55 -07:00
andreja6
1700258001 Added dynamic cast to camera to prevent corrupted CFrame 2018-10-26 13:28:44 -07:00
andreja6
ff5b855e12 Fixed bevels going mentally insane on duplicate 2018-10-26 13:15:54 -07:00
DirtPiper
c9bb2ae72b Bevel fix
Made more accurate.
2018-10-25 22:33:45 -04:00
andreja6
5773584f48 made bevels a bit bigger 2018-10-25 19:01:14 -07:00
andreja6
7e2eb2c694 Parts with "ShowName" enabled now do what they are supposed to. Huzzah! 2018-10-25 18:56:00 -07:00
andreja6
f7d6781698 Fixed properties 2018-10-25 18:18:08 -07:00
andreja6
30a05af3b2 Added postrender 2018-10-25 18:16:39 -07:00
MusicalProgrammer
b1af53995a Parts now recolor properly again. 2018-10-25 20:51:15 -04:00
MusicalProgrammer
866d644c63 Manual merge... (Improved renderer, and added bevels.) 2018-10-25 20:29:38 -04:00
MusicalProgrammer
1108af7cf3 Bevels Added, and improved rendernig performance. 2018-10-25 20:10:14 -04:00
andreja6
7b4abe3efe Made properties "dynamically update", no longer simply says NO when object makes no sense 2018-10-25 15:43:45 -07:00
andreja6
5dd6ae7d9c Physixxxxx 2018-10-25 12:58:56 -07:00
andreja6
0566dd0217 Removed unneeded include 2018-10-25 11:50:40 -07:00
andreja6
99d5a1de38 Made parent selectable if exists 2018-10-25 10:06:52 -07:00
DirtPiper
5020de484c name fix for accuracy
hnnnnng dat accuracy boiii
2018-10-25 12:48:59 -04:00
andreja6
62208a14a5 Made LevelInstance (DataModel V1.1_01?) 2018-10-25 09:45:13 -07:00
andreja6
d7b491e073 Merge pull request #25 from andreja6/datamodel-v1.1
Datamodel v1.1
2018-10-24 20:50:09 -07:00
andreja6
c50d2a8166 Added basic shape stuff 2018-10-24 20:49:26 -07:00
andreja6
d2e0b29051 Changed icon 2018-10-24 20:34:14 -07:00
andreja6
4df67897dc Datamodel V1.1 2018-10-24 19:45:51 -07:00
andreja6
0f0be7f0b9 Attempted to fix dinging
On phone, can't test
2018-10-24 16:44:33 -07:00
andreja6
581f8a3413 made delete work 2018-10-24 15:14:24 -07:00
andreja6
0174605a3e Made mouse way less awkward 2018-10-24 14:40:46 -07:00
andreja6
edf1bc701b The closest i've gotten so far to images on the property grid 2018-10-24 14:14:38 -07:00
andreja6
69d55d0a5c Merge pull request #24 from andreja6/master
Request to merge master into MusicalProgrammer branch, to work on bevels.
2018-10-24 13:46:15 -07:00
andreja6
99ab8e1620 Fixed an oops 2018-10-24 13:44:50 -07:00
andreja6
ebe7ad682e Added MeasureItem case 2018-10-24 13:02:31 -07:00
andreja6
abe406990b Made properties explorer "work" and added bitmaps 2018-10-24 12:54:12 -07:00
andreja6
78c6dec932 Fixed 2018-10-24 11:19:17 -07:00
andreja6
2c65001536 Fixed crash on duplicate 2018-10-24 11:07:27 -07:00
andreja6
07a2eb4d98 Instances call constructor of base class 2018-10-24 11:02:13 -07:00
andreja6
ea072e424a Removed file that should not be here 2018-10-24 10:50:50 -07:00
andreja6
8b3da447a4 Prevented workspace duplication 2018-10-24 10:50:08 -07:00
andreja6
77615c5b8f Commented out code that produced warnings 2018-10-24 10:38:46 -07:00
andreja6
dc6c002250 Added some stuff to the Properties page 2018-10-24 10:20:05 -07:00
andreja6
70fba67b6e Made instances call parent function on properties, Deselecting everything opens Datamodel in the property grid
Instances now call the parent method after setting/getting properties,
Made delete no longer delete workspace
2018-10-24 09:55:49 -07:00
andreja6
1159be9b1b Fixed Color3 2018-10-24 05:47:21 -07:00
andreja6
6752c5da68 Added size 2018-10-23 21:38:53 -07:00
andreja6
77b7c3e62b Changed name to Color3 2018-10-23 21:33:17 -07:00
andreja6
7d7552d141 Added color3 2018-10-23 21:32:55 -07:00
andreja6
7f7e015706 Added new way of dealing with enums 2018-10-23 19:42:42 -07:00
MusicalProgrammer
ebbbbb3a69 Renamed selectedInstances to g_selectedInstances 2018-10-23 21:54:52 -04:00
MusicalProgrammer
b608a3ab9e PropertyGrid Selection Explorer Implemented 2018-10-23 21:43:29 -04:00
andreja6
ccf3ade099 Changed the way enums work 2018-10-23 17:42:15 -07:00
MusicalProgrammer
3c2ae53449 Added a ComboBox 2018-10-23 18:35:23 -04:00
andreja6
421498e1fe Made parts deselectable 2018-10-23 15:15:08 -07:00
andreja6
8909ded488 Made window show on double click 2018-10-23 15:09:08 -07:00
andreja6
5114ceb4b7 Removed navigate for now, made char work 2018-10-23 14:11:28 -07:00
andreja6
1472b7d6a5 Made it use addresses 2018-10-23 13:43:56 -07:00
andreja6
52d2cbf5dd Removed useless class, properties work 2018-10-23 13:42:10 -07:00
andreja6
e4529a949a Kinda sorta works 2018-10-23 12:46:54 -07:00
andreja6
6d1428ced9 Added properties to PhysicalInstance 2018-10-23 12:29:36 -07:00
MusicalProgrammer
0f700aeda5 Fixed PropertyWindow Procedure 2018-10-23 15:22:22 -04:00
DirtPiper
7273ee9ce0 struct removal and stopped parts from moving up 2018-10-23 14:00:28 -04:00
andreja6
1a7cd2e250 Failed at adding a struct, i may just use two vectors 2018-10-23 07:25:47 -07:00
andreja6
99f78be344 Added update property method 2018-10-23 06:52:06 -07:00
andreja6
ee528d1245 Changed how properties work 2018-10-23 06:49:41 -07:00
willemsteller
18b856602c Move duplicated part up 2018-10-23 09:52:45 +02:00
andreja6
0dcd054da3 Properties work 2018-10-22 22:59:41 -07:00
andreja6
268a0cd2ee Keep getting access violation exceptions 2018-10-22 22:01:46 -07:00
andreja6
c71dcb8a91 What 2018-10-22 21:05:50 -07:00
andreja6
24306c04ec Tried something, it kinda works 2018-10-22 21:04:21 -07:00
andreja6
b986815fcb Changed how properties work 2018-10-22 20:35:23 -07:00
andreja6
a70cc31d28 Class cleanup 2018-10-22 18:59:05 -07:00
andreja6
b097cb15e4 Added properties 2018-10-22 18:20:28 -07:00
andreja6
b18ebfb56f Merge branch 'master' of https://github.com/andreja6/G3D-Fun 2018-10-22 12:16:53 -07:00
andreja6
eade3d8e93 Fixed deselect on rotate 2018-10-22 12:16:50 -07:00
MusicalProgrammer
ccf440a65e _redraw(HWND) is now just _redraw() 2018-10-22 15:02:44 -04:00
DirtPiper
551a0e4b9e more propertygrid testing 2018-10-22 14:50:23 -04:00
DirtPiper
4afe95ae26 Merge branch 'master' of https://github.com/andreja6/G3D-Fun 2018-10-22 14:25:26 -04:00
DirtPiper
c6151b58e2 zip 2018-10-22 14:25:25 -04:00
andreja6
6f91ad5881 Added required H and CPP files to VCProj 2018-10-22 11:24:42 -07:00
MusicalProgrammer
09d9af492f PropertyGrid successfully implemented. 2018-10-22 14:19:51 -04:00
DirtPiper
bd37f8e22d tab 2018-10-22 14:00:31 -04:00
DirtPiper
c5485fbf55 Merge branch 'master' of https://github.com/andreja6/G3D-Fun 2018-10-22 13:07:07 -04:00
DirtPiper
f02272976a a bunch of nothing 2018-10-22 13:07:05 -04:00
57 changed files with 6189 additions and 638 deletions

1
.gitignore vendored
View File

@@ -52,3 +52,4 @@ G3DTest.suo
G3DTest.suo
stderr.txt
desktop.ini
main.cpp

View File

@@ -1,4 +0,0 @@
#ifndef ACTIONTYPE_H
#define ACTIONTYPE_H
static enum ActionType {Nothing, Pause, Lose, Draw, Win};
#endif

View File

@@ -1,4 +0,0 @@
#ifndef AFFECTTYPE_H
#define AFFECTTYPE_H
static enum AffectType {NoChange, Increase, Decrease};
#endif

View File

@@ -1,15 +1,12 @@
#include "BaseButtonInstance.h"
#include "Globals.h"
bool floatBottom = false;
bool floatRight = false;
bool floatCenter = false;
bool disabled = false;
bool selected = false;
ButtonListener* listener = NULL;
BaseButtonInstance::BaseButtonInstance(void)
{
Instance::Instance();
listener = NULL;
}

View File

@@ -16,7 +16,7 @@ public:
bool floatBottom;
bool floatRight;
bool floatCenter;
bool disabled;
volatile bool disabled;
bool selected;
protected:
bool mouseInArea(float, float, float, float, float, float);

View File

@@ -1,4 +0,0 @@
#ifndef BINTYPE_H
#define BINTYPE_H
static enum ActionType {GameTool, Grab, Clone, Hammer};
#endif

View File

@@ -1,24 +1,23 @@
#include "CameraController.h"
#include "win32Defines.h"
#include <iostream>
#include "PhysicalInstance.h"
#include "PartInstance.h"
#include "Demo.h"
#include "AudioPlayer.h"
CameraController::CameraController(){
yaw=0;
pitch=0;
moveRate=0.5f;
forwards=false;
backwards=false;
left=false;
right=false;
zoom=7.f;
rightButtonHolding=false;
focusPosition=Vector3(0,0,0);
}
CameraController::CameraController() :
yaw(0),
pitch(0),
moveRate(1.0f),
forwards(false),
backwards(false),
left(false),
right(false),
zoom(14.f),
rightButtonHolding(false),
focusPosition(Vector3(0,0,0)) {}
GCamera* CameraController::getCamera()
{
@@ -139,13 +138,18 @@ void CameraController::centerCamera(Instance* selection)
lookAt(Vector3(0,0,0));
focusPosition=Vector3(0,0,0);
}
else
else if(PartInstance* part = dynamic_cast<PartInstance*>(selection))
{
Vector3 partPos = ((PhysicalInstance*)selection)->getPosition()/2;
Vector3 partPos = (part)->getPosition()/2;
lookAt(partPos);
focusPosition=partPos;
zoom=((partPos-frame.translation).magnitude());
}
else
{
lookAt(Vector3(0,0,0));
focusPosition=Vector3(0,0,0);
}
}
void CameraController::update(Demo* demo)
@@ -209,10 +213,10 @@ void CameraController::update(Demo* demo)
}
if(GetHoldKeyState(VK_RSHIFT) || GetHoldKeyState(VK_LSHIFT)) {
moveRate = 1;
moveRate = 2;
}
else {
moveRate = 0.5;
moveRate = 1;
}
if(GetHoldKeyState(VK_RBUTTON))

View File

@@ -1,4 +0,0 @@
#ifndef CONTROLLERTYPE_H
#define CONTROLLERTYPE_H
static enum ControllerType {None, KeyboardRight, KeyboardLeft, Joypad1, Joypad2, Chase, Flee};
#endif

View File

@@ -1,46 +1,515 @@
#include <string>
#include "DataModelInstance.h"
#include <fstream>
#include <iostream>
#include <sstream>
#include <commdlg.h>
WorkspaceInstance* workspace;
Instance* guiRoot;
float mousex;
float mousey;
bool mouseButton1Down;
std::string message;
bool showMessage;
G3D::GFontRef font;
using namespace std;
using namespace rapidxml;
DataModelInstance::DataModelInstance(void)
{
Instance::Instance();
workspace = new WorkspaceInstance();
guiRoot = new Instance();
children.push_back(workspace);
level = new LevelInstance();
//children.push_back(workspace);
//children.push_back(level);
className = "dataModel";
mousex = 0;
mousey = 0;
mouseButton1Down = false;
showMessage = false;
canDelete = false;
_modY=0;
workspace->setParent(this);
level->setParent(this);
_loadedFileName="..//skooter.rbxm";
}
DataModelInstance::~DataModelInstance(void)
{
}
#ifdef _DEBUG
void DataModelInstance::modXMLLevel(float modY)
{
_modY += modY;
clearLevel();
debugGetOpen();
}
#endif
void DataModelInstance::clearLevel()
{
workspace->clearChildren();
}
PartInstance* DataModelInstance::makePart()
{
PartInstance* part = new PartInstance();
return part;
}
rapidxml::xml_node<>* DataModelInstance::getNode(xml_node<> * node,const char* name)
{
xml_node<> * tempNode = node->first_node(name);
if (!tempNode)
{
_errMsg = "Expected <";
_errMsg += name;
_errMsg+="> tag.";
_successfulLoad=true;
return 0;
}
return tempNode;
}
float DataModelInstance::getFloatValue(xml_node<> * node,const char* name)
{
xml_node<> * tempNode = node->first_node(name);
if (!tempNode)
{
_errMsg = "Expected <";
_errMsg += name;
_errMsg+="> tag.";
_successfulLoad=true;
return 0;
}
float newFloat;
stringstream converter;
converter << tempNode->value();
converter >> newFloat;
return newFloat;
}
Color3 bcToRGB(short bc)
{
switch(bc)
{
case 1: return Color3(0.94901967048645,0.95294123888016,0.95294123888016);
case 2: return Color3(0.63137257099152,0.64705884456635,0.63529413938522);
case 3: return Color3(0.9764706492424,0.91372555494308,0.60000002384186);
case 5: return Color3(0.84313732385635,0.77254909276962,0.60392159223557);
case 6: return Color3(0.7607843875885,0.85490202903748,0.72156864404678);
case 9: return Color3(0.90980398654938,0.7294117808342,0.78431379795074);
case 11: return Color3(0.50196081399918,0.73333334922791,0.85882359743118);
case 12: return Color3(0.79607850313187,0.51764708757401,0.258823543787);
case 18: return Color3(0.80000007152557,0.55686277151108,0.41176474094391);
case 21: return Color3(0.76862752437592,0.15686275064945,0.10980392992496);
case 22: return Color3(0.76862752437592,0.43921571969986,0.62745100259781);
case 23: return Color3(0.050980396568775,0.41176474094391,0.6745098233223);
case 24: return Color3(0.96078437566757,0.80392163991928,0.18823531270027);
case 25: return Color3(0.38431376218796,0.27843138575554,0.19607844948769);
case 26: return Color3(0.10588236153126,0.16470588743687,0.20784315466881);
case 27: return Color3(0.42745101451874,0.43137258291245,0.42352944612503);
case 28: return Color3(0.15686275064945,0.49803924560547,0.27843138575554);
case 29: return Color3(0.63137257099152,0.76862752437592,0.54901963472366);
case 36: return Color3(0.95294123888016,0.8117647767067,0.60784316062927);
case 37: return Color3(0.29411765933037,0.59215688705444,0.29411765933037);
case 38: return Color3(0.62745100259781,0.37254902720451,0.20784315466881);
case 39: return Color3(0.75686281919479,0.79215693473816,0.8705883026123);
case 40: return Color3(0.92549026012421,0.92549026012421,0.92549026012421);
case 41: return Color3(0.80392163991928,0.32941177487373,0.29411765933037);
case 42: return Color3(0.75686281919479,0.87450987100601,0.94117653369904);
case 43: return Color3(0.48235297203064,0.71372550725937,0.90980398654938);
case 44: return Color3(0.96862751245499,0.94509810209274,0.55294120311737);
case 45: return Color3(0.70588237047195,0.82352948188782,0.89411771297455);
case 47: return Color3(0.85098046064377,0.52156865596771,0.42352944612503);
case 48: return Color3(0.51764708757401,0.71372550725937,0.55294120311737);
case 49: return Color3(0.97254908084869,0.94509810209274,0.51764708757401);
case 50: return Color3(0.92549026012421,0.90980398654938,0.8705883026123);
case 100: return Color3(0.93333339691162,0.76862752437592,0.71372550725937);
case 101: return Color3(0.85490202903748,0.52549022436142,0.47843140363693);
case 102: return Color3(0.43137258291245,0.60000002384186,0.79215693473816);
case 103: return Color3(0.78039222955704,0.75686281919479,0.71764707565308);
case 104: return Color3(0.41960787773132,0.19607844948769,0.48627454042435);
case 105: return Color3(0.88627457618713,0.60784316062927,0.25098040699959);
case 106: return Color3(0.85490202903748,0.52156865596771,0.2549019753933);
case 107: return Color3(0,0.56078433990479,0.61176472902298);
case 108: return Color3(0.4078431725502,0.36078432202339,0.26274511218071);
case 110: return Color3(0.26274511218071,0.32941177487373,0.57647061347961);
case 111: return Color3(0.74901962280273,0.71764707565308,0.69411766529083);
case 112: return Color3(0.4078431725502,0.45490199327469,0.6745098233223);
case 113: return Color3(0.89411771297455,0.678431391716,0.78431379795074);
case 115: return Color3(0.78039222955704,0.82352948188782,0.23529413342476);
case 116: return Color3(0.33333334326744,0.64705884456635,0.68627452850342);
case 118: return Color3(0.71764707565308,0.84313732385635,0.83529418706894);
case 119: return Color3(0.64313727617264,0.74117648601532,0.27843138575554);
case 120: return Color3(0.85098046064377,0.89411771297455,0.65490198135376);
case 121: return Color3(0.90588241815567,0.6745098233223,0.34509804844856);
case 123: return Color3(0.82745105028152,0.43529415130615,0.29803922772408);
case 124: return Color3(0.57254904508591,0.22352942824364,0.47058826684952);
case 125: return Color3(0.91764712333679,0.72156864404678,0.57254904508591);
case 126: return Color3(0.64705884456635,0.64705884456635,0.79607850313187);
case 127: return Color3(0.86274516582489,0.73725491762161,0.50588238239288);
case 128: return Color3(0.68235296010971,0.47843140363693,0.34901961684227);
case 131: return Color3(0.61176472902298,0.63921570777893,0.65882354974747);
case 133: return Color3(0.83529418706894,0.45098042488098,0.23921570181847);
case 134: return Color3(0.84705889225006,0.8666667342186,0.33725491166115);
case 135: return Color3(0.45490199327469,0.52549022436142,0.61568629741669);
case 136: return Color3(0.52941179275513,0.48627454042435,0.56470590829849);
case 137: return Color3(0.87843143939972,0.59607845544815,0.39215689897537);
case 138: return Color3(0.58431375026703,0.54117649793625,0.45098042488098);
case 140: return Color3(0.12549020349979,0.22745099663734,0.33725491166115);
case 141: return Color3(0.15294118225574,0.27450981736183,0.17647059261799);
case 143: return Color3(0.8117647767067,0.88627457618713,0.96862751245499);
case 145: return Color3(0.47450983524323,0.53333336114883,0.63137257099152);
case 146: return Color3(0.58431375026703,0.55686277151108,0.63921570777893);
case 147: return Color3(0.57647061347961,0.52941179275513,0.40392160415649);
case 148: return Color3(0.34117648005486,0.34509804844856,0.34117648005486);
case 149: return Color3(0.086274512112141,0.11372549831867,0.19607844948769);
case 150: return Color3(0.67058825492859,0.678431391716,0.6745098233223);
case 151: return Color3(0.47058826684952,0.56470590829849,0.50980395078659);
case 153: return Color3(0.58431375026703,0.47450983524323,0.46666669845581);
case 154: return Color3(0.48235297203064,0.1803921610117,0.1843137294054);
case 157: return Color3(1,0.96470594406128,0.48235297203064);
case 158: return Color3(0.88235300779343,0.64313727617264,0.7607843875885);
case 168: return Color3(0.4588235616684,0.42352944612503,0.38431376218796);
case 176: return Color3(0.59215688705444,0.41176474094391,0.35686275362968);
case 178: return Color3(0.70588237047195,0.51764708757401,0.33333334326744);
case 179: return Color3(0.53725492954254,0.52941179275513,0.53333336114883);
case 180: return Color3(0.84313732385635,0.66274511814117,0.29411765933037);
case 190: return Color3(0.9764706492424,0.83921575546265,0.1803921610117);
case 191: return Color3(0.90980398654938,0.67058825492859,0.17647059261799);
case 192: return Color3(0.41176474094391,0.25098040699959,0.15686275064945);
case 193: return Color3(0.8117647767067,0.37647062540054,0.14117647707462);
case 195: return Color3(0.27450981736183,0.40392160415649,0.64313727617264);
case 196: return Color3(0.13725490868092,0.27843138575554,0.54509806632996);
case 198: return Color3(0.55686277151108,0.258823543787,0.52156865596771);
case 199: return Color3(0.38823533058167,0.37254902720451,0.38431376218796);
case 200: return Color3(0.50980395078659,0.54117649793625,0.3647058904171);
case 208: return Color3(0.89803928136826,0.89411771297455,0.87450987100601);
case 209: return Color3(0.69019609689713,0.55686277151108,0.26666668057442);
case 210: return Color3(0.43921571969986,0.58431375026703,0.47058826684952);
case 211: return Color3(0.47450983524323,0.70980393886566,0.70980393886566);
case 212: return Color3(0.6235294342041,0.76470595598221,0.91372555494308);
case 213: return Color3(0.42352944612503,0.50588238239288,0.71764707565308);
case 216: return Color3(0.56078433990479,0.29803922772408,0.16470588743687);
case 217: return Color3(0.48627454042435,0.36078432202339,0.27450981736183);
case 218: return Color3(0.58823531866074,0.43921571969986,0.6235294342041);
case 219: return Color3(0.41960787773132,0.38431376218796,0.60784316062927);
case 220: return Color3(0.65490198135376,0.66274511814117,0.80784320831299);
case 221: return Color3(0.80392163991928,0.38431376218796,0.59607845544815);
case 222: return Color3(0.89411771297455,0.678431391716,0.78431379795074);
case 223: return Color3(0.86274516582489,0.56470590829849,0.58431375026703);
case 224: return Color3(0.94117653369904,0.83529418706894,0.62745100259781);
case 225: return Color3(0.9215686917305,0.72156864404678,0.49803924560547);
case 226: return Color3(0.99215692281723,0.91764712333679,0.55294120311737);
case 232: return Color3(0.49019610881805,0.73333334922791,0.8666667342186);
case 268: return Color3(0.2039215862751,0.16862745583057,0.4588235616684);
case 1001: return Color3(0.97254908084869,0.97254908084869,0.97254908084869);
case 1002: return Color3(0.80392163991928,0.80392163991928,0.80392163991928);
case 1003: return Color3(0.066666670143604,0.066666670143604,0.066666670143604);
case 1004: return Color3(1,0,0);
case 1005: return Color3(1,0.68627452850342,0);
case 1006: return Color3(0.70588237047195,0.50196081399918,1);
case 1007: return Color3(0.63921570777893,0.29411765933037,0.29411765933037);
case 1008: return Color3(0.75686281919479,0.74509805440903,0.258823543787);
case 1009: return Color3(1,1,0);
case 1010: return Color3(0,0,1);
case 1011: return Color3(0,0.12549020349979,0.37647062540054);
case 1012: return Color3(0.1294117718935,0.32941177487373,0.72549021244049);
case 1013: return Color3(0.015686275437474,0.68627452850342,0.92549026012421);
case 1014: return Color3(0.66666668653488,0.33333334326744,0);
case 1015: return Color3(0.66666668653488,0,0.66666668653488);
case 1016: return Color3(1,0.40000003576279,0.80000007152557);
case 1017: return Color3(1,0.68627452850342,0);
case 1018: return Color3(0.070588238537312,0.93333339691162,0.83137261867523);
case 1019: return Color3(0,1,1);
case 1020: return Color3(0,1,0);
case 1021: return Color3(0.22745099663734,0.49019610881805,0.082352943718433);
case 1022: return Color3(0.49803924560547,0.55686277151108,0.39215689897537);
case 1023: return Color3(0.54901963472366,0.35686275362968,0.6235294342041);
case 1024: return Color3(0.68627452850342,0.8666667342186,1);
case 1025: return Color3(1,0.78823536634445,0.78823536634445);
case 1026: return Color3(0.69411766529083,0.65490198135376,1);
case 1027: return Color3(0.6235294342041,0.95294123888016,0.91372555494308);
case 1028: return Color3(0.80000007152557,1,0.80000007152557);
case 1029: return Color3(1,1,0.80000007152557);
case 1030: return Color3(1,0.80000007152557,0.60000002384186);
case 1031: return Color3(0.38431376218796,0.14509804546833,0.81960791349411);
case 1032: return Color3(1,0,0.74901962280273);
default: return Color3::gray();
}
}
bool DataModelInstance::scanXMLObject(xml_node<> * scanNode)
{
xml_node<> * watchFirstNode = scanNode->first_node();
for (xml_node<> *node = scanNode->first_node();node; node = node->next_sibling())
{
if (strncmp(node->name(),"Item",4)==0)
{
xml_attribute<> *classAttr = node->first_attribute("class");
std::string className = classAttr->value();
if (className=="Part") {
xml_node<> *propNode = node->first_node();
xml_node<> *cFrameNode=0;
xml_node<> *sizeNode=0;
xml_node<> *colorNode=0;
xml_node<> *brickColorNode=0;
xml_node<> *nameNode=0;
for (xml_node<> *partPropNode = propNode->first_node();partPropNode; partPropNode = partPropNode->next_sibling())
{
for (xml_attribute<> *attr = partPropNode->first_attribute();attr; attr = attr->next_attribute())
{
std::string xmlName = attr->name();
std::string xmlValue = attr->value();
if (xmlValue=="CFrame" | xmlValue=="CoordinateFrame")
{
cFrameNode = partPropNode;
}
if (xmlValue=="Name")
{
nameNode = partPropNode;
}
if (xmlValue=="Color")
{
colorNode=partPropNode;
}
if (xmlValue=="BrickColor")
{
brickColorNode=partPropNode;
}
if (xmlValue=="size")
{
sizeNode = partPropNode;
_legacyLoad=false;
}
if (xmlValue=="Part")
{
for (xml_node<> *featureNode = partPropNode->first_node();featureNode; featureNode = featureNode->next_sibling())
{
for (xml_attribute<> *attr = featureNode->first_attribute();attr; attr = attr->next_attribute())
{
std::string xmlName = attr->name();
std::string xmlValue = attr->value();
if (xmlValue=="size")
{
sizeNode=featureNode;
_legacyLoad=true;
}
}
}
}
}
}
if (!cFrameNode) {
_errMsg="CFrame is missing in Part";
return false;
}
if (!sizeNode) {
_errMsg="Size is missing in Part";
return false;
}
float R=1;
float G=1;
float B=1;
if (colorNode)
{
R = getFloatValue(colorNode,"R");
G = getFloatValue(colorNode,"G");
B = getFloatValue(colorNode,"B");
}
std::string newName = nameNode->value();
float X = getFloatValue(cFrameNode,"X");
float Y = getFloatValue(cFrameNode,"Y");
float Z = getFloatValue(cFrameNode,"Z");
float R00 = getFloatValue(cFrameNode,"R00");
float R01 = getFloatValue(cFrameNode,"R01");
float R02 = getFloatValue(cFrameNode,"R02");
float R10 = getFloatValue(cFrameNode,"R10");
float R11 = getFloatValue(cFrameNode,"R11");
float R12 = getFloatValue(cFrameNode,"R12");
float R20 = getFloatValue(cFrameNode,"R20");
float R21 = getFloatValue(cFrameNode,"R21");
float R22 = getFloatValue(cFrameNode,"R22");
float sizeX = getFloatValue(sizeNode,"X");
float sizeY = getFloatValue(sizeNode,"Y");
float sizeZ = getFloatValue(sizeNode,"Z");
//sizeX=1;
//sizeY=1;
//sizeZ=1;
if (_successfulLoad) {
PartInstance* test = makePart();
test->setParent(getWorkspace());
test->color = Color3(R,G,B);
if(brickColorNode)
{
test->color = bcToRGB(atoi(brickColorNode->value()));
}
test->setSize(Vector3(sizeX,sizeY+_modY,sizeZ));
test->setName(newName);
CoordinateFrame cf;
if (_legacyLoad)
{
cf = CoordinateFrame(Vector3(-X,Y,Z))*CoordinateFrame(Vector3(-sizeX/2,(sizeY+_modY)/2,sizeZ/2)*Matrix3(R00,R01,R02,R10,R11,R12,R20,R21,R22));
cf.rotation = Matrix3(R00,R01,R02,R10,R11,R12,R20,R21,R22);
}
else
{
cf.translation = Vector3(X,Y,Z);
cf.rotation = Matrix3(R00,R01,R02,R10,R11,R12,R20,R21,R22);
}
test->setCFrame(cf);
}
else
{
return false;
}
}
}
/*
for (xml_attribute<> *attr = node->first_attribute();attr; attr = attr->next_attribute())
{
std::string xmlName = attr->name();
std::string xmlValue = attr->value();
}
*/
scanXMLObject(node);
}
return true;
}
bool DataModelInstance::load(const char* filename, bool clearObjects)
{
ifstream levelFile(filename,ios::binary);
if (levelFile)
{
if (clearObjects)
clearLevel();
readXMLFileStream(&levelFile);
std::string sfilename = std::string(filename);
std::size_t begin = sfilename.rfind('\\') + 1;
std::size_t end = sfilename.find(".rbx");
std::string hname = sfilename.substr(begin);
std::string tname = hname.substr(0, hname.length() - 5);
name = tname;
return true;
}
}
bool DataModelInstance::readXMLFileStream(std::ifstream* file)
{
file->seekg(0,file->end);
int length = file->tellg();
file->seekg(0,file->beg);
char * buffer = new char[length+1];
buffer[length]=0;
file->read(buffer,length);
file->close();
xml_document<> doc;
doc.parse<0>(buffer);
xml_node<> *mainNode = doc.first_node();
_legacyLoad=false;
//std::string xmlName = mainNode->name();
//node = node->first_node();
//xmlName = node->name();
scanXMLObject(mainNode);
delete[] buffer;
return true;
}
bool DataModelInstance::debugGetOpen()
{
ifstream levelFile(_loadedFileName.c_str(),ios::binary);
if (levelFile)
readXMLFileStream(&levelFile);
else
getOpen();
return true;
}
bool DataModelInstance::getOpen()
{
_modY=0;
OPENFILENAME of;
ZeroMemory( &of , sizeof( of));
of.lStructSize = sizeof(OPENFILENAME);
of.lpstrFilter = "Roblox Files\0*.rbxm;*.rbxl\0\0";
char szFile[512];
of.lpstrFile = szFile ;
of.lpstrFile[0]='\0';
of.nMaxFile=500;
of.lpstrTitle="Hello";
of.Flags = OFN_FILEMUSTEXIST;
ShowCursor(TRUE);
BOOL file = GetOpenFileName(&of);
if (file)
{
_loadedFileName = of.lpstrFile;
load(of.lpstrFile,true);
}
return true;
}
void DataModelInstance::setMessage(std::string msg)
{
message = msg;
isBrickCount = false;
showMessage = true;
}
void DataModelInstance::clearMessage()
{
showMessage = false;
isBrickCount = false;
message = "";
}
void DataModelInstance::setMessageBrickCount()
{
isBrickCount = true;
showMessage = true;
}
void DataModelInstance::drawMessage(RenderDevice* rd)
{
if(isBrickCount)
{
int brickCount = 0;
int instCount = 0;
std::vector<Instance*> inst = getAllChildren();
for(size_t i = 0; i < inst.size(); i++)
{
if(PartInstance* moveTo = dynamic_cast<PartInstance*>(inst.at(i)))
{
brickCount++;
}
else
{
instCount++;
}
}
char brkc[12];
sprintf(brkc, "%d", brickCount);
char instc[12];
sprintf(instc, "%d", instCount);
message = "Bricks: ";
message += brkc;
message += " Snaps: ";
message += instc;
}
if(showMessage && !font.isNull())
{
int x = rd->getWidth()/2;
@@ -74,3 +543,9 @@ Instance* DataModelInstance::getGuiRoot()
{
return guiRoot;
}
LevelInstance* DataModelInstance::getLevel()
{
return level;
}

View File

@@ -1,6 +1,8 @@
#pragma once
#include "instance.h"
#include "WorkspaceInstance.h"
#include "LevelInstance.h"
#include "PartInstance.h"
#include "rapidxml/rapidxml.hpp"
class DataModelInstance :
public Instance
@@ -9,10 +11,22 @@ public:
DataModelInstance(void);
~DataModelInstance(void);
void setMessage(std::string);
void setMessageBrickCount();
void clearMessage();
bool debugGetOpen();
bool getOpen();
bool load(const char* filename,bool clearObjects);
bool readXMLFileStream(std::ifstream* file);
void drawMessage(RenderDevice*);
GFontRef font;
WorkspaceInstance* getWorkspace();
WorkspaceInstance* workspace;
LevelInstance * level;
LevelInstance * getLevel();
Instance* guiRoot;
std::string message;
std::string _loadedFileName;
bool showMessage;
G3D::GFontRef font;
Instance* getGuiRoot();
float mousex;
float mousey;
@@ -20,4 +34,18 @@ public:
void setMousePos(int x,int y);
void setMousePos(Vector2 pos);
bool mouseButton1Down;
PartInstance* makePart();
void clearLevel();
#if _DEBUG
void modXMLLevel(float modY);
#endif
private:
bool isBrickCount;
bool scanXMLObject(rapidxml::xml_node<>* node);
rapidxml::xml_node<>* getNode(rapidxml::xml_node<> * node,const char* name );
float getFloatValue(rapidxml::xml_node<> * node,const char* name);
bool _successfulLoad;
std::string _errMsg;
bool _legacyLoad;
float _modY;
};

5
Demo.h
View File

@@ -1,6 +1,7 @@
#pragma once
#include <G3DAll.h>
#include "CameraController.h"
#include "PropertyWindow.h"
class Demo { // : public GApp {
public:
@@ -33,6 +34,8 @@ class Demo { // : public GApp {
CameraController cameraController;
RenderDevice* renderDevice;
UserInput* userInput;
PropertyWindow* _propWindow;
void generateShadowMap(const CoordinateFrame& lightViewMatrix) const;
private:
void initGUI();
HWND _hWndMain;
@@ -45,6 +48,8 @@ class Demo { // : public GApp {
HWND _hwndToolbox;
HWND _buttonTest;
HWND _hwndRenderer;
G3D::TextureRef shadowMap;
double lightProjX, lightProjY, lightProjNear, lightProjFar;
protected:
Stopwatch m_graphicsWatch;
Stopwatch m_logicWatch;

Binary file not shown.

View File

@@ -67,6 +67,13 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_CAN
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDI_ICON1 ICON "icon1.ico"
/////////////////////////////////////////////////////////////////////////////
//
// Bitmap
//
IDB_BITMAP1 BITMAP "Parts.bmp"
#endif // English (Canada) resources
/////////////////////////////////////////////////////////////////////////////

17
Enum.h Normal file
View File

@@ -0,0 +1,17 @@
#pragma once
namespace Enum
{
namespace SurfaceType
{
enum Value {
Smooth, Bumps, Welds, Glue
};
}
namespace Shape
{
enum Value {
Block, Sphere, Cylinder
};
}
}

14
Enums.h Normal file
View File

@@ -0,0 +1,14 @@
#ifndef ENUM_H
#define ENUM_H
static enum BinType {GameTool, Grab, Clone, Hammer};
static enum ControllerType {None, KeyboardRight, KeyboardLeft, Joypad1, Joypad2, Chase, Flee};
//static enum JointType {UNK0, WeldJoint, SnapJoint, UNK3, Rotate, RotateP, RotateV, GlueJoint, UNK8, UNK9, None};
static enum ActionType {Nothing, Pause, Lose, Draw, Win};
static enum AffectType {NoChange, Increase, Decrease};
static enum InputType {NoInput, LeftTread, RightTread, Steer, Throtle, UpDown, Action1, Action2, Action3, Action4, Action5, Constant, Sin};
//static enum SurfaceConstraint {None, Hinge, SteppingMotor, Motor};
static enum SurfaceType{Smooth, Snaps, Inlets, Glue, Weld, Spawn, Hinge, Motor, Bumps};
static enum SoundType {NoSound, Boing, Bomb, Break, Click, Clock, Slingshot, Page, Ping, Snap, Splat, Step, StepOn, Swoosh, Victory};
static enum PartType {Ball, Block, Cylinder};
static enum KeywordFilterType {Include, Exclude};
#endif

View File

@@ -3,7 +3,7 @@
ProjectType="Visual C++"
Version="8.00"
Name="G3DTest"
ProjectGUID="{6C4D6EEF-B1D1-456A-B850-92CAB17124BE}"
ProjectGUID="{277D185B-AEBA-4F75-A7FC-F1EBE787C200}"
RootNamespace="G3DTest"
>
<Platforms>
@@ -74,7 +74,7 @@
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="Advapi32.lib UxTheme.lib Comctl32.lib"
AdditionalDependencies="Advapi32.lib UxTheme.lib Comctl32.lib Comdlg32.lib Shell32.lib"
OutputFile="./G3DTest.exe"
LinkIncremental="1"
SuppressStartupBanner="true"
@@ -147,8 +147,8 @@
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS"
MinimalRebuild="false"
BasicRuntimeChecks="0"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
RuntimeLibrary="3"
EnableFunctionLevelLinking="false"
PrecompiledHeaderFile=".\Debug/G3DTest.pch"
AssemblerListingLocation=".\Debug/"
ObjectFile=".\Debug/"
@@ -176,7 +176,7 @@
SuppressStartupBanner="true"
GenerateDebugInformation="true"
ProgramDatabaseFile=".\Debug/G3DTest.pdb"
SubSystem="2"
SubSystem="1"
TargetMachine="1"
/>
<Tool
@@ -258,6 +258,10 @@
RelativePath=".\Globals.cpp"
>
</File>
<File
RelativePath=".\GroupInstance.cpp"
>
</File>
<File
RelativePath=".\IEBrowser.cpp"
>
@@ -270,6 +274,10 @@
RelativePath=".\IEDispatcher.cpp"
>
</File>
<File
RelativePath=".\LevelInstance.cpp"
>
</File>
<File
RelativePath="main.cpp"
>
@@ -290,10 +298,22 @@
/>
</FileConfiguration>
</File>
<File
RelativePath=".\PartInstance.cpp"
>
</File>
<File
RelativePath=".\propertyGrid.cpp"
>
</File>
<File
RelativePath=".\PropertyWindow.cpp"
>
</File>
<File
RelativePath=".\PVInstance.cpp"
>
</File>
<File
RelativePath=".\WindowFunctions.cpp"
>
@@ -317,10 +337,6 @@
RelativePath=".\Instance.cpp"
>
</File>
<File
RelativePath=".\PhysicalInstance.cpp"
>
</File>
<File
RelativePath=".\TextButtonInstance.cpp"
>
@@ -335,14 +351,6 @@
Name="Header Files"
Filter="h;hpp;hxx;hm;inl"
>
<File
RelativePath=".\ActionType.h"
>
</File>
<File
RelativePath=".\AffectType.h"
>
</File>
<File
RelativePath=".\AudioPlayer.h"
>
@@ -351,10 +359,6 @@
RelativePath=".\ax.h"
>
</File>
<File
RelativePath=".\BinType.h"
>
</File>
<File
RelativePath=".\BrowserCallHandler.h"
>
@@ -368,61 +372,69 @@
>
</File>
<File
RelativePath=".\ControllerType.h"
RelativePath=".\Demo.h"
>
</File>
<File
RelativePath=".\Demo.h"
RelativePath=".\Enum.h"
>
</File>
<File
RelativePath=".\Enums.h"
>
</File>
<File
RelativePath=".\Globals.h"
>
</File>
<File
RelativePath=".\GroupInstance.h"
>
</File>
<File
RelativePath=".\IEDispatcher.h"
>
</File>
<File
RelativePath=".\InputType.h"
RelativePath=".\LevelInstance.h"
>
</File>
<File
RelativePath=".\JointType.h"
>
</File>
<File
RelativePath=".\KeywordFilterType.h"
>
</File>
<File
RelativePath=".\PartType.h"
RelativePath=".\PartInstance.h"
>
</File>
<File
RelativePath=".\propertyGrid.h"
>
</File>
<File
RelativePath=".\PropertyWindow.h"
>
</File>
<File
RelativePath=".\PVInstance.h"
>
</File>
<File
RelativePath=".\rapidxml\rapidxml.hpp"
>
</File>
<File
RelativePath=".\rapidxml\rapidxml_iterators.hpp"
>
</File>
<File
RelativePath=".\rapidxml\rapidxml_print.hpp"
>
</File>
<File
RelativePath=".\rapidxml\rapidxml_utils.hpp"
>
</File>
<File
RelativePath=".\resource.h"
>
</File>
<File
RelativePath=".\SoundType.h"
>
</File>
<File
RelativePath=".\Surface.h"
>
</File>
<File
RelativePath=".\SurfaceConstraint.h"
>
</File>
<File
RelativePath=".\SurfaceType.h"
>
</File>
<File
RelativePath=".\win32Defines.h"
>
@@ -450,10 +462,6 @@
RelativePath=".\Instance.h"
>
</File>
<File
RelativePath=".\PhysicalInstance.h"
>
</File>
<File
RelativePath=".\TextButtonInstance.h"
>
@@ -476,6 +484,10 @@
RelativePath=".\icon1.ico"
>
</File>
<File
RelativePath=".\Parts.bmp"
>
</File>
</Filter>
</Files>
<Globals>

View File

@@ -8,10 +8,10 @@ int const Globals::patch = 2;
int Globals::surfaceId = 2;
bool Globals::showMouse = true;
bool Globals::useMousePoint = false;
std::vector<Instance*> postRenderStack = std::vector<Instance*>();
const std::string Globals::PlaceholderName = "Dynamica";
std::vector<Instance*> g_selectedInstances = std::vector<Instance*>();
bool running = false;
G3D::TextureRef Globals::surface;
POINT Globals::mousepoint;
Globals::Globals(void){}

View File

@@ -19,3 +19,7 @@ public:
static int surfaceId;
static const std::string PlaceholderName;
};
extern std::vector<Instance*> postRenderStack;
extern std::vector<Instance*> g_selectedInstances;
extern bool running;

26
GroupInstance.cpp Normal file
View File

@@ -0,0 +1,26 @@
#include "GroupInstance.h"
GroupInstance::GroupInstance(void)
{
PVInstance::PVInstance();
className = "GroupInstance";
}
GroupInstance::GroupInstance(const GroupInstance &oinst)
{
PVInstance::PVInstance(oinst);
}
GroupInstance::~GroupInstance(void)
{
}
std::vector<PROPGRIDITEM> GroupInstance::getProperties()
{
std::vector<PROPGRIDITEM> properties = PVInstance::getProperties();
return properties;
}
void GroupInstance::PropUpdate(LPPROPGRIDITEM &pItem)
{
PVInstance::PropUpdate(pItem);
}

13
GroupInstance.h Normal file
View File

@@ -0,0 +1,13 @@
#pragma once
#include "PVInstance.h"
class GroupInstance :
public PVInstance
{
public:
GroupInstance(void);
~GroupInstance(void);
GroupInstance(const GroupInstance &oinst);
virtual std::vector<PROPGRIDITEM> getProperties();
virtual void PropUpdate(LPPROPGRIDITEM &pItem);
};

View File

@@ -1,4 +1,5 @@
//#include "WindowFunctions.h"
#pragma once
#include <mshtml.h>
#include <exdisp.h>
//#include <Mshtmhst.h>

View File

@@ -1,17 +1,8 @@
#include "ImageButtonInstance.h"
G3D::TextureRef image = NULL;
int openGLID = 0;
G3D::TextureRef image_ovr = NULL;
int openGLID_ovr = 0;
G3D::TextureRef image_dn = NULL;
int openGLID_dn = 0;
G3D::TextureRef image_ds = NULL;
int openGLID_ds = 0;
Vector2 size;
Vector2 position;
ImageButtonInstance::ImageButtonInstance(G3D::TextureRef newImage, G3D::TextureRef overImage = NULL, G3D::TextureRef downImage = NULL, G3D::TextureRef disableImage = NULL)
{
BaseButtonInstance::BaseButtonInstance();
image = newImage;
openGLID = image->getOpenGLID();
image_ovr = overImage;
@@ -94,7 +85,7 @@ void ImageButtonInstance::drawObj(RenderDevice* rd, Vector2 mousePos, bool mouse
positionRelative = Vector2(rd->getWidth() + position.x, position.y);
}
int renderimage = openGLID;
if(selected == true && !image_dn.isNull())
if(selected == true && !image_dn.isNull() && !disabled)
{
renderimage = openGLID_dn;
}

View File

@@ -1,4 +0,0 @@
#ifndef INPUTTYPE_H
#define INPUTTYPE_H
static enum InputType {NoInput, LeftTread, RightTread, Steer, Throtle, UpDown, Action1, Action2, Action3, Action4, Action5, Constant, Sin};
#endif

View File

@@ -2,33 +2,81 @@
#include <G3DAll.h>
#include "Instance.h"
std::string name;
Instance* parent = NULL;
std::vector<Instance* > children;
static std::string className = "BaseInstance";
Instance::Instance(void)
{
parent = NULL;
name = "Default Game Instance";
className = "BaseInstance";
listicon = 0;
canDelete = true;
}
Instance::Instance(const Instance &oinst)
{
setParent(oinst.parent);
name = oinst.name;
className = oinst.className;
canDelete = oinst.canDelete;
//setParent(oinst.parent);
}
void Instance::render(RenderDevice* rd)
{
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
for(size_t i = 0; i < children.size(); i++)
{
children.at(i)->render(rd);
}
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
}
PROPGRIDITEM Instance::createPGI(LPSTR catalog, LPSTR propName, LPSTR propDesc, LPARAM curVal, INT type)
{
PROPGRIDITEM pItem;
PropGrid_ItemInit(pItem);
pItem.lpszCatalog=catalog;
pItem.lpszPropName=propName;
pItem.lpszPropDesc=propDesc;
pItem.lpCurValue=curVal;
pItem.iItemType=type;
return pItem;
}
void Instance::PropUpdate(LPPROPGRIDITEM &item)
{
if(strcmp(item->lpszPropName, "Name") == 0)
{
name = (LPSTR)item->lpCurValue;
}
}
std::vector<PROPGRIDITEM> Instance::getProperties()
{
std::vector<PROPGRIDITEM> properties;
properties.push_back(createPGI(
"Properties",
"Name",
"The name of this instance",
(LPARAM)name.c_str(),
PIT_EDIT
));
return properties;
}
Instance::~Instance(void)
{
for(size_t i = 0; i < children.size(); i++)
@@ -37,6 +85,11 @@ Instance::~Instance(void)
}
}
void Instance::setName(std::string newName)
{
name = newName;
}
std::string Instance::getClassName()
{
return className;
@@ -86,6 +139,10 @@ void Instance::addChild(Instance* newChild)
children.push_back(newChild);
}
void Instance::clearChildren()
{
children.clear();
}
void Instance::removeChild(Instance* oldChild)
{
for(size_t i = 0; i < children.size(); i++)
@@ -99,14 +156,15 @@ void Instance::removeChild(Instance* oldChild)
Instance* Instance::findFirstChild(std::string name)
{
Instance* child = NULL;
for(size_t i = 0; i < children.size(); i++)
{
if(children.at(i)->name == name)
if(children.at(i)->name.compare(name) == 0)
{
child = children.at(i);
break;
return children.at(i);
}
}
return child;
return NULL;
}

View File

@@ -1,9 +1,11 @@
#include <G3DAll.h>
#pragma once
#pragma once
#include <G3DAll.h>
#include "propertyGrid.h"
class Instance
{
public:
bool canDelete;
Instance(void);
Instance(const Instance&);
virtual ~Instance(void);
@@ -15,11 +17,18 @@ public:
std::vector<Instance* > getChildren();
std::vector<Instance* > getAllChildren();
void setParent(Instance*);
void setName(std::string newName);
void addChild(Instance*);
void removeChild(Instance*);
void clearChildren();
Instance* getParent();
virtual Instance* clone() const { return new Instance(*this); }
virtual std::vector<PROPGRIDITEM> getProperties();
virtual void PropUpdate(LPPROPGRIDITEM &pItem);
int listicon;
protected:
std::string className;
Instance* parent; // Another pointer.
PROPGRIDITEM createPGI(LPSTR catalog, LPSTR propName, LPSTR propDesc, LPARAM curVal, INT type);
};

View File

@@ -1,4 +0,0 @@
#ifndef JOINTTYPE_H
#define JOINTTYPE_H
static enum ActionType {UNK0, Weld, Snap, UNK3, Rotate, RotateP, RotateV, Glue, UNK8, UNK9, None};
#endif

View File

@@ -1,4 +0,0 @@
#ifndef KEYWORDFILTERTYPE_H
#define KEYWORDFILTERTYPE_H
static enum KeywordFilterType {Include, Exclude};
#endif

73
LevelInstance.cpp Normal file
View File

@@ -0,0 +1,73 @@
#include "LevelInstance.h"
LevelInstance::LevelInstance(void)
{
Instance::Instance();
name = "Level";
winMessage = "You Won!";
loseMessage = "You Lost. Try Again";
timer = 60.0F;
score = 0;
canDelete = false;
}
LevelInstance::~LevelInstance(void)
{
}
char timerTxt[12];
char scoreTxt[12];
std::vector<PROPGRIDITEM> LevelInstance::getProperties()
{
std::vector<PROPGRIDITEM> properties = Instance::getProperties();
properties.push_back(createPGI("Messages",
"WinMessage",
"The message that shows when the player wins.",
(LPARAM)winMessage.c_str(),
PIT_EDIT));
properties.push_back(createPGI("Messages",
"LoseMessage",
"The message that shows when the player loses.",
(LPARAM)loseMessage.c_str(),
PIT_EDIT));
sprintf(timerTxt, "%g", timer);
sprintf(scoreTxt, "%d", score);
properties.push_back(createPGI("Gameplay",
"InitialTimerValue",
"The ammount of time in seconds the player has to complete this level.\r\n\r\nPut 0 if time is limitless.",
(LPARAM)timerTxt,
PIT_EDIT));
properties.push_back(createPGI("Gameplay",
"InitialScoreValue",
"The ammount of points the player starts with.",
(LPARAM)scoreTxt,
PIT_EDIT));
return properties;
}
void LevelInstance::PropUpdate(LPPROPGRIDITEM &pItem)
{
if(strcmp(pItem->lpszPropName, "InitialTimerValue") == 0)
{
timer = atoi((LPSTR)pItem->lpCurValue);
}
if(strcmp(pItem->lpszPropName, "InitialScoreValue") == 0)
{
score = atof((LPSTR)pItem->lpCurValue);
}
if(strcmp(pItem->lpszPropName, "LoseMessage") == 0)
{
loseMessage = (LPSTR)pItem->lpCurValue;
}
if(strcmp(pItem->lpszPropName, "WinMessage") == 0)
{
winMessage = (LPSTR)pItem->lpCurValue;
}
else
Instance::PropUpdate(pItem);
}

16
LevelInstance.h Normal file
View File

@@ -0,0 +1,16 @@
#pragma once
#include "instance.h"
class LevelInstance :
public Instance
{
public:
LevelInstance(void);
~LevelInstance(void);
float timer;
int score;
virtual std::vector<PROPGRIDITEM> getProperties();
std::string winMessage;
std::string loseMessage;
virtual void PropUpdate(LPPROPGRIDITEM &pItem);
};

41
PVInstance.cpp Normal file
View File

@@ -0,0 +1,41 @@
#include "PVInstance.h"
PVInstance::PVInstance(void)
{
Instance::Instance();
nameShown = false;
className = "PVInstance";
}
PVInstance::PVInstance(const PVInstance &oinst)
{
Instance::Instance(oinst);
}
PVInstance::~PVInstance(void)
{
}
void PVInstance::postRender(RenderDevice* rd)
{
}
std::vector<PROPGRIDITEM> PVInstance::getProperties()
{
std::vector<PROPGRIDITEM> properties = Instance::getProperties();
properties.push_back(createPGI(
"Item",
"NameShown",
"This chooses whether the item name is shown",
nameShown,
PIT_CHECK));
return properties;
}
void PVInstance::PropUpdate(LPPROPGRIDITEM &pItem)
{
if(strcmp(pItem->lpszPropName, "NameShown") == 0)
{
nameShown = (bool)pItem->lpCurValue;
}
else Instance::PropUpdate(pItem);
}

15
PVInstance.h Normal file
View File

@@ -0,0 +1,15 @@
#pragma once
#include "instance.h"
class PVInstance :
public Instance
{
public:
PVInstance(void);
~PVInstance(void);
PVInstance(const PVInstance &oinst);
virtual void postRender(RenderDevice* rd);
virtual std::vector<PROPGRIDITEM> getProperties();
virtual void PropUpdate(LPPROPGRIDITEM &pItem);
bool nameShown;
};

603
PartInstance.cpp Normal file
View File

@@ -0,0 +1,603 @@
#include "PartInstance.h"
#include "Globals.h"
#include <sstream>
#include <iomanip>
PartInstance::PartInstance(void) : _bevelSize(0.07f), _parseVert(0), _debugTimer(0)
{
PVInstance::PVInstance();
glList = glGenLists(1);
name = "Unnamed PVItem";
className = "Part";
canCollide = true;
anchored = true;
size = Vector3(2,1,4);
setCFrame(CoordinateFrame(Vector3(0,0,0)));
color = Color3::gray();
velocity = Vector3(0,0,0);
rotVelocity = Vector3(0,0,0);
top = Enum::SurfaceType::Smooth;
front = Enum::SurfaceType::Smooth;
right = Enum::SurfaceType::Smooth;
back = Enum::SurfaceType::Smooth;
left = Enum::SurfaceType::Smooth;
bottom = Enum::SurfaceType::Smooth;
shape = Enum::Shape::Block;
}
void PartInstance::postRender(RenderDevice *rd)
{
if(!nameShown)
return;
G3D::GFontRef fnt = NULL;
Instance* dm = parent;
while(dm != NULL)
{
if(DataModelInstance* mod = dynamic_cast<DataModelInstance*>(dm))
{
fnt = mod->font;
break;
}
dm = dm->getParent();
}
if(!fnt.isNull())
{
Vector3 gamepoint = position + Vector3(0,1.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 < 100 && distance > -100)
{
if(distance < 0)
distance = distance*-1;
glDisable(GL_DEPTH_TEST);
fnt->draw3D(rd, name, CoordinateFrame(rd->getCameraToWorldMatrix().rotation, gamepoint), 0.03*distance, Color3::yellow(), Color3::black(), G3D::GFont::XALIGN_CENTER, G3D::GFont::YALIGN_CENTER);
glEnable(GL_DEPTH_TEST);
}
}
}
PartInstance::PartInstance(const PartInstance &oinst) : _bevelSize(0.07f), _parseVert(0), _debugTimer(0)
{
PVInstance::PVInstance(oinst);
glList = glGenLists(1);
//name = oinst.name;
//className = "Part";
name = oinst.name;
canCollide = oinst.canCollide;
setParent(oinst.parent);
anchored = oinst.anchored;
size = oinst.size;
setCFrame(oinst.cFrame);
color = oinst.color;
velocity = oinst.velocity;
rotVelocity = oinst.rotVelocity;
top = oinst.top;
front = oinst.front;
right = oinst.right;
back = oinst.back;
left = oinst.left;
bottom = oinst.bottom;
shape = oinst.shape;
changed = true;
}
void PartInstance::setSize(Vector3 newSize)
{
int minsize = 1;
int maxsize = 512;
changed = true;
int sizex = (int)newSize.x;
if(sizex <= 0)
sizex = 1;
if(sizex > 512)
sizex = 512;
int sizey = (int)newSize.y;
if(sizey <= 0)
sizey = 1;
if(sizey > 512)
sizey = 512;
int sizez = (int)newSize.z;
if(sizez <= 0)
sizez = 1;
if(sizez > 512)
sizez = 512;
if(shape != Enum::Shape::Block)
{
int max = sizex;
if(sizey > max)
max = sizey;
if(sizez > max)
max = sizez;
sizex = sizey = sizez = max;
}
size = Vector3(sizex, sizey, sizez);
}
Vector3 PartInstance::getSize()
{
return size;
}
Vector3 PartInstance::getPosition()
{
return position;
}
void PartInstance::setPosition(Vector3 pos)
{
position = pos;
cFrame = CoordinateFrame(pos);
changed = true;
}
CoordinateFrame PartInstance::getCFrame()
{
return cFrame;
}
void PartInstance::setCFrame(CoordinateFrame coordinateFrame)
{
cFrame = coordinateFrame;
position = coordinateFrame.translation;
changed = true;
}
// Can probably be deleted
CoordinateFrame PartInstance::getCFrameRenderBased()
{
return cFrame;//CoordinateFrame(getCFrame().rotation,Vector3(getCFrame().translation.x, getCFrame().translation.y, getCFrame().translation.z));
}
// Start Physics stuff
float PartInstance::getMass()
{
if(shape == Enum::Shape::Sphere || shape == Enum::Shape::Cylinder){
return (4/3) * 3.1415926535 * pow(size.x/2, 3);
}
return size.x * size.y * size.z;
}
#ifdef NEW_BOX_RENDER
Box PartInstance::getBox()
{
Box box = Box(Vector3(size.x/2, size.y/2, size.z/2) ,Vector3(-size.x/2,-size.y/2,-size.z/2));
CoordinateFrame c = getCFrameRenderBased();
itemBox = c.toWorldSpace(box);
return itemBox;
}
#else
Box PartInstance::getBox()
{
if(changed)
{
Box box = Box(Vector3(0+size.x/4, 0+size.y/4, 0+size.z/4) ,Vector3(0-size.x/4,0-size.y/4,0-size.z/4));
CoordinateFrame c = getCFrameRenderBased();
itemBox = c.toWorldSpace(box);
Vector3 v0,v1,v2,v3;
for (int f = 0; f < 6; f++) {
itemBox.getFaceCorners(f, v0,v1,v2,v3);
_vertices[f*16] = v0.x;
_vertices[(f*16)+1] = v0.y;
_vertices[(f*16)+2] = v0.z;
_vertices[(f*16)+3] = v1.x;
_vertices[(f*16)+4] = v1.y;
_vertices[(f*16)+5] = v1.z;
_vertices[(f*16)+6] = v2.x;
_vertices[(f*16)+7] = v2.y;
_vertices[(f*16)+8] = v2.z;
_vertices[(f*16)+9] = v3.x;
_vertices[(f*16)+10] = v3.y;
_vertices[(f*16)+11] = v3.z;
_vertices[(f*16)+12] = color.r;
_vertices[(f*16)+13] = color.g;
_vertices[(f*16)+14] = color.b;
_vertices[(f*16)+15] = 1;
}
}
return itemBox;
}
#endif
bool PartInstance::collides(Box box)
{
return CollisionDetection::fixedSolidBoxIntersectsFixedSolidBox(getBox(), box);
}
void PartInstance::addVertex(Vector3 vertexPos,Color3 color)
{
_vertices.push_back(vertexPos.x);
_vertices.push_back(vertexPos.y);
_vertices.push_back(vertexPos.z);
_vertices.push_back(color.r);
_vertices.push_back(color.g);
_vertices.push_back(color.b);
}
void PartInstance::addNormals(Vector3 normal)
{
for (unsigned int i=0;i<3;i+=1) {
_normals.push_back(normal.x);
_normals.push_back(normal.y);
_normals.push_back(normal.z);
}
}
void PartInstance::addSingularNormal(Vector3 normal)
{
_normals.push_back(normal.x);
_normals.push_back(normal.y);
_normals.push_back(normal.z);
}
void PartInstance::addTriangle(Vector3 v1,Vector3 v2,Vector3 v3)
{
addVertex(v1,color);
addVertex(v2,color);
addVertex(v3,color);
//addNormals(cross(v2-v1,v3-v1).direction());
addSingularNormal(cross(v2-v1,v3-v1).direction());
addSingularNormal(cross(v3-v2,v1-v2).direction());
addSingularNormal(cross(v1-v3,v2-v3).direction());
}
void PartInstance::debugPrintVertexIDs(RenderDevice* rd,GFontRef font,Matrix3 rot)
{
_debugUniqueVertices.clear();
glDisable(GL_DEPTH_TEST);
for (unsigned int i=0;i<_vertices.size();i+=6)
{
std::stringstream stream;
stream << std::fixed << std::setprecision(1) << i;
Vector3 testVector = Vector3(_vertices[i],_vertices[i+1],_vertices[i+2]);
if (isUniqueVertex(testVector))
{
font->draw3D(rd, stream.str(), CoordinateFrame(testVector) * -rot, 0.05, Color3::fromARGB(0xFF4F0000), Color4::clear());
_debugUniqueVertices.push_back(testVector);
}
}
glEnable(GL_DEPTH_TEST);
}
void PartInstance::makeFace(int vertex1,int vertex2, int vertex3)
{
addTriangle(Vector3(_vertices[vertex1],_vertices[vertex1+1],_vertices[vertex1+2]),
Vector3(_vertices[vertex2],_vertices[vertex2+1],_vertices[vertex2+2]),
Vector3(_vertices[vertex3],_vertices[vertex3+1],_vertices[vertex3+2]));
}
bool PartInstance::isUniqueVertex(Vector3 pos)
{
for (unsigned int i=0;i<_debugUniqueVertices.size();i+=1)
{
if (pos==_debugUniqueVertices[i])
{
return false;
}
}
return true;
}
#ifdef NEW_BOX_RENDER
void PartInstance::render(RenderDevice* rd) {
if(nameShown)
postRenderStack.push_back(this);
if (changed)
{
getBox();
_vertices.clear();
Vector3 renderSize = size/2;
// Front
addTriangle(Vector3(renderSize.x-_bevelSize,renderSize.y-_bevelSize,renderSize.z),
Vector3(-renderSize.x+_bevelSize,-renderSize.y+_bevelSize,renderSize.z),
Vector3(renderSize.x-_bevelSize,-renderSize.y+_bevelSize,renderSize.z)
);
addTriangle(Vector3(-renderSize.x+_bevelSize,renderSize.y-_bevelSize,renderSize.z),
Vector3(-renderSize.x+_bevelSize,-renderSize.y+_bevelSize,renderSize.z),
Vector3(renderSize.x-_bevelSize,renderSize.y-_bevelSize,renderSize.z)
);
// Top
addTriangle(Vector3(renderSize.x-_bevelSize,renderSize.y,renderSize.z-_bevelSize),
Vector3(renderSize.x-_bevelSize,renderSize.y,-renderSize.z+_bevelSize),
Vector3(-renderSize.x+_bevelSize,renderSize.y,renderSize.z-_bevelSize)
);
addTriangle(Vector3(-renderSize.x+_bevelSize,renderSize.y,renderSize.z-_bevelSize),
Vector3(renderSize.x-_bevelSize,renderSize.y,-renderSize.z+_bevelSize),
Vector3(-renderSize.x+_bevelSize,renderSize.y,-renderSize.z+_bevelSize)
);
// Back
addTriangle(Vector3(renderSize.x-_bevelSize,renderSize.y-_bevelSize,-renderSize.z),
Vector3(renderSize.x-_bevelSize,-renderSize.y+_bevelSize,-renderSize.z),
Vector3(-renderSize.x+_bevelSize,-renderSize.y+_bevelSize,-renderSize.z)
);
addTriangle(Vector3(renderSize.x-_bevelSize,renderSize.y-_bevelSize,-renderSize.z),
Vector3(-renderSize.x+_bevelSize,-renderSize.y+_bevelSize,-renderSize.z),
Vector3(-renderSize.x+_bevelSize,renderSize.y-_bevelSize,-renderSize.z)
);
// Bottom
addTriangle(Vector3(renderSize.x-_bevelSize,-renderSize.y,-renderSize.z+_bevelSize),
Vector3(renderSize.x-_bevelSize,-renderSize.y,renderSize.z-_bevelSize),
Vector3(-renderSize.x+_bevelSize,-renderSize.y,renderSize.z-_bevelSize)
);
addTriangle(Vector3(-renderSize.x+_bevelSize,-renderSize.y,renderSize.z-_bevelSize),
Vector3(-renderSize.x+_bevelSize,-renderSize.y,-renderSize.z+_bevelSize),
Vector3(renderSize.x-_bevelSize,-renderSize.y,-renderSize.z+_bevelSize)
);
// Left
addTriangle(Vector3(-renderSize.x,renderSize.y-_bevelSize,-renderSize.z+_bevelSize),
Vector3(-renderSize.x,-renderSize.y+_bevelSize,renderSize.z-_bevelSize),
Vector3(-renderSize.x,renderSize.y-_bevelSize,renderSize.z-_bevelSize)
);
addTriangle(Vector3(-renderSize.x,-renderSize.y+_bevelSize,renderSize.z-_bevelSize),
Vector3(-renderSize.x,renderSize.y-_bevelSize,-renderSize.z+_bevelSize),
Vector3(-renderSize.x,-renderSize.y+_bevelSize,-renderSize.z+_bevelSize)
);
// Right
addTriangle(Vector3(renderSize.x,renderSize.y-_bevelSize,renderSize.z-_bevelSize),
Vector3(renderSize.x,-renderSize.y+_bevelSize,renderSize.z-_bevelSize),
Vector3(renderSize.x,renderSize.y-_bevelSize,-renderSize.z+_bevelSize)
);
addTriangle(Vector3(renderSize.x,-renderSize.y+_bevelSize,-renderSize.z+_bevelSize),
Vector3(renderSize.x,renderSize.y-_bevelSize,-renderSize.z+_bevelSize),
Vector3(renderSize.x,-renderSize.y+_bevelSize,renderSize.z-_bevelSize)
);
// Bevel Top Front
makeFace(0,36,48);
makeFace(48,18,0);
// Bevel Left Front Corner
makeFace(18,156,162);
makeFace(24,18,162);
// Bevel Left Front Top Corner
makeFace(48,156,18);
// Bevel Left Front Bottom Corner
makeFace(120,6,150);
// Bevel Left Top
makeFace(48,66,156);
makeFace(144,156,66);
// Bevel Bottom
makeFace(6,120,114);
makeFace(114,12,6);
// Left Bottom
makeFace(120,150,174);
makeFace(174,132,120);
// Right Front Top Corner
makeFace(36,0,180);
// Right Front Corner
makeFace(180,0,12);
makeFace(186,180,12);
// Right Front Bottom Corner
makeFace(186,12,114);
// Right Bottom
makeFace(186,114,108);
makeFace(108,198,186);
// Right Top Corner
makeFace(180,192,36);
makeFace(192,42,36);
// Right Back Top Corner
makeFace(72,42,192);
// Right Back Bottom Corner
makeFace(78,198,108);
// Right Back Corner
makeFace(72,192,198);
makeFace(198,78,72);
// Back Bottom Corner
makeFace(78,108,132);
makeFace(132,84,78);
// Back Top
makeFace(42,72,102);
makeFace(102,66,42);
// Back Left Top Corner
makeFace(144,66,102);
// Back Left Corner
makeFace(144,102,84);
makeFace(84,174,144);
// Back Left Bottom Corner
makeFace(174,84,132);
for (unsigned short i=0;i<_vertices.size()/6;i++) {
_indices.push_back(i);
}
changed=false;
glNewList(glList, GL_COMPILE);
glVertexPointer(3, GL_FLOAT,6 * sizeof(GLfloat), &_vertices[0]);
glColorPointer(3, GL_FLOAT,6 * sizeof(GLfloat), &_vertices[3]);
glNormalPointer(GL_FLOAT,3 * sizeof(GLfloat), &_normals[0]);
glPushMatrix();
//glTranslatef(2,7,0);
glDrawElements(GL_TRIANGLES, _indices.size(), GL_UNSIGNED_SHORT, &_indices[0]);
glPopMatrix();
glEndList();
}
rd->setObjectToWorldMatrix(cFrame);
glCallList(glList);
//rd->setObjectToWorldMatrix(cFrame);
}
#else
void PartInstance::render(RenderDevice* rd)
{
if(changed)
Box box = getBox();
glColor(color);
/*glEnable( GL_TEXTURE_2D );
glEnable(GL_BLEND);// you enable blending function
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBindTexture( GL_TEXTURE_2D, Globals::surfaceId);
glBegin(GL_QUADS);*/
for(int i = 0; i < 96; i+=16)
{
double add = 0.8;
Enum::SurfaceType::Value face;
if(i == 0)//Back
face = back;
else if(i == 16)//Right
face = right;
else if(i == 32)//Front
face = front;
else if(i == 48)//Top
face = top;
else if(i == 64)//Left
face = left;
else if(i == 80)//Bottom
face = bottom;
/*if(face == Snaps)
add = 0.0;
else if(face == Inlets)
add = 0.2;*/
Vector3 v0 = Vector3(_vertices[i], _vertices[i+1], _vertices[i+2]), v1 = Vector3(_vertices[i+3], _vertices[i+4], _vertices[i+5]), v3 = Vector3(_vertices[i+9], _vertices[i+10], _vertices[i+11]);
/*glNormal3fv((v1 - v0).cross(v3 - v0).direction());
glTexCoord2f(0.0F,0.0F);
glVertex3fv(v0);
glTexCoord2f(1.0F,0.0F);
glVertex3fv(v1);
glTexCoord2f(1.0F,0.25F);
glVertex3f(_vertices[i+6], _vertices[i+7], _vertices[i+8]);
glTexCoord2f(0.0F,0.25F);
glVertex3fv(v3);*/
glEnable( GL_TEXTURE_2D );
glEnable(GL_BLEND);// you enable blending function
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBindTexture( GL_TEXTURE_2D, Globals::surfaceId);
glBegin( GL_QUADS );
glNormal3fv((v1 - v0).cross(v3 - v0).direction());
glTexCoord2d(0.0,0.0+add);
glVertex3fv(v0);
glTexCoord2d( 1.0,0.0+add);
glVertex3fv(v1);
glTexCoord2d(1.0,0.2+add);
glVertex3f(_vertices[i+6], _vertices[i+7], _vertices[i+8]);
glTexCoord2d( 0.0,0.2+add);
glVertex3fv(v3);
glEnd();
glDisable( GL_TEXTURE_2D );
}
/*glEnd();
glDisable(GL_TEXTURE_2D);*/
glColor(Color3::white());
if(!children.empty())
{
for(size_t i = 0; i < children.size(); i++)
{
children.at(i)->render(rd);
}
}
}
#endif
PartInstance::~PartInstance(void)
{
glDeleteLists(glList, 1);
}
char pto[512];
char pto2[512];
#include <sstream>
void PartInstance::PropUpdate(LPPROPGRIDITEM &item)
{
if(strcmp(item->lpszPropName, "Color3") == 0)
{
color = Color3(GetRValue(item->lpCurValue)/255.0F,GetGValue(item->lpCurValue)/255.0F,GetBValue(item->lpCurValue)/255.0F);
changed=true;
}
else if(strcmp(item->lpszPropName, "Offset") == 0)
{
std::string str = (LPTSTR)item->lpCurValue;
std::vector<float> vect;
std::stringstream ss(str);
float i;
while (ss >> i)
{
vect.push_back(i);
if (ss.peek() == ',')
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
{
Vector3 pos(vect.at(0),vect.at(1),vect.at(2));
setPosition(pos);
}
}
else if(strcmp(item->lpszPropName, "Size") == 0)
{
std::string str = (LPTSTR)item->lpCurValue;
std::vector<float> vect;
std::stringstream ss(str);
float i;
while (ss >> i)
{
vect.push_back(i);
if (ss.peek() == ',')
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
{
Vector3 size(vect.at(0),vect.at(1),vect.at(2));
setSize(size);
}
}
else PVInstance::PropUpdate(item);
}
std::vector<PROPGRIDITEM> PartInstance::getProperties()
{
std::vector<PROPGRIDITEM> properties = PVInstance::getProperties();
properties.push_back(createPGI(
"Properties",
"Color3",
"The color of the selected part",
RGB((color.r*255),(color.g*255),(color.b*255)),
PIT_COLOR
));
sprintf(pto, "%g, %g, %g", cFrame.translation.x, cFrame.translation.y, cFrame.translation.z);
properties.push_back(createPGI(
"Item",
"Offset",
"The position of the object in the workspace",
(LPARAM)pto,
PIT_EDIT
));
sprintf(pto2, "%g, %g, %g", size.x, size.y, size.z);
properties.push_back(createPGI(
"Item",
"Size",
"The position of the object in the workspace",
(LPARAM)pto2,
PIT_EDIT
));
return properties;
}

66
PartInstance.h Normal file
View File

@@ -0,0 +1,66 @@
#pragma once
#include "PVInstance.h"
#include "Enum.h"
#define NEW_BOX_RENDER
class PartInstance : public PVInstance
{
public:
PartInstance(void);
PartInstance(const PartInstance &oinst);
Instance* clone() const { return new PartInstance(*this); }
virtual void PartInstance::postRender(RenderDevice* rd);
~PartInstance(void);
virtual void render(RenderDevice*);
Vector3 velocity;
Enum::SurfaceType::Value top;
Enum::SurfaceType::Value front;
Enum::SurfaceType::Value right;
Enum::SurfaceType::Value back;
Enum::SurfaceType::Value left;
Enum::SurfaceType::Value bottom;
Enum::Shape::Value shape;
CoordinateFrame cFrame;
Color3 color;
Vector3 getPosition();
void setPosition(Vector3);
CoordinateFrame getCFrame();
void setCFrame(CoordinateFrame);
Box getBox();
Box getScaledBox();
CoordinateFrame getCFrameRenderBased();
Vector3 getSize();
void setSize(Vector3);
bool canCollide;
bool anchored;
Vector3 rotVelocity;
bool collides(Box);
virtual std::vector<PROPGRIDITEM> getProperties();
virtual void PropUpdate(LPPROPGRIDITEM &pItem);
void addVertex(Vector3 vertexPos,Color3 color);
void addNormals(Vector3 normal);
void addSingularNormal(Vector3 normal);
void addTriangle(Vector3 vertexPos,Vector3 vertexPos2, Vector3 vertexPos3);
void debugPrintVertexIDs(RenderDevice* rd, GFontRef font, Matrix3 camRot);
void makeFace(int vertex1, int vertex2, int vertex3);
bool isUniqueVertex(Vector3 pos);
float getMass();
private:
Vector3 position;
Vector3 size;
float _bevelSize;
int _parseVert;
int _debugTimer;
std::vector<Vector3> _debugUniqueVertices;
#ifdef NEW_BOX_RENDER
std::vector<GLfloat> _vertices;
std::vector<GLfloat> _normals;
#else
GLfloat _vertices[96];
#endif
std::vector<GLushort> _indices;
bool changed;
Box itemBox;
GLuint glList;
};

View File

@@ -1,4 +0,0 @@
#ifndef PARTTYPE_H
#define PARTTYPE_H
static enum PartType {Ball, Block, Cylinder};
#endif

BIN
Parts.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

View File

@@ -1,220 +0,0 @@
#include "PhysicalInstance.h"
#include "Globals.h"
GLfloat vertecies[96];
bool changed = true;
Box itemBox = Box();
PhysicalInstance::PhysicalInstance(void)
{
name = "Default PhysicalInstance";
className = "Part";
canCollide = true;
anchored = true;
size = Vector3(2,1,4);
setCFrame(CoordinateFrame(Vector3(0,0,0)));
color = Color3::gray();
velocity = Vector3(0,0,0);
rotVelocity = Vector3(0,0,0);
top = Smooth;
front = Smooth;
right = Smooth;
back = Smooth;
left = Smooth;
bottom = Smooth;
}
PhysicalInstance::PhysicalInstance(const PhysicalInstance &oinst)
{
name = oinst.name;
className = "Part";
canCollide = oinst.canCollide;
setParent(oinst.parent);
anchored = oinst.anchored;
size = oinst.size;
setCFrame(oinst.cFrame);
color = oinst.color;
velocity = oinst.velocity;
rotVelocity = oinst.rotVelocity;
top = oinst.top;
front = oinst.front;
right = oinst.right;
back = oinst.back;
left = oinst.left;
bottom = oinst.bottom;
}
void PhysicalInstance::setSize(Vector3 newSize)
{
int minsize = 1;
int maxsize = 512;
changed = true;
int sizex = (int)newSize.x;
if(sizex <= 0)
sizex = 1;
if(sizex > 512)
sizex = 512;
int sizey = (int)newSize.y;
if(sizey <= 0)
sizey = 1;
if(sizey > 512)
sizey = 512;
int sizez = (int)newSize.z;
if(sizez <= 0)
sizez = 1;
if(sizez > 512)
sizez = 512;
size = Vector3(sizex, sizey, sizez);
}
Vector3 PhysicalInstance::getSize()
{
return size;
}
Vector3 PhysicalInstance::getPosition()
{
return position;
}
void PhysicalInstance::setPosition(Vector3 pos)
{
position = pos;
cFrame = CoordinateFrame(pos);
changed = true;
}
CoordinateFrame PhysicalInstance::getCFrame()
{
return cFrame;
}
void PhysicalInstance::setCFrame(CoordinateFrame coordinateFrame)
{
cFrame = coordinateFrame;
position = coordinateFrame.translation;
changed = true;
}
CoordinateFrame PhysicalInstance::getCFrameRenderBased()
{
return CoordinateFrame(getCFrame().rotation,Vector3(getCFrame().translation.x/2, getCFrame().translation.y/2, getCFrame().translation.z/2));
}
Box PhysicalInstance::getBox()
{
if(changed)
{
Box box = Box(Vector3(0+size.x/4, 0+size.y/4, 0+size.z/4) ,Vector3(0-size.x/4,0-size.y/4,0-size.z/4));
CoordinateFrame c = getCFrameRenderBased();
itemBox = c.toWorldSpace(box);
Vector3 v0,v1,v2,v3;
for (int f = 0; f < 6; f++) {
itemBox.getFaceCorners(f, v0,v1,v2,v3);
vertecies[f*16] = v0.x;
vertecies[(f*16)+1] = v0.y;
vertecies[(f*16)+2] = v0.z;
vertecies[(f*16)+3] = v1.x;
vertecies[(f*16)+4] = v1.y;
vertecies[(f*16)+5] = v1.z;
vertecies[(f*16)+6] = v2.x;
vertecies[(f*16)+7] = v2.y;
vertecies[(f*16)+8] = v2.z;
vertecies[(f*16)+9] = v3.x;
vertecies[(f*16)+10] = v3.y;
vertecies[(f*16)+11] = v3.z;
vertecies[(f*16)+12] = color.r;
vertecies[(f*16)+13] = color.g;
vertecies[(f*16)+14] = color.b;
vertecies[(f*16)+15] = 1;
}
}
return itemBox;
}
bool PhysicalInstance::collides(Box box)
{
return CollisionDetection::fixedSolidBoxIntersectsFixedSolidBox(getBox(), box);
}
void PhysicalInstance::render(RenderDevice* rd)
{
if(changed)
Box box = getBox();
glColor(color);
/*glEnable( GL_TEXTURE_2D );
glEnable(GL_BLEND);// you enable blending function
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBindTexture( GL_TEXTURE_2D, Globals::surfaceId);
glBegin(GL_QUADS);*/
for(int i = 0; i < 96; i+=16)
{
double add = 0.8;
Surface face;
if(i == 0)//Back
face = back;
else if(i == 16)//Right
face = right;
else if(i == 32)//Front
face = front;
else if(i == 48)//Top
face = top;
else if(i == 64)//Left
face = left;
else if(i == 80)//Bottom
face = bottom;
/*if(face == Snaps)
add = 0.0;
else if(face == Inlets)
add = 0.2;*/
Vector3 v0 = Vector3(vertecies[i], vertecies[i+1], vertecies[i+2]), v1 = Vector3(vertecies[i+3], vertecies[i+4], vertecies[i+5]), v3 = Vector3(vertecies[i+9], vertecies[i+10], vertecies[i+11]);
/*glNormal3fv((v1 - v0).cross(v3 - v0).direction());
glTexCoord2f(0.0F,0.0F);
glVertex3fv(v0);
glTexCoord2f(1.0F,0.0F);
glVertex3fv(v1);
glTexCoord2f(1.0F,0.25F);
glVertex3f(vertecies[i+6], vertecies[i+7], vertecies[i+8]);
glTexCoord2f(0.0F,0.25F);
glVertex3fv(v3);*/
glEnable( GL_TEXTURE_2D );
glEnable(GL_BLEND);// you enable blending function
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBindTexture( GL_TEXTURE_2D, Globals::surfaceId);
glBegin( GL_QUADS );
glNormal3fv((v1 - v0).cross(v3 - v0).direction());
glTexCoord2d(0.0,0.0+add);
glVertex3fv(v0);
glTexCoord2d( 1.0,0.0+add);
glVertex3fv(v1);
glTexCoord2d(1.0,0.2+add);
glVertex3f(vertecies[i+6], vertecies[i+7], vertecies[i+8]);
glTexCoord2d( 0.0,0.2+add);
glVertex3fv(v3);
glEnd();
glDisable( GL_TEXTURE_2D );
}
/*glEnd();
glDisable(GL_TEXTURE_2D);*/
glColor(Color3::white());
if(!children.empty())
{
for(size_t i = 0; i < children.size(); i++)
{
children.at(i)->render(rd);
}
}
}
PhysicalInstance::~PhysicalInstance(void)
{
}

View File

@@ -1,39 +0,0 @@
#pragma once
#include "instance.h"
#include "Surface.h"
class PhysicalInstance :
public Instance
{
public:
PhysicalInstance(void);
PhysicalInstance(const PhysicalInstance &oinst);
Instance* clone() const { return new PhysicalInstance(*this); }
~PhysicalInstance(void);
virtual void render(RenderDevice*);
Vector3 velocity;
Surface top;
Surface front;
Surface right;
Surface back;
Surface left;
Surface bottom;
CoordinateFrame cFrame;
Color3 color;
Vector3 getPosition();
void setPosition(Vector3);
CoordinateFrame getCFrame();
void setCFrame(CoordinateFrame);
Box getBox();
Box getScaledBox();
CoordinateFrame getCFrameRenderBased();
Vector3 getSize();
void setSize(Vector3);
bool canCollide;
bool anchored;
Vector3 rotVelocity;
bool collides(Box);
private:
Vector3 position;
Vector3 size;
};

332
PropertyWindow.cpp Normal file
View File

@@ -0,0 +1,332 @@
#define _WINSOCKAPI_
#include <windows.h>
#include "WindowFunctions.h"
#include "resource.h"
#include "PropertyWindow.h"
#include "Globals.h"
#include "strsafe.h"
/*typedef struct typPRGP {
Instance* instance; // Declare member types
Property &prop;
} PRGP;*/
std::vector<PROPGRIDITEM> prop;
std::vector<Instance*> children;
Instance * selectedInstance;
Instance * parent = NULL;
const int CX_BITMAP = 16;
const int CY_BITMAP = 16;
LRESULT CALLBACK PropProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
TCHAR achTemp[256];
PropertyWindow *propWind = (PropertyWindow *)GetWindowLongPtr(hwnd, GWL_USERDATA);
if (propWind==NULL)
{
return DefWindowProc(hwnd, msg, wParam, lParam);
}
switch(msg)
{
case WM_CLOSE:
{
ShowWindow(hwnd, SW_HIDE);
}
break;
case WM_DRAWITEM:
{
std::cout << "Drawing?" << "\r\n";
COLORREF clrBackground;
COLORREF clrForeground;
TEXTMETRIC tm;
int x;
int y;
HRESULT hr;
size_t cch;
LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT) lParam;
if (lpdis->itemID == -1) // Empty item)
break;
// Get the food icon from the item data.
HBITMAP hbmIcon = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BITMAP1));
HBITMAP hbmMask = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BITMAP1));
// The colors depend on whether the item is selected.
clrForeground = SetTextColor(lpdis->hDC,
GetSysColor(lpdis->itemState & ODS_SELECTED ?
COLOR_HIGHLIGHTTEXT : COLOR_WINDOWTEXT));
clrBackground = SetBkColor(lpdis->hDC,
GetSysColor(lpdis->itemState & ODS_SELECTED ?
COLOR_HIGHLIGHT : COLOR_WINDOW));
// Calculate the vertical and horizontal position.
GetTextMetrics(lpdis->hDC, &tm);
y = (lpdis->rcItem.bottom + lpdis->rcItem.top - tm.tmHeight) / 2;
x = LOWORD(GetDialogBaseUnits()) / 4;
// Get and display the text for the list item.
SendMessage(lpdis->hwndItem, CB_GETLBTEXT, lpdis->itemID, (LPARAM) achTemp);
hr = StringCchLength(achTemp, 256, &cch);
if (FAILED(hr))
{
// TODO: Write error handler.
}
ExtTextOut(lpdis->hDC, CX_BITMAP + 2 * x, y,
ETO_CLIPPED | ETO_OPAQUE, &lpdis->rcItem,
achTemp, (UINT)cch, NULL);
// Restore the previous colors.
SetTextColor(lpdis->hDC, clrForeground);
SetBkColor(lpdis->hDC, clrBackground);
// Draw the food icon for the item.
HDC hdc = CreateCompatibleDC(lpdis->hDC);
if (hdc == NULL)
break;
SelectObject(hdc, hbmMask);
BitBlt(lpdis->hDC, x, lpdis->rcItem.top + 1,
CX_BITMAP, CY_BITMAP, hdc, 0, 0, SRCAND);
SelectObject(hdc, hbmIcon);
BitBlt(lpdis->hDC, x, lpdis->rcItem.top + 1,
CX_BITMAP, CY_BITMAP, hdc, 0, 0, SRCPAINT);
DeleteDC(hdc);
// If the item has the focus, draw the focus rectangle.
if (lpdis->itemState & ODS_FOCUS)
DrawFocusRect(lpdis->hDC, &lpdis->rcItem);
}
break;
case WM_MEASUREITEM:
{
LPMEASUREITEMSTRUCT lpmis = (LPMEASUREITEMSTRUCT) lParam;
if (lpmis->itemHeight < 18)
lpmis->itemHeight = 18;
}
break;
case WM_SIZE:
{
propWind->onResize();
}
break;
case WM_COMMAND:
{
if(HIWORD(wParam) == CBN_SELCHANGE)
{
int ItemIndex = SendMessage((HWND) lParam, (UINT) CB_GETCURSEL, (WPARAM) 0, (LPARAM) 0);
CHAR ListItem[256];
SendMessage((HWND) lParam, (UINT) CB_GETLBTEXT, (WPARAM) ItemIndex, (LPARAM) ListItem);
if(ItemIndex != 0)
{
propWind->ClearProperties();
while(g_selectedInstances.size() != 0)
g_selectedInstances.erase(g_selectedInstances.begin());
if(parent != NULL)
{
std::cout << ItemIndex << std::endl;
if(ItemIndex == 1)
{
g_selectedInstances.push_back(parent);
propWind->SetProperties(parent);
}
else
{
g_selectedInstances.push_back(children.at(ItemIndex+2));
propWind->SetProperties(children.at(ItemIndex+2));
}
}
else
{
g_selectedInstances.push_back(children.at(ItemIndex-1));
propWind->SetProperties(children.at(ItemIndex-1));
}
}
}
}
break;
case WM_NOTIFY:
{
switch(((LPNMHDR)lParam)->code)
{
case PGN_PROPERTYCHANGE:
{
if (IDC_PROPERTYGRID==wParam) {
LPNMHDR pnm = (LPNMHDR)lParam;
LPNMPROPGRID lpnmp = (LPNMPROPGRID)pnm;
LPPROPGRIDITEM item = PropGrid_GetItemData(pnm->hwndFrom,lpnmp->iIndex);
selectedInstance->PropUpdate(item);
//propWind->SetProperties(selectedInstance);
}
}
break;
}
//MessageBox(NULL,"Test","Test",0);
}
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
void PropertyWindow::refreshExplorer()
{
SendMessage(_explorerComboBox,CB_RESETCONTENT,0,0);
parent = NULL;
for (unsigned int i=0;i<g_selectedInstances.size();i++) {
SendMessage(_explorerComboBox,CB_ADDSTRING, 0,(LPARAM)g_selectedInstances[i]->name.c_str());
if(g_selectedInstances[i]->getParent() != NULL)
{
std::string title = ".. (";
title += g_selectedInstances[i]->getParent()->name;
title += ")";
SendMessage(_explorerComboBox,CB_ADDSTRING, 0,(LPARAM)title.c_str());
parent = g_selectedInstances[i]->getParent();
}
children = g_selectedInstances[i]->getChildren();
for(size_t z = 0; z < children.size(); z++)
{
SendMessage(_explorerComboBox,CB_ADDSTRING, 0,(LPARAM)children.at(z)->name.c_str());
}
SendMessage(_explorerComboBox,CB_SETCURSEL,0,(LPARAM)0);
}
}
bool PropertyWindow::onCreate(int x, int y, int sx, int sy, HMODULE hThisInstance) {
if (!createWindowClass("propHWND",PropProc,hThisInstance))
return false;
_hwndProp = CreateWindowEx(
WS_EX_TOOLWINDOW,
"propHWND",
"PropertyGrid",
WS_VISIBLE | WS_POPUPWINDOW | WS_THICKFRAME | WS_CAPTION,
CW_USEDEFAULT,
CW_USEDEFAULT,
300,
660,
NULL, // parent
NULL, // menu
hThisInstance,
NULL
);
_explorerComboBox = CreateWindowEx(
NULL,
"COMBOBOX",
"Combo",
WS_VISIBLE | WS_CHILD | CBS_DROPDOWNLIST,
0,
0,
0,
0,
_hwndProp, // parent
NULL, // menu
hThisInstance,
NULL
);
SendMessage(_explorerComboBox, WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT), 0);
_propGrid = New_PropertyGrid(_hwndProp,IDC_PROPERTYGRID);
/*PROPGRIDITEM pItem;
PropGrid_ItemInit(pItem);
pItem.lpszCatalog="Test";
pItem.lpszPropName="Offset";
pItem.lpszzCmbItems="What";
pItem.lpszPropDesc="Description";
pItem.lpCurValue=(LPARAM)"0, 0, 0";
pItem.iItemType=PIT_EDIT;
PROPGRIDITEM pItem2;
PropGrid_ItemInit(pItem2);
pItem2.lpszCatalog="Test";
pItem2.lpszPropName="s";
pItem2.lpszzCmbItems="itemlist\0itemlist2\0itemlist3";
pItem2.lpszPropDesc="";
pItem2.lpCurValue=0;
pItem2.iItemType=PIT_COMBO;
/*PROPGRIDITEM FauxExplorerItem;
PropGrid_ItemInit(FauxExplorerItem);
FauxExplorerItem.lpszCatalog="Test";
FauxExplorerItem.lpszPropName = "Editable Combo Field";
FauxExplorerItem.lpszzCmbItems = "Test1\0Test2\0Test3";
FauxExplorerItem.lpszPropDesc = "Press F4 to view drop down.";
FauxExplorerItem.iItemType = PIT_EDITCOMBO;
FauxExplorerItem.lpCurValue = 1;
PropGrid_AddItem(_propGrid, &FauxExplorerItem);*/
PropGrid_Enable(_propGrid,true);
ShowWindow(_propGrid,SW_SHOW);
// PropGrid_AddItem(_propGrid,&pItem);
// PropGrid_AddItem(_propGrid,&pItem2);
PropGrid_SetItemHeight(_propGrid,20);
PropGrid_ShowToolTips(_propGrid,TRUE);
PropGrid_ShowPropertyDescriptions(_propGrid,TRUE);
PropGrid_ExpandAllCatalogs(_propGrid);
SetWindowLongPtr(_hwndProp,GWL_USERDATA,(LONG)this);
refreshExplorer();
_resize();
return true;
}
PropertyWindow::PropertyWindow(int x, int y, int sx, int sy, HMODULE hThisInstance) {
onCreate(x, y, sx, sy, hThisInstance);
}
void PropertyWindow::onResize()
{
_resize();
}
void PropertyWindow::_resize()
{
RECT rect;
GetClientRect(_hwndProp,&rect);
SetWindowPos(_propGrid, NULL, 0, 20, rect.right, rect.bottom-20, SWP_NOZORDER | SWP_NOACTIVATE);
SetWindowPos(_explorerComboBox, NULL, 0, 0, rect.right, 400, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
}
void PropertyWindow::SetProperties(Instance * instance)
{
PropGrid_ResetContent(_propGrid);
prop = instance->getProperties();
selectedInstance = instance;
for(size_t i = 0; i < prop.size(); i++)
{
::PROPGRIDITEM item = prop.at(i);
PropGrid_AddItem(_propGrid, &item);
//PRGP propgp;
//propgp.instance = instance;
//propgp.prop = prop.at(i);
}
PropGrid_ExpandAllCatalogs(_propGrid);
//SetWindowLongPtr(_propGrid,GWL_USERDATA,(LONG)this);
refreshExplorer();
_resize();
}
void PropertyWindow::ClearProperties()
{
PropGrid_ResetContent(_propGrid);
}

16
PropertyWindow.h Normal file
View File

@@ -0,0 +1,16 @@
#pragma once
#include "Instance.h"
class PropertyWindow {
public:
PropertyWindow(int x, int y, int sx, int sy, HMODULE hThisInstance);
bool onCreate(int x, int y, int sx, int sy, HMODULE hThisInstance);
void SetProperties(Instance *);
void ClearProperties();
void onResize();
void refreshExplorer();
HWND _hwndProp;
private:
HWND _propGrid;
HWND _explorerComboBox;
void _resize();
};

View File

@@ -1,4 +0,0 @@
#ifndef SOUNDTYPE_H
#define SOUNDTYPE_H
static enum SoundType {NoSound, Boing, Bomb, Break, Click, Clock, Slingshot, Page, Ping, Snap, Splat, Step, StepOn, Swoosh, Victory};
#endif

View File

@@ -1,4 +0,0 @@
#ifndef SURFACE_H
#define SURFACE_H
static enum Surface {Smooth, Snaps, Inlets, Glue, Weld, Hinge, Motor};
#endif

View File

@@ -1,4 +0,0 @@
#ifndef SURFACECONSTRAINT_H
#define SURFACECONSTRAINT_H
static enum SurfaceConstraint {None, Hinge, SteppingMotor, Motor};
#endif

View File

@@ -1,4 +0,0 @@
#ifndef SURFACETYPE_H
#define SURFACETYPE_H
static enum SurfaceType {Smooth, Bumps, Weld, Snaps, Inlet};
#endif

View File

@@ -1,28 +1,9 @@
#include "TextButtonInstance.h"
Vector2 boxBegin;
Vector2 boxEnd;
Vector2 fontLocationRelativeTo;
Color4 textColor;
Color4 textOutlineColor;
Color4 boxColor;
Color4 boxOutlineColor;
Color4 textColorOvr;
Color4 textOutlineColorOvr;
Color4 boxColorOvr;
Color4 boxOutlineColorOvr;
Color4 textColorDn;
Color4 textOutlineColorDn;
Color4 boxColorDn;
Color4 boxOutlineColorDn;
bool centeredWithinBox;
std::string title;
G3D::GFontRef* font;
int textSize;
bool visible;
TextButtonInstance::TextButtonInstance(void)
{
BaseButtonInstance::BaseButtonInstance();
boxBegin = Vector2(0,0);
boxEnd = Vector2(0,0);
fontLocationRelativeTo = Vector2(0,0);
@@ -40,6 +21,7 @@ TextButtonInstance::TextButtonInstance(void)
visible = true;
className = "TextButton";
disabled = false;
selected = false;
}
bool TextButtonInstance::mouseInButton(float mousex, float mousey, RenderDevice* rd)
@@ -77,6 +59,10 @@ void TextButtonInstance::setAllColorsSame()
textOutlineColorDn = textOutlineColor;
boxColorDn = boxColor;
boxOutlineColorDn = boxOutlineColor;
textColorDis = textColor;
textOutlineColorDis = textOutlineColor;
boxColorDis = boxColor;
boxOutlineColorDis = boxOutlineColor;
}
TextButtonInstance::~TextButtonInstance(void)
@@ -87,6 +73,9 @@ void TextButtonInstance::drawObj(RenderDevice* rd, Vector2 mousePos, bool mouseD
{
Vector3 point1;
Vector3 point2;
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
if(floatBottom)
{
point1 = Vector3(boxBegin.x, rd->getHeight() + boxBegin.y,0);
@@ -99,7 +88,12 @@ void TextButtonInstance::drawObj(RenderDevice* rd, Vector2 mousePos, bool mouseD
point2 = Vector3(boxEnd.x, boxEnd.y,0);
}
Vector2 RelativeTo = Vector2(point1.x + fontLocationRelativeTo.x, point1.y + fontLocationRelativeTo.y);
if(mouseInArea(point1.x, point1.y, point2.x, point2.y, mousePos.x, mousePos.y) && mouseDown)
if(disabled)
{
Draw::box(Box(point1, point2), rd, boxColorDis, boxOutlineColorDis);
font->draw2D(rd, title, RelativeTo, textSize, textColorDis, textOutlineColorDis);
}
else if(mouseInArea(point1.x, point1.y, point2.x, point2.y, mousePos.x, mousePos.y) && mouseDown)
{
Draw::box(Box(point1, point2), rd, boxColorDn, boxOutlineColorDn);
font->draw2D(rd, title, RelativeTo, textSize, textColorDn, textOutlineColorDn);
@@ -109,11 +103,18 @@ void TextButtonInstance::drawObj(RenderDevice* rd, Vector2 mousePos, bool mouseD
Draw::box(Box(point1, point2), rd, boxColorOvr, boxOutlineColorOvr);
font->draw2D(rd, title, RelativeTo, textSize, textColorOvr, textOutlineColorOvr);
}
else if(selected)
{
Draw::box(Box(point1, point2), rd, boxColorOvr, boxOutlineColorOvr);
font->draw2D(rd, title, RelativeTo, textSize, textColorOvr, textOutlineColorOvr);
}
else
{
Draw::box(Box(point1, point2), rd, boxColor, boxOutlineColor);
font->draw2D(rd, title, RelativeTo, textSize, textColor, textOutlineColor);
}
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
}
void doNullCheck()

View File

@@ -21,6 +21,10 @@ public:
Color4 textOutlineColorDn;
Color4 boxColorDn;
Color4 boxOutlineColorDn;
Color4 textColorDis;
Color4 textOutlineColorDis;
Color4 boxColorDis;
Color4 boxOutlineColorDis;
bool centeredWithinBox;
std::string title;
G3D::GFontRef font;

View File

@@ -1,12 +1,12 @@
#include "WorkspaceInstance.h"
float timer = 60.0F;
int score = 0;
WorkspaceInstance::WorkspaceInstance(void)
{
GroupInstance::GroupInstance();
name = "Workspace";
className = "Workspace";
timer = 60.0F;
score = 0;
canDelete = false;
}
WorkspaceInstance::~WorkspaceInstance(void)

View File

@@ -1,12 +1,10 @@
#pragma once
#include "instance.h"
#include "GroupInstance.h"
class WorkspaceInstance :
public Instance
public GroupInstance
{
public:
float timer;
int score;
WorkspaceInstance(void);
~WorkspaceInstance(void);
};

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

588
main.cpp

File diff suppressed because it is too large Load Diff

52
rapidxml/license.txt Normal file
View File

@@ -0,0 +1,52 @@
Use of this software is granted under one of the following two licenses,
to be chosen freely by the user.
1. Boost Software License - Version 1.0 - August 17th, 2003
===============================================================================
Copyright (c) 2006, 2007 Marcin Kalicinski
Permission is hereby granted, free of charge, to any person or organization
obtaining a copy of the software and accompanying documentation covered by
this license (the "Software") to use, reproduce, display, distribute,
execute, and transmit the Software, and to prepare derivative works of the
Software, and to permit third-parties to whom the Software is furnished to
do so, all subject to the following:
The copyright notices in the Software and this entire statement, including
the above license grant, this restriction and the following disclaimer,
must be included in all copies of the Software, in whole or in part, and
all derivative works of the Software, unless such copies or derivative
works are solely in the form of machine-executable object code generated by
a source language processor.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
2. The MIT License
===============================================================================
Copyright (c) 2006, 2007 Marcin Kalicinski
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.

406
rapidxml/manual.html Normal file

File diff suppressed because one or more lines are too long

2596
rapidxml/rapidxml.hpp Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,174 @@
#ifndef RAPIDXML_ITERATORS_HPP_INCLUDED
#define RAPIDXML_ITERATORS_HPP_INCLUDED
// Copyright (C) 2006, 2009 Marcin Kalicinski
// Version 1.13
// Revision $DateTime: 2009/05/13 01:46:17 $
//! \file rapidxml_iterators.hpp This file contains rapidxml iterators
#include "rapidxml.hpp"
namespace rapidxml
{
//! Iterator of child nodes of xml_node
template<class Ch>
class node_iterator
{
public:
typedef typename xml_node<Ch> value_type;
typedef typename xml_node<Ch> &reference;
typedef typename xml_node<Ch> *pointer;
typedef std::ptrdiff_t difference_type;
typedef std::bidirectional_iterator_tag iterator_category;
node_iterator()
: m_node(0)
{
}
node_iterator(xml_node<Ch> *node)
: m_node(node->first_node())
{
}
reference operator *() const
{
assert(m_node);
return *m_node;
}
pointer operator->() const
{
assert(m_node);
return m_node;
}
node_iterator& operator++()
{
assert(m_node);
m_node = m_node->next_sibling();
return *this;
}
node_iterator operator++(int)
{
node_iterator tmp = *this;
++this;
return tmp;
}
node_iterator& operator--()
{
assert(m_node && m_node->previous_sibling());
m_node = m_node->previous_sibling();
return *this;
}
node_iterator operator--(int)
{
node_iterator tmp = *this;
++this;
return tmp;
}
bool operator ==(const node_iterator<Ch> &rhs)
{
return m_node == rhs.m_node;
}
bool operator !=(const node_iterator<Ch> &rhs)
{
return m_node != rhs.m_node;
}
private:
xml_node<Ch> *m_node;
};
//! Iterator of child attributes of xml_node
template<class Ch>
class attribute_iterator
{
public:
typedef typename xml_attribute<Ch> value_type;
typedef typename xml_attribute<Ch> &reference;
typedef typename xml_attribute<Ch> *pointer;
typedef std::ptrdiff_t difference_type;
typedef std::bidirectional_iterator_tag iterator_category;
attribute_iterator()
: m_attribute(0)
{
}
attribute_iterator(xml_node<Ch> *node)
: m_attribute(node->first_attribute())
{
}
reference operator *() const
{
assert(m_attribute);
return *m_attribute;
}
pointer operator->() const
{
assert(m_attribute);
return m_attribute;
}
attribute_iterator& operator++()
{
assert(m_attribute);
m_attribute = m_attribute->next_attribute();
return *this;
}
attribute_iterator operator++(int)
{
attribute_iterator tmp = *this;
++this;
return tmp;
}
attribute_iterator& operator--()
{
assert(m_attribute && m_attribute->previous_attribute());
m_attribute = m_attribute->previous_attribute();
return *this;
}
attribute_iterator operator--(int)
{
attribute_iterator tmp = *this;
++this;
return tmp;
}
bool operator ==(const attribute_iterator<Ch> &rhs)
{
return m_attribute == rhs.m_attribute;
}
bool operator !=(const attribute_iterator<Ch> &rhs)
{
return m_attribute != rhs.m_attribute;
}
private:
xml_attribute<Ch> *m_attribute;
};
}
#endif

421
rapidxml/rapidxml_print.hpp Normal file
View File

@@ -0,0 +1,421 @@
#ifndef RAPIDXML_PRINT_HPP_INCLUDED
#define RAPIDXML_PRINT_HPP_INCLUDED
// Copyright (C) 2006, 2009 Marcin Kalicinski
// Version 1.13
// Revision $DateTime: 2009/05/13 01:46:17 $
//! \file rapidxml_print.hpp This file contains rapidxml printer implementation
#include "rapidxml.hpp"
// Only include streams if not disabled
#ifndef RAPIDXML_NO_STREAMS
#include <ostream>
#include <iterator>
#endif
namespace rapidxml
{
///////////////////////////////////////////////////////////////////////
// Printing flags
const int print_no_indenting = 0x1; //!< Printer flag instructing the printer to suppress indenting of XML. See print() function.
///////////////////////////////////////////////////////////////////////
// Internal
//! \cond internal
namespace internal
{
///////////////////////////////////////////////////////////////////////////
// Internal character operations
// Copy characters from given range to given output iterator
template<class OutIt, class Ch>
inline OutIt copy_chars(const Ch *begin, const Ch *end, OutIt out)
{
while (begin != end)
*out++ = *begin++;
return out;
}
// Copy characters from given range to given output iterator and expand
// characters into references (&lt; &gt; &apos; &quot; &amp;)
template<class OutIt, class Ch>
inline OutIt copy_and_expand_chars(const Ch *begin, const Ch *end, Ch noexpand, OutIt out)
{
while (begin != end)
{
if (*begin == noexpand)
{
*out++ = *begin; // No expansion, copy character
}
else
{
switch (*begin)
{
case Ch('<'):
*out++ = Ch('&'); *out++ = Ch('l'); *out++ = Ch('t'); *out++ = Ch(';');
break;
case Ch('>'):
*out++ = Ch('&'); *out++ = Ch('g'); *out++ = Ch('t'); *out++ = Ch(';');
break;
case Ch('\''):
*out++ = Ch('&'); *out++ = Ch('a'); *out++ = Ch('p'); *out++ = Ch('o'); *out++ = Ch('s'); *out++ = Ch(';');
break;
case Ch('"'):
*out++ = Ch('&'); *out++ = Ch('q'); *out++ = Ch('u'); *out++ = Ch('o'); *out++ = Ch('t'); *out++ = Ch(';');
break;
case Ch('&'):
*out++ = Ch('&'); *out++ = Ch('a'); *out++ = Ch('m'); *out++ = Ch('p'); *out++ = Ch(';');
break;
default:
*out++ = *begin; // No expansion, copy character
}
}
++begin; // Step to next character
}
return out;
}
// Fill given output iterator with repetitions of the same character
template<class OutIt, class Ch>
inline OutIt fill_chars(OutIt out, int n, Ch ch)
{
for (int i = 0; i < n; ++i)
*out++ = ch;
return out;
}
// Find character
template<class Ch, Ch ch>
inline bool find_char(const Ch *begin, const Ch *end)
{
while (begin != end)
if (*begin++ == ch)
return true;
return false;
}
///////////////////////////////////////////////////////////////////////////
// Internal printing operations
// Print node
template<class OutIt, class Ch>
inline OutIt print_node(OutIt out, const xml_node<Ch> *node, int flags, int indent)
{
// Print proper node type
switch (node->type())
{
// Document
case node_document:
out = print_children(out, node, flags, indent);
break;
// Element
case node_element:
out = print_element_node(out, node, flags, indent);
break;
// Data
case node_data:
out = print_data_node(out, node, flags, indent);
break;
// CDATA
case node_cdata:
out = print_cdata_node(out, node, flags, indent);
break;
// Declaration
case node_declaration:
out = print_declaration_node(out, node, flags, indent);
break;
// Comment
case node_comment:
out = print_comment_node(out, node, flags, indent);
break;
// Doctype
case node_doctype:
out = print_doctype_node(out, node, flags, indent);
break;
// Pi
case node_pi:
out = print_pi_node(out, node, flags, indent);
break;
// Unknown
default:
assert(0);
break;
}
// If indenting not disabled, add line break after node
if (!(flags & print_no_indenting))
*out = Ch('\n'), ++out;
// Return modified iterator
return out;
}
// Print children of the node
template<class OutIt, class Ch>
inline OutIt print_children(OutIt out, const xml_node<Ch> *node, int flags, int indent)
{
for (xml_node<Ch> *child = node->first_node(); child; child = child->next_sibling())
out = print_node(out, child, flags, indent);
return out;
}
// Print attributes of the node
template<class OutIt, class Ch>
inline OutIt print_attributes(OutIt out, const xml_node<Ch> *node, int flags)
{
for (xml_attribute<Ch> *attribute = node->first_attribute(); attribute; attribute = attribute->next_attribute())
{
if (attribute->name() && attribute->value())
{
// Print attribute name
*out = Ch(' '), ++out;
out = copy_chars(attribute->name(), attribute->name() + attribute->name_size(), out);
*out = Ch('='), ++out;
// Print attribute value using appropriate quote type
if (find_char<Ch, Ch('"')>(attribute->value(), attribute->value() + attribute->value_size()))
{
*out = Ch('\''), ++out;
out = copy_and_expand_chars(attribute->value(), attribute->value() + attribute->value_size(), Ch('"'), out);
*out = Ch('\''), ++out;
}
else
{
*out = Ch('"'), ++out;
out = copy_and_expand_chars(attribute->value(), attribute->value() + attribute->value_size(), Ch('\''), out);
*out = Ch('"'), ++out;
}
}
}
return out;
}
// Print data node
template<class OutIt, class Ch>
inline OutIt print_data_node(OutIt out, const xml_node<Ch> *node, int flags, int indent)
{
assert(node->type() == node_data);
if (!(flags & print_no_indenting))
out = fill_chars(out, indent, Ch('\t'));
out = copy_and_expand_chars(node->value(), node->value() + node->value_size(), Ch(0), out);
return out;
}
// Print data node
template<class OutIt, class Ch>
inline OutIt print_cdata_node(OutIt out, const xml_node<Ch> *node, int flags, int indent)
{
assert(node->type() == node_cdata);
if (!(flags & print_no_indenting))
out = fill_chars(out, indent, Ch('\t'));
*out = Ch('<'); ++out;
*out = Ch('!'); ++out;
*out = Ch('['); ++out;
*out = Ch('C'); ++out;
*out = Ch('D'); ++out;
*out = Ch('A'); ++out;
*out = Ch('T'); ++out;
*out = Ch('A'); ++out;
*out = Ch('['); ++out;
out = copy_chars(node->value(), node->value() + node->value_size(), out);
*out = Ch(']'); ++out;
*out = Ch(']'); ++out;
*out = Ch('>'); ++out;
return out;
}
// Print element node
template<class OutIt, class Ch>
inline OutIt print_element_node(OutIt out, const xml_node<Ch> *node, int flags, int indent)
{
assert(node->type() == node_element);
// Print element name and attributes, if any
if (!(flags & print_no_indenting))
out = fill_chars(out, indent, Ch('\t'));
*out = Ch('<'), ++out;
out = copy_chars(node->name(), node->name() + node->name_size(), out);
out = print_attributes(out, node, flags);
// If node is childless
if (node->value_size() == 0 && !node->first_node())
{
// Print childless node tag ending
*out = Ch('/'), ++out;
*out = Ch('>'), ++out;
}
else
{
// Print normal node tag ending
*out = Ch('>'), ++out;
// Test if node contains a single data node only (and no other nodes)
xml_node<Ch> *child = node->first_node();
if (!child)
{
// If node has no children, only print its value without indenting
out = copy_and_expand_chars(node->value(), node->value() + node->value_size(), Ch(0), out);
}
else if (child->next_sibling() == 0 && child->type() == node_data)
{
// If node has a sole data child, only print its value without indenting
out = copy_and_expand_chars(child->value(), child->value() + child->value_size(), Ch(0), out);
}
else
{
// Print all children with full indenting
if (!(flags & print_no_indenting))
*out = Ch('\n'), ++out;
out = print_children(out, node, flags, indent + 1);
if (!(flags & print_no_indenting))
out = fill_chars(out, indent, Ch('\t'));
}
// Print node end
*out = Ch('<'), ++out;
*out = Ch('/'), ++out;
out = copy_chars(node->name(), node->name() + node->name_size(), out);
*out = Ch('>'), ++out;
}
return out;
}
// Print declaration node
template<class OutIt, class Ch>
inline OutIt print_declaration_node(OutIt out, const xml_node<Ch> *node, int flags, int indent)
{
// Print declaration start
if (!(flags & print_no_indenting))
out = fill_chars(out, indent, Ch('\t'));
*out = Ch('<'), ++out;
*out = Ch('?'), ++out;
*out = Ch('x'), ++out;
*out = Ch('m'), ++out;
*out = Ch('l'), ++out;
// Print attributes
out = print_attributes(out, node, flags);
// Print declaration end
*out = Ch('?'), ++out;
*out = Ch('>'), ++out;
return out;
}
// Print comment node
template<class OutIt, class Ch>
inline OutIt print_comment_node(OutIt out, const xml_node<Ch> *node, int flags, int indent)
{
assert(node->type() == node_comment);
if (!(flags & print_no_indenting))
out = fill_chars(out, indent, Ch('\t'));
*out = Ch('<'), ++out;
*out = Ch('!'), ++out;
*out = Ch('-'), ++out;
*out = Ch('-'), ++out;
out = copy_chars(node->value(), node->value() + node->value_size(), out);
*out = Ch('-'), ++out;
*out = Ch('-'), ++out;
*out = Ch('>'), ++out;
return out;
}
// Print doctype node
template<class OutIt, class Ch>
inline OutIt print_doctype_node(OutIt out, const xml_node<Ch> *node, int flags, int indent)
{
assert(node->type() == node_doctype);
if (!(flags & print_no_indenting))
out = fill_chars(out, indent, Ch('\t'));
*out = Ch('<'), ++out;
*out = Ch('!'), ++out;
*out = Ch('D'), ++out;
*out = Ch('O'), ++out;
*out = Ch('C'), ++out;
*out = Ch('T'), ++out;
*out = Ch('Y'), ++out;
*out = Ch('P'), ++out;
*out = Ch('E'), ++out;
*out = Ch(' '), ++out;
out = copy_chars(node->value(), node->value() + node->value_size(), out);
*out = Ch('>'), ++out;
return out;
}
// Print pi node
template<class OutIt, class Ch>
inline OutIt print_pi_node(OutIt out, const xml_node<Ch> *node, int flags, int indent)
{
assert(node->type() == node_pi);
if (!(flags & print_no_indenting))
out = fill_chars(out, indent, Ch('\t'));
*out = Ch('<'), ++out;
*out = Ch('?'), ++out;
out = copy_chars(node->name(), node->name() + node->name_size(), out);
*out = Ch(' '), ++out;
out = copy_chars(node->value(), node->value() + node->value_size(), out);
*out = Ch('?'), ++out;
*out = Ch('>'), ++out;
return out;
}
}
//! \endcond
///////////////////////////////////////////////////////////////////////////
// Printing
//! Prints XML to given output iterator.
//! \param out Output iterator to print to.
//! \param node Node to be printed. Pass xml_document to print entire document.
//! \param flags Flags controlling how XML is printed.
//! \return Output iterator pointing to position immediately after last character of printed text.
template<class OutIt, class Ch>
inline OutIt print(OutIt out, const xml_node<Ch> &node, int flags = 0)
{
return internal::print_node(out, &node, flags, 0);
}
#ifndef RAPIDXML_NO_STREAMS
//! Prints XML to given output stream.
//! \param out Output stream to print to.
//! \param node Node to be printed. Pass xml_document to print entire document.
//! \param flags Flags controlling how XML is printed.
//! \return Output stream.
template<class Ch>
inline std::basic_ostream<Ch> &print(std::basic_ostream<Ch> &out, const xml_node<Ch> &node, int flags = 0)
{
print(std::ostream_iterator<Ch>(out), node, flags);
return out;
}
//! Prints formatted XML to given output stream. Uses default printing flags. Use print() function to customize printing process.
//! \param out Output stream to print to.
//! \param node Node to be printed.
//! \return Output stream.
template<class Ch>
inline std::basic_ostream<Ch> &operator <<(std::basic_ostream<Ch> &out, const xml_node<Ch> &node)
{
return print(out, node);
}
#endif
}
#endif

122
rapidxml/rapidxml_utils.hpp Normal file
View File

@@ -0,0 +1,122 @@
#ifndef RAPIDXML_UTILS_HPP_INCLUDED
#define RAPIDXML_UTILS_HPP_INCLUDED
// Copyright (C) 2006, 2009 Marcin Kalicinski
// Version 1.13
// Revision $DateTime: 2009/05/13 01:46:17 $
//! \file rapidxml_utils.hpp This file contains high-level rapidxml utilities that can be useful
//! in certain simple scenarios. They should probably not be used if maximizing performance is the main objective.
#include "rapidxml.hpp"
#include <vector>
#include <string>
#include <fstream>
#include <stdexcept>
namespace rapidxml
{
//! Represents data loaded from a file
template<class Ch = char>
class file
{
public:
//! Loads file into the memory. Data will be automatically destroyed by the destructor.
//! \param filename Filename to load.
file(const char *filename)
{
using namespace std;
// Open stream
basic_ifstream<Ch> stream(filename, ios::binary);
if (!stream)
throw runtime_error(string("cannot open file ") + filename);
stream.unsetf(ios::skipws);
// Determine stream size
stream.seekg(0, ios::end);
size_t size = stream.tellg();
stream.seekg(0);
// Load data and add terminating 0
m_data.resize(size + 1);
stream.read(&m_data.front(), static_cast<streamsize>(size));
m_data[size] = 0;
}
//! Loads file into the memory. Data will be automatically destroyed by the destructor
//! \param stream Stream to load from
file(std::basic_istream<Ch> &stream)
{
using namespace std;
// Load data and add terminating 0
stream.unsetf(ios::skipws);
m_data.assign(istreambuf_iterator<Ch>(stream), istreambuf_iterator<Ch>());
if (stream.fail() || stream.bad())
throw runtime_error("error reading stream");
m_data.push_back(0);
}
//! Gets file data.
//! \return Pointer to data of file.
Ch *data()
{
return &m_data.front();
}
//! Gets file data.
//! \return Pointer to data of file.
const Ch *data() const
{
return &m_data.front();
}
//! Gets file data size.
//! \return Size of file data, in characters.
std::size_t size() const
{
return m_data.size();
}
private:
std::vector<Ch> m_data; // File data
};
//! Counts children of node. Time complexity is O(n).
//! \return Number of children of node
template<class Ch>
inline std::size_t count_children(xml_node<Ch> *node)
{
xml_node<Ch> *child = node->first_node();
std::size_t count = 0;
while (child)
{
++count;
child = child->next_sibling();
}
return count;
}
//! Counts attributes of node. Time complexity is O(n).
//! \return Number of attributes of node
template<class Ch>
inline std::size_t count_attributes(xml_node<Ch> *node)
{
xml_attribute<Ch> *attr = node->first_attribute();
std::size_t count = 0;
while (attr)
{
++count;
attr = attr->next_attribute();
}
return count;
}
}
#endif

View File

@@ -3,12 +3,14 @@
// Used by Dialogs.rc
//
#define IDI_ICON1 102
#define IDB_BITMAP1 103
#define IDC_PROPERTYGRID 2000
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 103
#define _APS_NEXT_RESOURCE_VALUE 104
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 101