Compare commits
257 Commits
cb2a
...
XplicitNgi
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f42c5a4a08 | ||
|
|
4a82c67fdc | ||
|
|
3417a34f37 | ||
|
|
d16bf9e39b | ||
|
|
d12654b4d3 | ||
|
|
5a20b4aefc | ||
|
|
08a3f9f307 | ||
|
|
77ce5c9a5a | ||
|
|
8a097f7eb1 | ||
|
|
e9a13b8163 | ||
|
|
33a43c5072 | ||
|
|
f2347970c4 | ||
|
|
d0b0ffd7f1 | ||
|
|
ab242470b6 | ||
|
|
03eceeae93 | ||
|
|
2919f4ebaa | ||
|
|
1dd930af49 | ||
|
|
98e73cd7ca | ||
|
|
057d86e05a | ||
|
|
89f9e0bfa2 | ||
|
|
61d07a8557 | ||
|
|
948835df98 | ||
|
|
e83a67ade2 | ||
|
|
6ec4ab466d | ||
|
|
f5f5f269d5 | ||
|
|
d492e438d2 | ||
|
|
1700258001 | ||
|
|
ff5b855e12 | ||
|
|
c9bb2ae72b | ||
|
|
5773584f48 | ||
|
|
7e2eb2c694 | ||
|
|
f7d6781698 | ||
|
|
30a05af3b2 | ||
|
|
b1af53995a | ||
|
|
866d644c63 | ||
|
|
1108af7cf3 | ||
|
|
7b4abe3efe | ||
|
|
5dd6ae7d9c | ||
|
|
0566dd0217 | ||
|
|
99d5a1de38 | ||
|
|
5020de484c | ||
|
|
62208a14a5 | ||
|
|
d7b491e073 | ||
|
|
c50d2a8166 | ||
|
|
d2e0b29051 | ||
|
|
4df67897dc | ||
|
|
0f0be7f0b9 | ||
|
|
581f8a3413 | ||
|
|
0174605a3e | ||
|
|
edf1bc701b | ||
|
|
69d55d0a5c | ||
|
|
99ab8e1620 | ||
|
|
ebe7ad682e | ||
|
|
abe406990b | ||
|
|
78c6dec932 | ||
|
|
2c65001536 | ||
|
|
07a2eb4d98 | ||
|
|
ea072e424a | ||
|
|
8b3da447a4 | ||
|
|
77615c5b8f | ||
|
|
dc6c002250 | ||
|
|
70fba67b6e | ||
|
|
1159be9b1b | ||
|
|
6752c5da68 | ||
|
|
77b7c3e62b | ||
|
|
7d7552d141 | ||
|
|
7f7e015706 | ||
|
|
ebbbbb3a69 | ||
|
|
b608a3ab9e | ||
|
|
ccf3ade099 | ||
|
|
3c2ae53449 | ||
|
|
421498e1fe | ||
|
|
8909ded488 | ||
|
|
5114ceb4b7 | ||
|
|
1472b7d6a5 | ||
|
|
52d2cbf5dd | ||
|
|
e4529a949a | ||
|
|
6d1428ced9 | ||
|
|
0f700aeda5 | ||
|
|
7273ee9ce0 | ||
|
|
1a7cd2e250 | ||
|
|
99f78be344 | ||
|
|
ee528d1245 | ||
|
|
18b856602c | ||
|
|
0dcd054da3 | ||
|
|
268a0cd2ee | ||
|
|
c71dcb8a91 | ||
|
|
24306c04ec | ||
|
|
b986815fcb | ||
|
|
a70cc31d28 | ||
|
|
b097cb15e4 | ||
|
|
b18ebfb56f | ||
|
|
eade3d8e93 | ||
|
|
ccf440a65e | ||
|
|
551a0e4b9e | ||
|
|
4afe95ae26 | ||
|
|
c6151b58e2 | ||
|
|
6f91ad5881 | ||
|
|
09d9af492f | ||
|
|
bd37f8e22d | ||
|
|
c5485fbf55 | ||
|
|
f02272976a | ||
|
|
0b9429d1bd | ||
|
|
43e606f08e | ||
|
|
8fd2cb8f68 | ||
|
|
a19103c896 | ||
|
|
06660a9f46 | ||
|
|
aa1c2df26c | ||
|
|
03d696a8fa | ||
|
|
240b342870 | ||
|
|
ef9e6c798b | ||
|
|
a29c59f8d2 | ||
|
|
aa2e62d2b5 | ||
|
|
19f125dcc6 | ||
|
|
0f3ccb8045 | ||
|
|
2134c66124 | ||
|
|
5806b48bae | ||
|
|
507b0a9ace | ||
|
|
679dbe69b8 | ||
|
|
4f766d8617 | ||
|
|
90e74e5133 | ||
|
|
1c9b93d6ab | ||
|
|
5eafaa401a | ||
|
|
e0ba49a03c | ||
|
|
2725f6da58 | ||
|
|
8985579159 | ||
|
|
c03160c3fd | ||
|
|
9193dfcabb | ||
|
|
c4df4131df | ||
|
|
374d3d3627 | ||
|
|
fe65f8945c | ||
|
|
db4c46cf20 | ||
|
|
c00e52a9e2 | ||
|
|
c65ac42d64 | ||
|
|
95d041bf5e | ||
|
|
89d2d0b981 | ||
|
|
0417060c1b | ||
|
|
e7ea4c4b72 | ||
|
|
bbab248209 | ||
|
|
4401fb8773 | ||
|
|
3bbfeae228 | ||
|
|
4bb2098fe1 | ||
|
|
ee1258b177 | ||
|
|
341866b8bb | ||
|
|
dae6dd5390 | ||
|
|
03fd38aaa7 | ||
|
|
f99d18f6ae | ||
|
|
a47268830b | ||
|
|
838f69944e | ||
|
|
c6d6c3fd40 | ||
|
|
bf946ead54 | ||
|
|
2a2d6a777b | ||
|
|
5c90258546 | ||
|
|
018c4a1557 | ||
|
|
0bd49da8f4 | ||
|
|
1926dfa686 | ||
|
|
1c337b0cdc | ||
|
|
54b19ba659 | ||
|
|
336b978fd3 | ||
|
|
90c609d06d | ||
|
|
22e018e138 | ||
|
|
a676a44fea | ||
|
|
cd7785ce06 | ||
|
|
fb3513c6f6 | ||
|
|
0cf7813bea | ||
|
|
39f68e1acc | ||
|
|
be124fff75 | ||
|
|
db9e030b53 | ||
|
|
b1a7aac481 | ||
|
|
e03a438169 | ||
|
|
f934a3fa38 | ||
|
|
8f72e8e666 | ||
|
|
da9d64c56f | ||
|
|
e5f7c7d1cc | ||
|
|
08b4d062e9 | ||
|
|
a8bfa1b4cd | ||
|
|
312ea44922 | ||
|
|
6accc7e366 | ||
|
|
f16d626f0d | ||
|
|
636d39bd2d | ||
|
|
6730ddc7bc | ||
|
|
b66d676254 | ||
|
|
a6eb176ec3 | ||
|
|
8816e96ba3 | ||
|
|
5aaf134ba8 | ||
|
|
66391f69c4 | ||
|
|
b40a2559f6 | ||
|
|
741f4eaf14 | ||
|
|
be7e532ead | ||
|
|
72954be880 | ||
|
|
a16953c8a0 | ||
|
|
b2c0fb58da | ||
|
|
828c0dcb41 | ||
|
|
cd0f1617cb | ||
|
|
2607fc8551 | ||
|
|
1de2fb6811 | ||
|
|
c84a2173c8 | ||
|
|
c38ede1bd1 | ||
|
|
0f609662bb | ||
|
|
512655b448 | ||
|
|
4fea98467d | ||
|
|
29dad6bd8d | ||
|
|
e04f53c071 | ||
|
|
4b580ef5ad | ||
|
|
5232d5e97f | ||
|
|
011d817321 | ||
|
|
60c7a386f0 | ||
|
|
3ee06b6c62 | ||
|
|
57b407c894 | ||
|
|
9999eb62e4 | ||
|
|
930aee06dc | ||
|
|
e6ca1cd502 | ||
|
|
c875454b40 | ||
|
|
388962a5e7 | ||
|
|
9986f2ee5f | ||
|
|
529821ab9f | ||
|
|
d72d09f95d | ||
|
|
d810c213f6 | ||
|
|
2bdef97edf | ||
|
|
ce66ec6f5d | ||
|
|
df5076e90f | ||
|
|
faaa59f58b | ||
|
|
78ece8c2a2 | ||
|
|
8dff73d5f5 | ||
|
|
4bdb1d6939 | ||
|
|
59510383e6 | ||
|
|
f0f16a3a69 | ||
|
|
09c6a73e80 | ||
|
|
3108021007 | ||
|
|
fa3a0f9aa4 | ||
|
|
f45e8afb37 | ||
|
|
739f116895 | ||
|
|
f281103ca1 | ||
|
|
b7d14dcf2a | ||
|
|
5659a1e13c | ||
|
|
fb48c4d85d | ||
|
|
ce3ca419e8 | ||
|
|
c3b9e1f6c8 | ||
|
|
9ba0db1ab9 | ||
|
|
70d9aded42 | ||
|
|
a99f58b62f | ||
|
|
fcb1ad05fd | ||
|
|
50f8c7ec10 | ||
|
|
4094631f30 | ||
|
|
1cae1135b9 | ||
|
|
f78ca49ec0 | ||
|
|
e9c7607a4b | ||
|
|
6d49e266dd | ||
|
|
78cdb01ef1 | ||
|
|
1ed434c858 | ||
|
|
f4acbaacdc | ||
|
|
e777f3ccc4 | ||
|
|
9e61c9e4d2 | ||
|
|
3fb730ceba | ||
|
|
54ed0299c0 | ||
|
|
09fcd72e43 | ||
|
|
0371836dc8 |
2
.gitignore
vendored
2
.gitignore
vendored
@@ -51,3 +51,5 @@ log.txt
|
||||
G3DTest.suo
|
||||
G3DTest.suo
|
||||
stderr.txt
|
||||
desktop.ini
|
||||
main.cpp
|
||||
|
||||
112
AudioPlayer.cpp
Normal file
112
AudioPlayer.cpp
Normal file
@@ -0,0 +1,112 @@
|
||||
#include "AudioPlayer.h"
|
||||
#include "SDL.h"
|
||||
#include "SDL_audio.h"
|
||||
#include <stdlib.h>
|
||||
#include <malloc.h>
|
||||
#include <string.h>
|
||||
#define NUM_SOUNDS 10
|
||||
static SDL_AudioSpec fmt;
|
||||
static bool initiated = false;
|
||||
|
||||
AudioPlayer::AudioPlayer(void)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
AudioPlayer::~AudioPlayer(void)
|
||||
{
|
||||
SDL_CloseAudio();
|
||||
}
|
||||
|
||||
void AudioPlayer::init()
|
||||
{
|
||||
initiated = true;
|
||||
extern void mixaudio(void *unused, Uint8 *stream, int len);
|
||||
fmt.freq = 22050;
|
||||
fmt.format = AUDIO_S16;
|
||||
fmt.channels = 2;
|
||||
fmt.samples = 1024; /* A good value for games */
|
||||
fmt.callback = mixaudio;
|
||||
fmt.userdata = NULL;
|
||||
|
||||
/* Open the audio device and start playing sound! */
|
||||
if ( SDL_OpenAudio(&fmt, NULL) < 0 ) {
|
||||
fprintf(stderr, "Unable to open audio: %s\n", SDL_GetError());
|
||||
}
|
||||
SDL_PauseAudio(0);
|
||||
}
|
||||
|
||||
static struct sample {
|
||||
Uint8 *data;
|
||||
Uint32 dpos;
|
||||
Uint32 dlen;
|
||||
} sounds[NUM_SOUNDS];
|
||||
|
||||
void mixaudio(void *unused, Uint8 *stream, int len)
|
||||
{
|
||||
int i;
|
||||
Uint32 amount;
|
||||
|
||||
for ( i=0; i<NUM_SOUNDS; ++i ) {
|
||||
amount = (sounds[i].dlen-sounds[i].dpos);
|
||||
if ( amount > (Uint32)len ) {
|
||||
amount = len;
|
||||
}
|
||||
SDL_MixAudio(stream, &sounds[i].data[sounds[i].dpos], amount, SDL_MIX_MAXVOLUME);
|
||||
sounds[i].dpos += amount;
|
||||
}
|
||||
}
|
||||
|
||||
void AudioPlayer::playSound(std::string fileString)
|
||||
{
|
||||
|
||||
if(initiated)
|
||||
{
|
||||
char *file = new char[fileString.length() + 1];
|
||||
strcpy(file, fileString.c_str());
|
||||
|
||||
|
||||
int index;
|
||||
SDL_AudioSpec wave;
|
||||
Uint8 *data;
|
||||
Uint32 dlen;
|
||||
SDL_AudioCVT cvt;
|
||||
|
||||
/* Look for an empty (or finished) sound slot */
|
||||
for ( index=0; index<NUM_SOUNDS; ++index ) {
|
||||
if ( sounds[index].dpos == sounds[index].dlen ) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ( index == NUM_SOUNDS )
|
||||
return;
|
||||
|
||||
/* Load the sound file and convert it to 16-bit stereo at 22kHz */
|
||||
if ( SDL_LoadWAV(file, &wave, &data, &dlen) == NULL ) {
|
||||
fprintf(stderr, "Couldn't load %s: %s\n", file, SDL_GetError());
|
||||
return;
|
||||
}
|
||||
SDL_BuildAudioCVT(&cvt, wave.format, wave.channels, wave.freq,
|
||||
AUDIO_S16, 2, fmt.freq);
|
||||
cvt.buf = (Uint8*)malloc(dlen*cvt.len_mult);
|
||||
memcpy(cvt.buf, data, dlen);
|
||||
cvt.len = dlen;
|
||||
SDL_ConvertAudio(&cvt);
|
||||
SDL_FreeWAV(data);
|
||||
|
||||
/* Put the sound data in the slot (it starts playing immediately) */
|
||||
if ( sounds[index].data ) {
|
||||
free(sounds[index].data);
|
||||
}
|
||||
SDL_LockAudio();
|
||||
sounds[index].data = cvt.buf;
|
||||
sounds[index].dlen = cvt.len_cvt;
|
||||
sounds[index].dpos = 0;
|
||||
SDL_UnlockAudio();
|
||||
delete [] file;
|
||||
}
|
||||
else
|
||||
{
|
||||
OutputDebugString("Audio player not initialized, sound will not play\r\n");
|
||||
}
|
||||
}
|
||||
11
AudioPlayer.h
Normal file
11
AudioPlayer.h
Normal file
@@ -0,0 +1,11 @@
|
||||
#include <G3DAll.h>
|
||||
#pragma once
|
||||
|
||||
class AudioPlayer
|
||||
{
|
||||
public:
|
||||
AudioPlayer(void);
|
||||
~AudioPlayer(void);
|
||||
static void playSound(std::string);
|
||||
static void init();
|
||||
};
|
||||
@@ -1,17 +1,23 @@
|
||||
#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;
|
||||
}
|
||||
|
||||
void BaseButtonInstance::render(RenderDevice* rd)
|
||||
{
|
||||
DataModelInstance* dataModel = Globals::dataModel;
|
||||
Vector2 pos = Vector2(dataModel->mousex,dataModel->mousey);
|
||||
drawObj(rd, pos, dataModel->mouseButton1Down);
|
||||
Instance::render(rd);
|
||||
}
|
||||
|
||||
BaseButtonInstance::~BaseButtonInstance(void)
|
||||
{
|
||||
delete listener;
|
||||
|
||||
@@ -8,6 +8,7 @@ class BaseButtonInstance : public Instance
|
||||
public:
|
||||
BaseButtonInstance(void);
|
||||
virtual ~BaseButtonInstance(void);
|
||||
virtual void render(RenderDevice* rd);
|
||||
virtual void drawObj(RenderDevice* rd, Vector2 mousePos, bool mouseDown);
|
||||
virtual bool mouseInButton(float, float, RenderDevice* rd);
|
||||
virtual void onMouseClick();
|
||||
@@ -15,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);
|
||||
|
||||
9
BrowserCallHandler.cpp
Normal file
9
BrowserCallHandler.cpp
Normal file
@@ -0,0 +1,9 @@
|
||||
#include "BrowserCallHandler.h"
|
||||
|
||||
BrowserCallHandler::BrowserCallHandler(void)
|
||||
{
|
||||
}
|
||||
|
||||
BrowserCallHandler::~BrowserCallHandler(void)
|
||||
{
|
||||
}
|
||||
8
BrowserCallHandler.h
Normal file
8
BrowserCallHandler.h
Normal file
@@ -0,0 +1,8 @@
|
||||
#pragma once
|
||||
#include <Mshtmhst.h>
|
||||
class BrowserCallHandler : IDocHostUIHandler
|
||||
{
|
||||
public:
|
||||
BrowserCallHandler(void);
|
||||
~BrowserCallHandler(void);
|
||||
};
|
||||
@@ -1,7 +1,7 @@
|
||||
#include "ButtonListener.h"
|
||||
|
||||
|
||||
ButtonListener::ButtonListener(void)
|
||||
ButtonListener::ButtonListener()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
#pragma once
|
||||
#include "Demo.h"
|
||||
#include "BaseButtonInstance.h"
|
||||
class BaseButtonInstance;
|
||||
|
||||
class ButtonListener
|
||||
{
|
||||
public:
|
||||
ButtonListener(void);
|
||||
ButtonListener();
|
||||
~ButtonListener(void);
|
||||
virtual void onButton1MouseClick(BaseButtonInstance*);
|
||||
//virtual void onMouseOver(); //TODO
|
||||
|
||||
235
CameraController.cpp
Normal file
235
CameraController.cpp
Normal file
@@ -0,0 +1,235 @@
|
||||
#include "CameraController.h"
|
||||
#include "win32Defines.h"
|
||||
#include <iostream>
|
||||
#include "PartInstance.h"
|
||||
#include "Demo.h"
|
||||
#include "AudioPlayer.h"
|
||||
|
||||
|
||||
|
||||
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()
|
||||
{
|
||||
return &g3dCamera;
|
||||
}
|
||||
|
||||
void CameraController::lookAt(const Vector3& position) {
|
||||
const Vector3 look = (position - g3dCamera.getCoordinateFrame().translation);
|
||||
yaw = aTan2(look.x, -look.z);
|
||||
|
||||
pitch = -aTan2(look.y, distance(look.x, look.z));
|
||||
CoordinateFrame frame = g3dCamera.getCoordinateFrame().translation;
|
||||
frame.rotation = Matrix3::fromEulerAnglesZYX(0, -yaw, -pitch);
|
||||
g3dCamera.setCoordinateFrame(frame);
|
||||
}
|
||||
|
||||
void CameraController::setFrame(const CoordinateFrame& cf) {
|
||||
Vector3 look = cf.getLookVector();
|
||||
g3dCamera.setCoordinateFrame(cf);
|
||||
lookAt(cf.translation + look);
|
||||
focusPosition=cf.translation+cf.lookVector()*zoom;
|
||||
}
|
||||
|
||||
CoordinateFrame CameraController::getCoordinateFrame() {
|
||||
CoordinateFrame cf;
|
||||
cf.translation=translation;
|
||||
cf.rotation = Matrix3::fromEulerAnglesZYX(0, -yaw, -pitch);
|
||||
return cf;
|
||||
}
|
||||
|
||||
void CameraController::refreshZoom(const CoordinateFrame& frame)
|
||||
{
|
||||
CoordinateFrame zoomFrame = focusPosition-frame.lookVector()*zoom;
|
||||
zoomFrame.lookAt(focusPosition);
|
||||
setFrame(zoomFrame);
|
||||
}
|
||||
|
||||
void CameraController::pan(CoordinateFrame* frame,float spdX, float spdY)
|
||||
{
|
||||
yaw+=spdX;
|
||||
pitch+=spdY;
|
||||
|
||||
if (pitch>1.4f) pitch=1.4f;
|
||||
if (pitch<-1.4f) pitch=-1.4f;
|
||||
frame->translation = Vector3(sin(-yaw)*zoom*cos(pitch),sin(pitch)*zoom,cos(-yaw)*zoom*cos(pitch))+focusPosition;
|
||||
frame->lookAt(focusPosition);
|
||||
}
|
||||
bool CameraController::onMouseWheel(int x, int y, short delta)
|
||||
{
|
||||
Zoom(delta);
|
||||
return true;
|
||||
}
|
||||
void CameraController::Zoom(short delta)
|
||||
{
|
||||
CoordinateFrame frame = g3dCamera.getCoordinateFrame();
|
||||
|
||||
if (delta>0) { // Mouse wheel up
|
||||
CoordinateFrame zoomFrame = frame+frame.lookVector()*(zoom/5);
|
||||
zoom=(zoomFrame.translation-focusPosition).magnitude();
|
||||
if (zoom>CAM_ZOOM_MIN)
|
||||
{
|
||||
setFrame(zoomFrame);
|
||||
}
|
||||
else
|
||||
{
|
||||
zoom=CAM_ZOOM_MIN;
|
||||
refreshZoom(frame);
|
||||
}
|
||||
}
|
||||
else {
|
||||
CoordinateFrame zoomFrame = frame-frame.lookVector()*(zoom/5);
|
||||
zoom=(zoomFrame.translation-focusPosition).magnitude();
|
||||
if (zoom<CAM_ZOOM_MAX)
|
||||
{
|
||||
setFrame(zoomFrame);
|
||||
}
|
||||
else
|
||||
{
|
||||
zoom=CAM_ZOOM_MAX;
|
||||
refreshZoom(frame);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CameraController::panLeft()
|
||||
{
|
||||
CoordinateFrame frame = g3dCamera.getCoordinateFrame();
|
||||
pan(&frame,toRadians(-45),0);
|
||||
setFrame(frame);
|
||||
|
||||
}
|
||||
void CameraController::panRight()
|
||||
{
|
||||
CoordinateFrame frame = g3dCamera.getCoordinateFrame();
|
||||
pan(&frame,toRadians(45),0);
|
||||
setFrame(frame);
|
||||
}
|
||||
|
||||
void CameraController::tiltUp()
|
||||
{
|
||||
|
||||
CoordinateFrame frame = CoordinateFrame(g3dCamera.getCoordinateFrame().rotation, g3dCamera.getCoordinateFrame().translation);
|
||||
pan(&frame,0,toRadians(25));
|
||||
setFrame(frame);
|
||||
}
|
||||
void CameraController::tiltDown()
|
||||
{
|
||||
CoordinateFrame frame = CoordinateFrame(g3dCamera.getCoordinateFrame().rotation, g3dCamera.getCoordinateFrame().translation);
|
||||
pan(&frame,0,toRadians(-25));
|
||||
setFrame(frame);
|
||||
}
|
||||
|
||||
void CameraController::centerCamera(Instance* selection)
|
||||
{
|
||||
CoordinateFrame frame = CoordinateFrame(g3dCamera.getCoordinateFrame().translation);
|
||||
if(selection == NULL)
|
||||
{
|
||||
lookAt(Vector3(0,0,0));
|
||||
focusPosition=Vector3(0,0,0);
|
||||
}
|
||||
else if(PartInstance* part = dynamic_cast<PartInstance*>(selection))
|
||||
{
|
||||
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)
|
||||
{
|
||||
float offsetSize = 0.05F;
|
||||
|
||||
Vector3 cameraPos = g3dCamera.getCoordinateFrame().translation;
|
||||
CoordinateFrame frame = g3dCamera.getCoordinateFrame();
|
||||
bool moving=false;
|
||||
if(GetHoldKeyState('U')) {
|
||||
forwards = true;
|
||||
moving=true;
|
||||
}
|
||||
if(GetHoldKeyState('J')) {
|
||||
backwards = true;
|
||||
moving=true;
|
||||
}
|
||||
if(GetHoldKeyState('H')) {
|
||||
left = true;
|
||||
moving=true;
|
||||
}
|
||||
if(GetHoldKeyState('K')) {
|
||||
right = true;
|
||||
moving=true;
|
||||
}
|
||||
|
||||
if(forwards) {
|
||||
forwards = false;
|
||||
frame.translation += frame.lookVector()*moveRate;
|
||||
}
|
||||
else if(backwards) {
|
||||
backwards = false;
|
||||
frame.translation -= frame.lookVector()*moveRate;
|
||||
}
|
||||
if(left) {
|
||||
left = false;
|
||||
frame.translation += frame.leftVector()*moveRate;
|
||||
}
|
||||
else if(right) {
|
||||
right = false;
|
||||
frame.translation += frame.rightVector()*moveRate;
|
||||
}
|
||||
|
||||
if (moving)
|
||||
{
|
||||
zoom=7;
|
||||
focusPosition=frame.translation+frame.lookVector()*zoom;
|
||||
}
|
||||
|
||||
if(rightButtonHolding) {
|
||||
Globals::useMousePoint = true;
|
||||
Globals::mousepoint = oldDesktopMouse;
|
||||
POINT mouse;
|
||||
GetCursorPos(&mouse);
|
||||
pan(&frame,(mouse.x-oldDesktopMouse.x)/100.f,(mouse.y-oldDesktopMouse.y)/100.f);
|
||||
SetCursorPos(oldDesktopMouse.x,oldDesktopMouse.y);
|
||||
}
|
||||
else
|
||||
{
|
||||
Globals::useMousePoint = false;
|
||||
}
|
||||
|
||||
if(GetHoldKeyState(VK_RSHIFT) || GetHoldKeyState(VK_LSHIFT)) {
|
||||
moveRate = 2;
|
||||
}
|
||||
else {
|
||||
moveRate = 1;
|
||||
}
|
||||
|
||||
if(GetHoldKeyState(VK_RBUTTON))
|
||||
{
|
||||
if (rightButtonHolding==false)
|
||||
{
|
||||
GetCursorPos(&oldDesktopMouse);
|
||||
rightButtonHolding = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
rightButtonHolding = false;
|
||||
}
|
||||
g3dCamera.setCoordinateFrame(frame);
|
||||
}
|
||||
46
CameraController.h
Normal file
46
CameraController.h
Normal file
@@ -0,0 +1,46 @@
|
||||
#pragma once
|
||||
|
||||
#include <G3DAll.h>
|
||||
#include "Instance.h"
|
||||
#include "Globals.h"
|
||||
#include <string>
|
||||
|
||||
#define CAM_ZOOM_MIN 0.1f
|
||||
#define CAM_ZOOM_MAX 100.f
|
||||
|
||||
class Demo;
|
||||
|
||||
class CameraController {
|
||||
public:
|
||||
CameraController();
|
||||
G3D::CoordinateFrame getCoordinateFrame();
|
||||
|
||||
void setFrame(const CoordinateFrame& cf);
|
||||
void lookAt(const Vector3& position);
|
||||
void refreshZoom(const CoordinateFrame& frame);
|
||||
void pan(CoordinateFrame* frame,float spdX,float spdY);
|
||||
void update(Demo* demo);
|
||||
void centerCamera(Instance* selection);
|
||||
void panLeft();
|
||||
void panRight();
|
||||
void tiltUp();
|
||||
void tiltDown();
|
||||
void Zoom(short delta);
|
||||
bool onMouseWheel(int x, int y, short delta);
|
||||
GCamera* getCamera();
|
||||
private:
|
||||
Vector3 translation;
|
||||
Vector3 focusPosition;
|
||||
float yaw;
|
||||
float pitch;
|
||||
float moveRate;
|
||||
float zoom;
|
||||
bool forwards;
|
||||
bool backwards;
|
||||
bool left;
|
||||
bool right;
|
||||
bool rightButtonHolding;
|
||||
POINT oldDesktopMouse;
|
||||
GCamera g3dCamera;
|
||||
std::string cameraSound;
|
||||
};
|
||||
551
DataModelInstance.cpp
Normal file
551
DataModelInstance.cpp
Normal file
@@ -0,0 +1,551 @@
|
||||
#include <string>
|
||||
#include "DataModelInstance.h"
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include <commdlg.h>
|
||||
|
||||
using namespace std;
|
||||
using namespace rapidxml;
|
||||
|
||||
|
||||
DataModelInstance::DataModelInstance(void)
|
||||
{
|
||||
Instance::Instance();
|
||||
workspace = new WorkspaceInstance();
|
||||
guiRoot = new Instance();
|
||||
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;
|
||||
int y = rd->getHeight()/2;
|
||||
int width = rd->getWidth()/2 + 100;
|
||||
int height = width / 3;
|
||||
Draw::box(Box(Vector3(x-(width/2), y-(height/2), 0), Vector3(x+(width/2), y+(height/2), 0)), rd, Color4::fromARGB(0x55B2B2B2), Color3::fromARGB(0xB2B2B2));
|
||||
font->draw2D(rd, message, Vector2(x,y), height/8, Color3::white(), Color4::clear(), GFont::XALIGN_CENTER, GFont::YALIGN_CENTER);
|
||||
}
|
||||
}
|
||||
|
||||
WorkspaceInstance* DataModelInstance::getWorkspace()
|
||||
{
|
||||
return workspace;
|
||||
}
|
||||
Vector2 DataModelInstance::getMousePos()
|
||||
{
|
||||
return Vector2(mousex,mousey);
|
||||
}
|
||||
void DataModelInstance::setMousePos(int x,int y)
|
||||
{
|
||||
mousex=x;
|
||||
mousey=y;
|
||||
}
|
||||
void DataModelInstance::setMousePos(Vector2 pos)
|
||||
{
|
||||
mousex=pos.x;
|
||||
mousey=pos.y;
|
||||
}
|
||||
Instance* DataModelInstance::getGuiRoot()
|
||||
{
|
||||
return guiRoot;
|
||||
}
|
||||
|
||||
|
||||
LevelInstance* DataModelInstance::getLevel()
|
||||
{
|
||||
return level;
|
||||
}
|
||||
51
DataModelInstance.h
Normal file
51
DataModelInstance.h
Normal file
@@ -0,0 +1,51 @@
|
||||
#pragma once
|
||||
#include "WorkspaceInstance.h"
|
||||
#include "LevelInstance.h"
|
||||
#include "PartInstance.h"
|
||||
#include "rapidxml/rapidxml.hpp"
|
||||
|
||||
class DataModelInstance :
|
||||
public Instance
|
||||
{
|
||||
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*);
|
||||
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;
|
||||
Vector2 getMousePos();
|
||||
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;
|
||||
};
|
||||
60
Demo.h
Normal file
60
Demo.h
Normal file
@@ -0,0 +1,60 @@
|
||||
#pragma once
|
||||
#include <G3DAll.h>
|
||||
#include "CameraController.h"
|
||||
#include "PropertyWindow.h"
|
||||
|
||||
class Demo { // : public GApp {
|
||||
public:
|
||||
Demo(const GAppSettings& settings,HWND parentWindow);
|
||||
void Boop();
|
||||
virtual ~Demo() {}
|
||||
virtual void exitApplication();
|
||||
virtual void onInit();
|
||||
virtual void onLogic();
|
||||
virtual void onNetwork();
|
||||
virtual void onSimulation(RealTime rdt, SimTime sdt, SimTime idt);
|
||||
virtual void onGraphics(RenderDevice* rd);
|
||||
virtual void onUserInput(UserInput* ui);
|
||||
virtual void onCleanup();
|
||||
|
||||
std::vector<Instance*> getSelection();
|
||||
void run();
|
||||
void QuitApp();
|
||||
void resizeWithParent(HWND parentWindow);
|
||||
void onCreate(HWND parentWindow);
|
||||
void onKeyPressed(int key);
|
||||
void onKeyUp(int key);
|
||||
void onMouseLeftPressed(HWND hwnd,int x, int y);
|
||||
void onMouseLeftUp(int x, int y);
|
||||
void onMouseRightPressed(int x, int y);
|
||||
void onMouseRightUp(int x, int y);
|
||||
void onMouseMoved(int x, int y);
|
||||
void onMouseWheel(int x, int y, short delta);
|
||||
|
||||
CameraController cameraController;
|
||||
RenderDevice* renderDevice;
|
||||
UserInput* userInput;
|
||||
PropertyWindow* _propWindow;
|
||||
void generateShadowMap(const CoordinateFrame& lightViewMatrix) const;
|
||||
private:
|
||||
void initGUI();
|
||||
HWND _hWndMain;
|
||||
SkyRef sky;
|
||||
bool quit;
|
||||
bool mouseOnScreen;
|
||||
bool rightButtonHolding;
|
||||
void main();
|
||||
GWindow* _window;
|
||||
HWND _hwndToolbox;
|
||||
HWND _buttonTest;
|
||||
HWND _hwndRenderer;
|
||||
G3D::TextureRef shadowMap;
|
||||
double lightProjX, lightProjY, lightProjNear, lightProjFar;
|
||||
protected:
|
||||
Stopwatch m_graphicsWatch;
|
||||
Stopwatch m_logicWatch;
|
||||
Stopwatch m_networkWatch;
|
||||
Stopwatch m_userInputWatch;
|
||||
Stopwatch m_simulationWatch;
|
||||
Stopwatch m_waitWatch;
|
||||
};
|
||||
BIN
Dialogs.aps
BIN
Dialogs.aps
Binary file not shown.
76
Dialogs.rc
76
Dialogs.rc
@@ -7,7 +7,7 @@
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 2 resource.
|
||||
//
|
||||
#include "afxres.h"
|
||||
#include "windows.h"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#undef APSTUDIO_READONLY_SYMBOLS
|
||||
@@ -34,7 +34,7 @@ END
|
||||
|
||||
2 TEXTINCLUDE
|
||||
BEGIN
|
||||
"#include ""afxres.h""\r\n"
|
||||
"#include ""windows.h""\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
@@ -46,37 +46,6 @@ END
|
||||
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Dialog
|
||||
//
|
||||
|
||||
IDD_TOOLBOX DIALOGEX 0, 0, 398, 64
|
||||
STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD
|
||||
FONT 8, "MS Shell Dlg", 0, 0, 0x0
|
||||
BEGIN
|
||||
CONTROL "",IDC_TOOLBOX_BROWSER,
|
||||
"{A8F8E829-06DA-11D2-8D70-00A0C98B28E2}",WS_TABSTOP,0,0,398,64
|
||||
END
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Dialog Info
|
||||
//
|
||||
|
||||
IDD_TOOLBOX DLGINIT
|
||||
BEGIN
|
||||
IDC_TOOLBOX_BROWSER, 0x376, 76, 0
|
||||
0x0000, 0x0000, 0xb293, 0x0000, 0x0048, 0x0000, 0x0003, 0x0008, 0xf20b,
|
||||
0x4757, 0x0020, 0x0000, 0x005f, 0x0065, 0x0078, 0x0074, 0x0065, 0x006e,
|
||||
0x0074, 0x0078, 0x3db4, 0x0000, 0x0003, 0x0008, 0xf20a, 0x4757, 0xffe0,
|
||||
0xffff, 0x005f, 0x0065, 0x0078, 0x0074, 0x0065, 0x006e, 0x0074, 0x0079,
|
||||
0x0ac0, 0x0000,
|
||||
0
|
||||
END
|
||||
|
||||
#endif // English (U.S.) resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -90,40 +59,6 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_CAN
|
||||
#pragma code_page(1252)
|
||||
#endif //_WIN32
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Dialog
|
||||
//
|
||||
|
||||
IDD_ABOUT_DIALOG DIALOGEX 0, 0, 226, 151
|
||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_FIXEDSYS | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "About"
|
||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||
BEGIN
|
||||
DEFPUSHBUTTON "OK",IDOK,169,130,50,14
|
||||
PUSHBUTTON "Cancel",IDCANCEL,112,130,50,14
|
||||
END
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// DESIGNINFO
|
||||
//
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
GUIDELINES DESIGNINFO
|
||||
BEGIN
|
||||
IDD_ABOUT_DIALOG, DIALOG
|
||||
BEGIN
|
||||
LEFTMARGIN, 7
|
||||
RIGHTMARGIN, 219
|
||||
TOPMARGIN, 7
|
||||
BOTTOMMARGIN, 144
|
||||
END
|
||||
END
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Icon
|
||||
@@ -132,6 +67,13 @@ END
|
||||
// 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
17
Enum.h
Normal 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
14
Enums.h
Normal 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
|
||||
BIN
G3DTest.aps
Normal file
BIN
G3DTest.aps
Normal file
Binary file not shown.
196
G3DTest.vcproj
196
G3DTest.vcproj
@@ -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>
|
||||
@@ -21,6 +21,7 @@
|
||||
ConfigurationType="1"
|
||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
|
||||
UseOfMFC="0"
|
||||
UseOfATL="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="false"
|
||||
CharacterSet="2"
|
||||
>
|
||||
@@ -73,6 +74,7 @@
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="Advapi32.lib UxTheme.lib Comctl32.lib Comdlg32.lib Shell32.lib"
|
||||
OutputFile="./G3DTest.exe"
|
||||
LinkIncremental="1"
|
||||
SuppressStartupBanner="true"
|
||||
@@ -145,7 +147,8 @@
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS"
|
||||
MinimalRebuild="false"
|
||||
BasicRuntimeChecks="0"
|
||||
RuntimeLibrary="2"
|
||||
RuntimeLibrary="3"
|
||||
EnableFunctionLevelLinking="false"
|
||||
PrecompiledHeaderFile=".\Debug/G3DTest.pch"
|
||||
AssemblerListingLocation=".\Debug/"
|
||||
ObjectFile=".\Debug/"
|
||||
@@ -167,12 +170,13 @@
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="Advapi32.lib UxTheme.lib Comctl32.lib Comdlg32.lib Shell32.lib"
|
||||
OutputFile="./G3DTest-Debug.exe"
|
||||
LinkIncremental="2"
|
||||
SuppressStartupBanner="true"
|
||||
GenerateDebugInformation="true"
|
||||
ProgramDatabaseFile=".\Debug/G3DTest.pdb"
|
||||
SubSystem="2"
|
||||
SubSystem="1"
|
||||
TargetMachine="1"
|
||||
/>
|
||||
<Tool
|
||||
@@ -231,7 +235,15 @@
|
||||
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
||||
>
|
||||
<File
|
||||
RelativePath=".\BaseButtonInstance.cpp"
|
||||
RelativePath=".\AudioPlayer.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\ax.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\BrowserCallHandler.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
@@ -239,15 +251,31 @@
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Dialogs.rc"
|
||||
RelativePath=".\CameraController.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\ImageButtonInstance.cpp"
|
||||
RelativePath=".\Globals.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Instance.cpp"
|
||||
RelativePath=".\GroupInstance.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\IEBrowser.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\IEBrowser.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\IEDispatcher.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\LevelInstance.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
@@ -271,20 +299,68 @@
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\PhysicalInstance.cpp"
|
||||
RelativePath=".\PartInstance.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\TextButtonInstance.cpp"
|
||||
RelativePath=".\propertyGrid.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\PropertyWindow.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\PVInstance.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\WindowFunctions.cpp"
|
||||
>
|
||||
</File>
|
||||
<Filter
|
||||
Name="Instance"
|
||||
>
|
||||
<File
|
||||
RelativePath=".\BaseButtonInstance.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\DataModelInstance.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\ImageButtonInstance.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Instance.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\TextButtonInstance.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\WorkspaceInstance.cpp"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header Files"
|
||||
Filter="h;hpp;hxx;hm;inl"
|
||||
>
|
||||
<File
|
||||
RelativePath=".\BaseButtonInstance.h"
|
||||
RelativePath=".\AudioPlayer.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\ax.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\BrowserCallHandler.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
@@ -292,15 +368,67 @@
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\ImageButtonInstance.h"
|
||||
RelativePath=".\CameraController.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Instance.h"
|
||||
RelativePath=".\Demo.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\PhysicalInstance.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=".\LevelInstance.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
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
|
||||
@@ -308,18 +436,58 @@
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\TextButtonInstance.h"
|
||||
RelativePath=".\win32Defines.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\WindowFunctions.h"
|
||||
>
|
||||
</File>
|
||||
<Filter
|
||||
Name="Instance"
|
||||
>
|
||||
<File
|
||||
RelativePath=".\BaseButtonInstance.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\DataModelInstance.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\ImageButtonInstance.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Instance.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\TextButtonInstance.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\WorkspaceInstance.h"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Resource Files"
|
||||
Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
|
||||
>
|
||||
<File
|
||||
RelativePath=".\Dialogs.rc"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\icon1.ico"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Parts.bmp"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
</Files>
|
||||
<Globals>
|
||||
|
||||
19
Globals.cpp
Normal file
19
Globals.cpp
Normal file
@@ -0,0 +1,19 @@
|
||||
#include "Globals.h"
|
||||
|
||||
DataModelInstance* Globals::dataModel = NULL;
|
||||
int const Globals::gen = 0;
|
||||
int const Globals::major = 0;
|
||||
int const Globals::minor = 4;
|
||||
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){}
|
||||
|
||||
Globals::~Globals(void){}
|
||||
25
Globals.h
Normal file
25
Globals.h
Normal file
@@ -0,0 +1,25 @@
|
||||
#pragma once
|
||||
#include "DataModelInstance.h"
|
||||
#include <G3DAll.h>
|
||||
|
||||
class Globals
|
||||
{
|
||||
public:
|
||||
Globals(void);
|
||||
~Globals(void);
|
||||
static DataModelInstance* dataModel;
|
||||
static bool showMouse;
|
||||
static POINT mousepoint;
|
||||
static bool useMousePoint;
|
||||
static const int gen;
|
||||
static const int major;
|
||||
static const int minor;
|
||||
static const int patch;
|
||||
static G3D::TextureRef surface;
|
||||
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
26
GroupInstance.cpp
Normal 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
13
GroupInstance.h
Normal 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);
|
||||
};
|
||||
68
IEBrowser.cpp
Normal file
68
IEBrowser.cpp
Normal file
@@ -0,0 +1,68 @@
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
#include "IEBrowser.h"
|
||||
#include "Globals.h"
|
||||
#include "ax.h"
|
||||
|
||||
void IEBrowser::Boop(char* test)
|
||||
{
|
||||
}
|
||||
|
||||
IEBrowser::IEBrowser(HWND attachHWnd) {
|
||||
MSG messages;
|
||||
while (PeekMessage (&messages, NULL, 0, 0,PM_REMOVE))
|
||||
{
|
||||
if (IsDialogMessage(hwnd, &messages) == 0)
|
||||
{
|
||||
TranslateMessage(&messages);
|
||||
DispatchMessage(&messages);
|
||||
}
|
||||
}
|
||||
hwnd = attachHWnd;
|
||||
spDocument = 0;
|
||||
webBrowser = 0;
|
||||
SendMessage(hwnd,AX_INPLACE,1,0);
|
||||
SendMessage(hwnd,AX_QUERYINTERFACE,(WPARAM)&IID_IWebBrowser2,(LPARAM)&webBrowser);
|
||||
}
|
||||
|
||||
IEBrowser::~IEBrowser(void) {
|
||||
if (webBrowser)
|
||||
{
|
||||
webBrowser->Release();
|
||||
}
|
||||
}
|
||||
|
||||
bool IEBrowser::navigateSyncURL(wchar_t* url)
|
||||
{
|
||||
MSG messages;
|
||||
if (webBrowser)
|
||||
{
|
||||
webBrowser->Navigate(url,0,0,0,0);
|
||||
for (int i=1;i<1000;i++)
|
||||
{
|
||||
while (PeekMessage (&messages, NULL, 0, 0,PM_REMOVE))
|
||||
{
|
||||
if (IsDialogMessage(hwnd, &messages) == 0)
|
||||
{
|
||||
TranslateMessage(&messages);
|
||||
DispatchMessage(&messages);
|
||||
}
|
||||
}
|
||||
Sleep(30);
|
||||
HRESULT hresult = webBrowser->get_Document(&spDocument);
|
||||
if (&spDocument!=0)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
MessageBox(NULL,"Cannot read IWebBrowser2...",(Globals::PlaceholderName+" Crash").c_str(),MB_OK);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
17
IEBrowser.h
Normal file
17
IEBrowser.h
Normal file
@@ -0,0 +1,17 @@
|
||||
//#include "WindowFunctions.h"
|
||||
#pragma once
|
||||
#include <mshtml.h>
|
||||
#include <exdisp.h>
|
||||
//#include <Mshtmhst.h>
|
||||
|
||||
class IEBrowser {
|
||||
public:
|
||||
IEBrowser(HWND attachHWnd);
|
||||
~IEBrowser(void);
|
||||
bool navigateSyncURL(wchar_t* url);
|
||||
void Boop(char* test);
|
||||
private:
|
||||
IWebBrowser2* webBrowser;
|
||||
HWND hwnd;
|
||||
IDispatch* spDocument;
|
||||
};
|
||||
40
IEDispatcher.cpp
Normal file
40
IEDispatcher.cpp
Normal file
@@ -0,0 +1,40 @@
|
||||
#include "IEDispatcher.h"
|
||||
|
||||
IEDispatcher::IEDispatcher(void)
|
||||
{
|
||||
}
|
||||
|
||||
IEDispatcher::~IEDispatcher(void)
|
||||
{
|
||||
}
|
||||
|
||||
HRESULT STDMETHODCALLTYPE IEDispatcher::QueryInterface(const IID &riid, void **ppvObject)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
ULONG STDMETHODCALLTYPE IEDispatcher::AddRef()
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
ULONG STDMETHODCALLTYPE IEDispatcher::Release()
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
HRESULT STDMETHODCALLTYPE IEDispatcher::GetTypeInfoCount(UINT *pctinfo)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
HRESULT STDMETHODCALLTYPE IEDispatcher::GetTypeInfo(UINT, LCID, ITypeInfo **)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
HRESULT STDMETHODCALLTYPE IEDispatcher::GetIDsOfNames(const IID &, LPOLESTR *, UINT, LCID, DISPID *)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
HRESULT STDMETHODCALLTYPE IEDispatcher::Invoke(DISPID, const IID &, LCID, WORD, DISPPARAMS *, VARIANT *, EXCEPINFO *, UINT *)
|
||||
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
17
IEDispatcher.h
Normal file
17
IEDispatcher.h
Normal file
@@ -0,0 +1,17 @@
|
||||
#pragma once
|
||||
#include "oaidl.h"
|
||||
|
||||
class IEDispatcher : public IDispatch
|
||||
{
|
||||
public:
|
||||
IEDispatcher(void);
|
||||
~IEDispatcher(void);
|
||||
HRESULT STDMETHODCALLTYPE IEDispatcher::QueryInterface(const IID &riid, void **ppvObject);
|
||||
ULONG STDMETHODCALLTYPE IEDispatcher::AddRef();
|
||||
ULONG STDMETHODCALLTYPE IEDispatcher::Release();
|
||||
HRESULT STDMETHODCALLTYPE IEDispatcher::GetTypeInfoCount(UINT *pctinfo);
|
||||
HRESULT STDMETHODCALLTYPE IEDispatcher::GetTypeInfo(UINT, LCID, ITypeInfo **);
|
||||
HRESULT STDMETHODCALLTYPE IEDispatcher::GetIDsOfNames(const IID &, LPOLESTR *, UINT, LCID, DISPID *);
|
||||
HRESULT STDMETHODCALLTYPE IEDispatcher::Invoke(DISPID, const IID &, LCID, WORD, DISPPARAMS *, VARIANT *, EXCEPINFO *, UINT *);
|
||||
|
||||
};
|
||||
@@ -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;
|
||||
}
|
||||
@@ -118,8 +109,7 @@ void ImageButtonInstance::drawObj(RenderDevice* rd, Vector2 mousePos, bool mouse
|
||||
}
|
||||
|
||||
|
||||
rd->pushState();
|
||||
rd->beforePrimitive();
|
||||
|
||||
glEnable( GL_TEXTURE_2D );
|
||||
glEnable(GL_BLEND);// you enable blending function
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
@@ -135,8 +125,7 @@ void ImageButtonInstance::drawObj(RenderDevice* rd, Vector2 mousePos, bool mouse
|
||||
glVertex2f( positionRelative.x, positionRelative.y + size.y );
|
||||
glEnd();
|
||||
glDisable( GL_TEXTURE_2D );
|
||||
rd->afterPrimitive();
|
||||
rd->popState();
|
||||
|
||||
if(drawDisabledBox)
|
||||
{
|
||||
Draw::box(Box(Vector3(positionRelative.x, positionRelative.y, 0), Vector3(positionRelative.x+size.x, positionRelative.y+size.y, 0)), rd, Color4(0.7F,0.7F,0.7F,0.3F), Color4::clear());
|
||||
|
||||
160
Instance.cpp
160
Instance.cpp
@@ -2,21 +2,169 @@
|
||||
#include <G3DAll.h>
|
||||
#include "Instance.h"
|
||||
|
||||
std::string name;
|
||||
Instance* parent;
|
||||
static std::string className = "DataModel";
|
||||
|
||||
Instance::Instance(void)
|
||||
{
|
||||
parent = NULL;
|
||||
name = "Default Game Instance";
|
||||
className = "DataModel";
|
||||
className = "BaseInstance";
|
||||
listicon = 0;
|
||||
canDelete = true;
|
||||
}
|
||||
|
||||
Instance::Instance(const Instance &oinst)
|
||||
{
|
||||
|
||||
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)
|
||||
{
|
||||
name = "Default Game Instance";
|
||||
for(size_t i = 0; i < children.size(); i++)
|
||||
{
|
||||
delete children.at(i);
|
||||
}
|
||||
}
|
||||
|
||||
void Instance::setName(std::string newName)
|
||||
{
|
||||
name = newName;
|
||||
}
|
||||
|
||||
std::string Instance::getClassName()
|
||||
{
|
||||
return className;
|
||||
}
|
||||
|
||||
std::vector<Instance* > Instance::getChildren()
|
||||
{
|
||||
return children;
|
||||
}
|
||||
|
||||
std::vector<Instance* > Instance::getAllChildren()
|
||||
{
|
||||
if(!children.empty())
|
||||
{
|
||||
std::vector<Instance* > totalchildren = children;
|
||||
for(size_t i = 0; i < children.size(); i++)
|
||||
{
|
||||
std::vector<Instance* > subchildren = children.at(i)->getAllChildren();
|
||||
if(!subchildren.empty())
|
||||
totalchildren.insert(totalchildren.end(), subchildren.begin(), subchildren.end());
|
||||
}
|
||||
return totalchildren;
|
||||
}
|
||||
return children;
|
||||
}
|
||||
|
||||
void Instance::setParent(Instance* newParent)
|
||||
{
|
||||
if(parent != NULL)
|
||||
{
|
||||
parent->removeChild(this);
|
||||
}
|
||||
parent = newParent;
|
||||
if(newParent != NULL)
|
||||
{
|
||||
newParent->addChild(this);
|
||||
}
|
||||
}
|
||||
|
||||
Instance* Instance::getParent()
|
||||
{
|
||||
return parent;
|
||||
}
|
||||
|
||||
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++)
|
||||
{
|
||||
if(children.at(i) == oldChild)
|
||||
{
|
||||
children.erase(children.begin() + i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Instance* Instance::findFirstChild(std::string name)
|
||||
{
|
||||
for(size_t i = 0; i < children.size(); i++)
|
||||
{
|
||||
if(children.at(i)->name.compare(name) == 0)
|
||||
{
|
||||
return children.at(i);
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
28
Instance.h
28
Instance.h
@@ -1,12 +1,34 @@
|
||||
#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);
|
||||
std::string name;
|
||||
Instance* parent; // Another pointer.
|
||||
virtual void render(RenderDevice*);
|
||||
std::vector<Instance*> children; // All children.
|
||||
std::string getClassName();
|
||||
Instance* findFirstChild(std::string);
|
||||
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);
|
||||
|
||||
};
|
||||
|
||||
73
LevelInstance.cpp
Normal file
73
LevelInstance.cpp
Normal 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
16
LevelInstance.h
Normal 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
41
PVInstance.cpp
Normal 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
15
PVInstance.h
Normal 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
603
PartInstance.cpp
Normal 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
66
PartInstance.h
Normal 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;
|
||||
};
|
||||
@@ -1,52 +0,0 @@
|
||||
#include "PhysicalInstance.h"
|
||||
|
||||
bool canCollide = true;
|
||||
bool anchored = false;
|
||||
Vector3 size;
|
||||
Vector3 position;
|
||||
Vector3 velocity;
|
||||
Vector3 rotVelocity;
|
||||
CoordinateFrame cFrame;
|
||||
Color3 color;
|
||||
|
||||
PhysicalInstance::PhysicalInstance(void)
|
||||
{
|
||||
name = "Default PhysicalInstance";
|
||||
className = "Part";
|
||||
canCollide = true;
|
||||
anchored = true;
|
||||
size = Vector3(2,1,4);
|
||||
position = Vector3(0,0,0);
|
||||
cFrame = CoordinateFrame(position);
|
||||
color = Color3::gray();
|
||||
velocity = Vector3(0,0,0);
|
||||
rotVelocity = Vector3(0,0,0);
|
||||
}
|
||||
|
||||
Vector3 PhysicalInstance::getPosition()
|
||||
{
|
||||
return position;
|
||||
}
|
||||
void PhysicalInstance::setPosition(Vector3 pos)
|
||||
{
|
||||
position = pos;
|
||||
cFrame = CoordinateFrame(pos);
|
||||
}
|
||||
CoordinateFrame PhysicalInstance::getCFrame()
|
||||
{
|
||||
return cFrame;
|
||||
}
|
||||
void PhysicalInstance::setCFrame(CoordinateFrame coordinateFrame)
|
||||
{
|
||||
cFrame = coordinateFrame;
|
||||
position = coordinateFrame.translation;
|
||||
}
|
||||
|
||||
|
||||
PhysicalInstance::~PhysicalInstance(void)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
#pragma once
|
||||
#include "instance.h"
|
||||
|
||||
class PhysicalInstance :
|
||||
public Instance
|
||||
{
|
||||
public:
|
||||
PhysicalInstance(void);
|
||||
~PhysicalInstance(void);
|
||||
Vector3 size;
|
||||
Vector3 velocity;
|
||||
Vector3 rotvelocity;
|
||||
CoordinateFrame cFrame;
|
||||
Color3 color;
|
||||
Vector3 getPosition();
|
||||
void setPosition(Vector3);
|
||||
CoordinateFrame getCFrame();
|
||||
void setCFrame(CoordinateFrame);
|
||||
private:
|
||||
Vector3 position;
|
||||
};
|
||||
332
PropertyWindow.cpp
Normal file
332
PropertyWindow.cpp
Normal 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 ∝
|
||||
} 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
16
PropertyWindow.h
Normal 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();
|
||||
};
|
||||
10
README.md
Normal file
10
README.md
Normal file
@@ -0,0 +1,10 @@
|
||||
# ROBLOX 2005 Recreation Project
|
||||
## Why are we doing this?
|
||||
ROBLOX in 2005 was a different game, based around minigames with win and lose conditions rather than a 3D building game. Since this build of the client is presumed lost despite having around 100 users, we have to recreate it. We are using era-appropriate tools for this as well (Visual Studio 2005 and 2005-era compilers), as well as G3D 6.10, the era-appropriate version of the Graphics3D graphics library used by ROBLOX to this day.
|
||||
|
||||
## Features
|
||||
Equivalent to known features of 05 as it stood in October 2005 with the 'Morgan McGuire builds'
|
||||
|
||||
## Credits
|
||||
- Morgan McGuire, creator of G3D - his old pre-2006 website for the only existing colour pictures of 2005 era roblox on the internet, as well as a couple of helpful emails. He assisted roblox development in the 2004-2006 timeframe.
|
||||
- David Baszucki and Erik Cassel (1967-2013, RIP) - for creating roblox
|
||||
@@ -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()
|
||||
|
||||
@@ -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;
|
||||
|
||||
32
WindowFunctions.cpp
Normal file
32
WindowFunctions.cpp
Normal file
@@ -0,0 +1,32 @@
|
||||
|
||||
#include "WindowFunctions.h"
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
|
||||
using namespace std;
|
||||
|
||||
bool createWindowClass(const char* name,WNDPROC proc,HMODULE hInstance)
|
||||
{
|
||||
WNDCLASSEX wc;
|
||||
wc.cbSize = sizeof(WNDCLASSEX);
|
||||
wc.style = 0;
|
||||
wc.lpfnWndProc = proc;
|
||||
wc.cbClsExtra = 0;
|
||||
wc.cbWndExtra = 0;
|
||||
wc.hInstance = hInstance;
|
||||
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
|
||||
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
||||
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW);
|
||||
wc.lpszMenuName = NULL;
|
||||
wc.lpszClassName = name;
|
||||
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
|
||||
if (!RegisterClassEx (&wc))
|
||||
{
|
||||
stringstream errMsg;
|
||||
errMsg<<"Failed to register " << name;
|
||||
MessageBox(NULL, errMsg.str().c_str(),"Dynamica Crash", MB_OK);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
4
WindowFunctions.h
Normal file
4
WindowFunctions.h
Normal file
@@ -0,0 +1,4 @@
|
||||
#pragma once
|
||||
#include <windows.h>
|
||||
|
||||
bool createWindowClass(const char* name,WNDPROC proc,HMODULE hInstance);
|
||||
14
WorkspaceInstance.cpp
Normal file
14
WorkspaceInstance.cpp
Normal file
@@ -0,0 +1,14 @@
|
||||
#include "WorkspaceInstance.h"
|
||||
|
||||
|
||||
WorkspaceInstance::WorkspaceInstance(void)
|
||||
{
|
||||
GroupInstance::GroupInstance();
|
||||
name = "Workspace";
|
||||
className = "Workspace";
|
||||
canDelete = false;
|
||||
}
|
||||
|
||||
WorkspaceInstance::~WorkspaceInstance(void)
|
||||
{
|
||||
}
|
||||
10
WorkspaceInstance.h
Normal file
10
WorkspaceInstance.h
Normal file
@@ -0,0 +1,10 @@
|
||||
#pragma once
|
||||
#include "GroupInstance.h"
|
||||
|
||||
class WorkspaceInstance :
|
||||
public GroupInstance
|
||||
{
|
||||
public:
|
||||
WorkspaceInstance(void);
|
||||
~WorkspaceInstance(void);
|
||||
};
|
||||
639
ax.cpp
Normal file
639
ax.cpp
Normal file
@@ -0,0 +1,639 @@
|
||||
// AX.CPP
|
||||
#include <windows.h>
|
||||
#include <comdef.h>
|
||||
#include <exdisp.h>
|
||||
#include <oledlg.h>
|
||||
#include "ax.h"
|
||||
|
||||
|
||||
#pragma warning (disable: 4311)
|
||||
#pragma warning (disable: 4312)
|
||||
#pragma warning (disable: 4244)
|
||||
#pragma warning (disable: 4800)
|
||||
|
||||
|
||||
// AXClientSite class
|
||||
// ------- Implement member functions
|
||||
AXClientSite :: AXClientSite()
|
||||
{
|
||||
refNum = 0;
|
||||
CalledCanInPlace = 0;
|
||||
InPlace = 0;
|
||||
}
|
||||
|
||||
AXClientSite :: ~AXClientSite()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
// IUnknown methods
|
||||
STDMETHODIMP AXClientSite :: QueryInterface(REFIID iid,void**ppvObject)
|
||||
{
|
||||
*ppvObject = 0;
|
||||
if (iid == IID_IOleClientSite)
|
||||
*ppvObject = (IOleClientSite*)this;
|
||||
if (iid == IID_IUnknown)
|
||||
*ppvObject = this;
|
||||
if (iid == IID_IAdviseSink)
|
||||
*ppvObject = (IAdviseSink*)this;
|
||||
if (iid == IID_IDispatch)
|
||||
*ppvObject = (IDispatch*)this;
|
||||
if (ExternalPlace == false)
|
||||
{
|
||||
if (iid == IID_IOleInPlaceSite)
|
||||
*ppvObject = (IOleInPlaceSite*)this;
|
||||
if (iid == IID_IOleInPlaceFrame)
|
||||
*ppvObject = (IOleInPlaceFrame*)this;
|
||||
if (iid == IID_IOleInPlaceUIWindow)
|
||||
*ppvObject = (IOleInPlaceUIWindow*)this;
|
||||
}
|
||||
|
||||
//* Log Call
|
||||
if (*ppvObject)
|
||||
{
|
||||
AddRef();
|
||||
return S_OK;
|
||||
}
|
||||
return E_NOINTERFACE;
|
||||
}
|
||||
|
||||
STDMETHODIMP_(ULONG) AXClientSite :: AddRef()
|
||||
{
|
||||
refNum++;
|
||||
return refNum;
|
||||
}
|
||||
|
||||
STDMETHODIMP_(ULONG) AXClientSite :: Release()
|
||||
{
|
||||
refNum--;
|
||||
return refNum;
|
||||
}
|
||||
|
||||
|
||||
// IOleClientSite methods
|
||||
STDMETHODIMP AXClientSite :: SaveObject()
|
||||
{
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP AXClientSite :: GetMoniker(DWORD dwA,DWORD dwW,IMoniker**pm)
|
||||
{
|
||||
*pm = 0;
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
STDMETHODIMP AXClientSite :: GetContainer(IOleContainer**pc)
|
||||
{
|
||||
*pc = 0;
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
STDMETHODIMP AXClientSite :: ShowObject()
|
||||
{
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP AXClientSite :: OnShowWindow(BOOL f)
|
||||
{
|
||||
InvalidateRect(Window, 0, TRUE);
|
||||
InvalidateRect(Parent, 0, TRUE);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP AXClientSite :: RequestNewObjectLayout()
|
||||
{
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP_(void) AXClientSite :: OnViewChange(DWORD dwAspect,LONG lIndex)
|
||||
{
|
||||
}
|
||||
|
||||
STDMETHODIMP_(void) AXClientSite :: OnRename(IMoniker * pmk)
|
||||
{
|
||||
}
|
||||
|
||||
STDMETHODIMP_(void) AXClientSite :: OnSave()
|
||||
{
|
||||
}
|
||||
|
||||
STDMETHODIMP_(void) AXClientSite :: OnClose()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
// IOleInPlaceSite methods
|
||||
STDMETHODIMP AXClientSite :: GetWindow(HWND *p)
|
||||
{
|
||||
*p = Window;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP AXClientSite :: ContextSensitiveHelp(BOOL)
|
||||
{
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
|
||||
STDMETHODIMP AXClientSite :: CanInPlaceActivate()
|
||||
{
|
||||
if (InPlace)
|
||||
{
|
||||
CalledCanInPlace = true;
|
||||
return S_OK;
|
||||
}
|
||||
return S_FALSE;
|
||||
}
|
||||
|
||||
STDMETHODIMP AXClientSite :: OnInPlaceActivate()
|
||||
{
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP AXClientSite :: OnUIActivate()
|
||||
{
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP AXClientSite :: GetWindowContext(IOleInPlaceFrame** ppFrame,IOleInPlaceUIWindow **ppDoc,LPRECT r1,LPRECT r2,LPOLEINPLACEFRAMEINFO o)
|
||||
{
|
||||
*ppFrame = (IOleInPlaceFrame*)this;
|
||||
AddRef();
|
||||
|
||||
*ppDoc = NULL;
|
||||
GetClientRect(Window,r1);
|
||||
GetClientRect(Window,r2);
|
||||
o->cb = sizeof(OLEINPLACEFRAMEINFO);
|
||||
o->fMDIApp = false;
|
||||
o->hwndFrame = Parent;
|
||||
o->haccel = 0;
|
||||
o->cAccelEntries = 0;
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP AXClientSite :: Scroll(SIZE s)
|
||||
{
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
STDMETHODIMP AXClientSite :: OnUIDeactivate(int)
|
||||
{
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP AXClientSite :: OnInPlaceDeactivate()
|
||||
{
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP AXClientSite :: DiscardUndoState()
|
||||
{
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP AXClientSite :: DeactivateAndUndo()
|
||||
{
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP AXClientSite :: OnPosRectChange(LPCRECT)
|
||||
{
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
|
||||
// IOleInPlaceFrame methods
|
||||
STDMETHODIMP AXClientSite :: GetBorder(LPRECT l)
|
||||
{
|
||||
GetClientRect(Window,l);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP AXClientSite :: RequestBorderSpace(LPCBORDERWIDTHS b)
|
||||
{
|
||||
//return S_OK;
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
STDMETHODIMP AXClientSite :: SetBorderSpace(LPCBORDERWIDTHS b)
|
||||
{
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP AXClientSite :: SetActiveObject(IOleInPlaceActiveObject*pV,LPCOLESTR s)
|
||||
{
|
||||
ax->Pao = pV;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
|
||||
STDMETHODIMP AXClientSite :: SetStatusText(LPCOLESTR t)
|
||||
{
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
STDMETHODIMP AXClientSite :: EnableModeless(BOOL f)
|
||||
{
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
STDMETHODIMP AXClientSite :: TranslateAccelerator(LPMSG,WORD)
|
||||
{
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
|
||||
// IDispatch Methods
|
||||
HRESULT _stdcall AXClientSite :: GetTypeInfoCount(
|
||||
unsigned int * pctinfo) {return E_NOTIMPL;}
|
||||
|
||||
HRESULT _stdcall AXClientSite :: GetTypeInfo(
|
||||
unsigned int iTInfo,
|
||||
LCID lcid,
|
||||
ITypeInfo FAR* FAR* ppTInfo) {return E_NOTIMPL;}
|
||||
|
||||
HRESULT _stdcall AXClientSite :: GetIDsOfNames(
|
||||
REFIID riid,
|
||||
OLECHAR FAR* FAR*,
|
||||
unsigned int cNames,
|
||||
LCID lcid,
|
||||
DISPID FAR* ) {return E_NOTIMPL;}
|
||||
|
||||
|
||||
// Other Methods
|
||||
void AX :: Init(char* cls)
|
||||
{
|
||||
wchar_t x[1000] = {0};
|
||||
MultiByteToWideChar(CP_ACP,0,cls,-1,x,1000);
|
||||
CLSIDFromString(x,&clsid);
|
||||
iid = (IID*)&IID_IOleObject;
|
||||
OleObject = 0;
|
||||
Storage = 0;
|
||||
View = 0;
|
||||
Data = 0;
|
||||
Unk = 0;
|
||||
Pao = 0;
|
||||
AdviseToken = 0;
|
||||
memset(DAdviseToken,0,sizeof(DAdviseToken));
|
||||
Site.ax = this;
|
||||
}
|
||||
|
||||
AX :: AX(char* cls)
|
||||
{
|
||||
Init(cls);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void AX :: Clean()
|
||||
{
|
||||
if (Site.InPlace == true)
|
||||
{
|
||||
Site.InPlace = false;
|
||||
IOleInPlaceObject* iib = 0;
|
||||
if (OleObject)
|
||||
OleObject->QueryInterface(IID_IOleInPlaceObject,(void**)&iib);
|
||||
if (iib)
|
||||
{
|
||||
iib->UIDeactivate();
|
||||
iib->InPlaceDeactivate();
|
||||
iib->Release();
|
||||
}
|
||||
}
|
||||
|
||||
if (AdviseToken && OleObject)
|
||||
{
|
||||
OleObject->Unadvise(AdviseToken);
|
||||
AdviseToken = 0;
|
||||
}
|
||||
if (Data)
|
||||
{
|
||||
for(int i = 0 ; i < 100 ; i++)
|
||||
if (DAdviseToken[i])
|
||||
Data->DUnadvise(DAdviseToken[i]);
|
||||
memset(DAdviseToken,0,sizeof(DAdviseToken));
|
||||
}
|
||||
|
||||
|
||||
if (Pao) Pao->Release();
|
||||
if (Unk) Unk->Release();
|
||||
if (Data) Data->Release();
|
||||
if (View) View->Release();
|
||||
if (Storage) Storage->Release();
|
||||
if (OleObject) OleObject->Release();
|
||||
Unk = 0;
|
||||
Data = 0;
|
||||
View = 0;
|
||||
Storage = 0;
|
||||
OleObject = 0;
|
||||
|
||||
}
|
||||
|
||||
AX :: ~AX()
|
||||
{
|
||||
Clean();
|
||||
}
|
||||
|
||||
CLSID AX :: GetCLSID()
|
||||
{
|
||||
return clsid;
|
||||
}
|
||||
|
||||
HRESULT _stdcall AXClientSite :: InsertMenus(HMENU h,LPOLEMENUGROUPWIDTHS x)
|
||||
{
|
||||
/* AX * t = (AX*)ax;
|
||||
if (t->AddMenu)
|
||||
{
|
||||
x->width[0] = 0;
|
||||
x->width[2] = 0;
|
||||
x->width[4] = 0;
|
||||
//InsertMenu(h,0,MF_BYPOSITION | MF_POPUP,(int)Menu,"test");
|
||||
return S_OK;
|
||||
}
|
||||
*/
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
HRESULT _stdcall AXClientSite :: SetMenu(HMENU h,HOLEMENU hO,HWND hw)
|
||||
{
|
||||
AX * t = (AX*)ax;
|
||||
/* if (t->AddMenu)
|
||||
{
|
||||
if (!h && !hO)
|
||||
{
|
||||
//::SetMenu(Window,Menu);
|
||||
//DrawMenuBar(Window);
|
||||
::SetMenu(Parent,Menu);
|
||||
DrawMenuBar(Parent);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
//::SetMenu(Window,h);
|
||||
//DrawMenuBar(Window);
|
||||
|
||||
//HMENU hm = GetMenu(Parent);
|
||||
//AppendMenu(hm,MF_POPUP | MF_MENUBREAK,(int)h,0);
|
||||
//::SetMenu(Parent,hm);
|
||||
::SetMenu(Parent,h);
|
||||
DrawMenuBar(Parent);
|
||||
|
||||
//hOleWindow = hw;
|
||||
//OleSetMenuDescriptor(hO,Window,hw,0,0);
|
||||
OleSetMenuDescriptor(hO,Parent,hw,0,0);
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
*/
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
HRESULT _stdcall AXClientSite :: RemoveMenus(HMENU h)
|
||||
{
|
||||
AX * t = (AX*)ax;
|
||||
if (t->AddMenu)
|
||||
{
|
||||
if (!h)
|
||||
return S_OK;
|
||||
|
||||
int c = GetMenuItemCount(h);
|
||||
for (int i = c ; i >= 0 ; i--)
|
||||
{
|
||||
HMENU hh = GetSubMenu(h,i);
|
||||
if (hh == Menu)
|
||||
RemoveMenu(h,i,MF_BYPOSITION);
|
||||
}
|
||||
if (h == Menu)
|
||||
DestroyMenu(h);
|
||||
|
||||
//DrawMenuBar(Window);
|
||||
DrawMenuBar(Parent);
|
||||
return S_OK;
|
||||
}
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
|
||||
HRESULT _stdcall AXClientSite :: Invoke(
|
||||
DISPID dispIdMember,
|
||||
REFIID riid,
|
||||
LCID lcid,
|
||||
WORD wFlags,
|
||||
DISPPARAMS FAR* pDispParams,
|
||||
VARIANT FAR* pVarResult,
|
||||
EXCEPINFO FAR* pExcepInfo,
|
||||
unsigned int FAR* puArgErr)
|
||||
{
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
|
||||
void _stdcall AXClientSite :: OnDataChange(FORMATETC *pFormatEtc,STGMEDIUM *pStgmed)
|
||||
{
|
||||
// Notify our app that a change is being requested
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// Window Procedure for AX control
|
||||
LRESULT CALLBACK AXWndProc(HWND hh,UINT mm,WPARAM ww,LPARAM ll)
|
||||
{
|
||||
if (mm == WM_CREATE)
|
||||
{
|
||||
char tit[1000] = {0};
|
||||
HRESULT hr;
|
||||
|
||||
GetWindowTextA(hh,tit,1000);
|
||||
|
||||
AX* ax;
|
||||
ax = new AX(tit);
|
||||
|
||||
SetWindowLong(hh,GWL_USERDATA,(LONG)ax);
|
||||
ax->Site.Window = hh;
|
||||
ax->Site.Parent = GetParent(hh);
|
||||
|
||||
hr = StgCreateDocfile(0,STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_DIRECT | STGM_CREATE,0,&ax->Storage);
|
||||
ax->Site.Window = hh;
|
||||
|
||||
REFIID rid = *ax->iid;
|
||||
hr = OleCreate(ax->GetCLSID(),rid,OLERENDER_DRAW,0,&ax->Site,ax->Storage,(void**)&ax->OleObject);
|
||||
|
||||
|
||||
|
||||
if (!ax->OleObject)
|
||||
{
|
||||
delete ax;
|
||||
SetWindowLong(hh,GWL_USERDATA,0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
hr = OleSetContainedObject(ax->OleObject, TRUE);
|
||||
hr = ax->OleObject->Advise(&ax->Site,&ax->AdviseToken);
|
||||
hr = ax->OleObject->QueryInterface(IID_IViewObject,(void**)&ax->View);
|
||||
hr = ax->OleObject->QueryInterface(IID_IDataObject,(void**)&ax->Data);
|
||||
if (ax->View)
|
||||
hr = ax->View->SetAdvise(DVASPECT_CONTENT,0,&ax->Site);
|
||||
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (mm == WM_DESTROY)
|
||||
{
|
||||
AX* ax = (AX*)GetWindowLong(hh,GWL_USERDATA);
|
||||
if (!ax)
|
||||
return 0;
|
||||
ax->Clean();
|
||||
return true;
|
||||
}
|
||||
|
||||
if (mm == AX_SETDATAADVISE)
|
||||
{
|
||||
AX* ax = (AX*)GetWindowLong(hh,GWL_USERDATA);
|
||||
if (!ax)
|
||||
return 0;
|
||||
|
||||
// 1.Enum available FORMATETC structures
|
||||
// 2.Set Data Advise specified to index ww
|
||||
if (!ax->Data)
|
||||
return 0;
|
||||
|
||||
IEnumFORMATETC* ief = 0;
|
||||
int i = 0;
|
||||
|
||||
FORMATETC fe;
|
||||
ax->Data->EnumFormatEtc((LPARAM)ll,&ief);
|
||||
if (!ief)
|
||||
return 0;
|
||||
for(;;)
|
||||
{
|
||||
HRESULT hr = ief->Next(1,&fe,0);
|
||||
if (hr != S_OK)
|
||||
break;
|
||||
if (ww == i)
|
||||
break;
|
||||
i++;
|
||||
}
|
||||
ief->Release();
|
||||
if (ww == -1)
|
||||
return i;
|
||||
|
||||
if (ax->Data)
|
||||
ax->Data->DAdvise(&fe,0,&ax->Site,&ax->DAdviseToken[ww]);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
if (mm == AX_GETAXINTERFACE)
|
||||
{
|
||||
AX* ax = (AX*)GetWindowLong(hh,GWL_USERDATA);
|
||||
return (LONG)ax;
|
||||
}
|
||||
|
||||
if (mm == AX_QUERYINTERFACE)
|
||||
{
|
||||
char* p = (char*)ww;
|
||||
AX* ax = (AX*)GetWindowLong(hh,GWL_USERDATA);
|
||||
if (!ax)
|
||||
return 0;
|
||||
return ax->OleObject->QueryInterface((REFIID)*p,(void**)ll);
|
||||
}
|
||||
|
||||
if (mm == WM_LBUTTONDBLCLK)
|
||||
{
|
||||
PostMessage(hh,AX_INPLACE,1,0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
if (mm == AX_INPLACE)
|
||||
{
|
||||
AX* ax = (AX*)GetWindowLong(hh,GWL_USERDATA);
|
||||
if (!ax)
|
||||
return 0;
|
||||
if (!ax->OleObject)
|
||||
return 0;
|
||||
RECT rect;
|
||||
HRESULT hr;
|
||||
::GetClientRect(hh,&rect);
|
||||
|
||||
if (ax->Site.InPlace == false && ww == 1) // Activate In Place
|
||||
{
|
||||
ax->Site.InPlace = true;
|
||||
ax->Site.ExternalPlace = ll;
|
||||
hr = ax->OleObject->DoVerb(OLEIVERB_INPLACEACTIVATE,0,&ax->Site,0,hh,&rect);
|
||||
InvalidateRect(hh,0,true);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (ax->Site.InPlace == true && ww == 0) // Deactivate
|
||||
{
|
||||
ax->Site.InPlace = false;
|
||||
|
||||
IOleInPlaceObject* iib;
|
||||
ax->OleObject->QueryInterface(IID_IOleInPlaceObject,(void**)&iib);
|
||||
if (iib)
|
||||
{
|
||||
iib->UIDeactivate();
|
||||
iib->InPlaceDeactivate();
|
||||
iib->Release();
|
||||
InvalidateRect(hh,0,true);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (mm == WM_SIZE)
|
||||
{
|
||||
AX* ax = (AX*)GetWindowLong(hh,GWL_USERDATA);
|
||||
if (!ax)
|
||||
return 0;
|
||||
if (!ax->OleObject)
|
||||
return 0;
|
||||
|
||||
DefWindowProc(hh,mm,ww,ll);
|
||||
|
||||
if (ax->Site.InPlace == true)
|
||||
{
|
||||
SendMessage(hh,AX_INPLACE,0,0);
|
||||
InvalidateRect(hh,0,true);
|
||||
SendMessage(hh,AX_INPLACE,1,0);
|
||||
}
|
||||
|
||||
IOleInPlaceObject* pl;
|
||||
ax->OleObject->QueryInterface(IID_IOleInPlaceObject,(void**)&pl);
|
||||
if (!pl)
|
||||
return 0;
|
||||
RECT r;
|
||||
GetClientRect(ax->Site.Window,&r);
|
||||
pl->SetObjectRects(&r,&r);
|
||||
pl->Release();
|
||||
return 0;
|
||||
}
|
||||
|
||||
return DefWindowProc(hh,mm,ww,ll);
|
||||
}
|
||||
|
||||
// Registration function
|
||||
ATOM AXRegister()
|
||||
{
|
||||
WNDCLASSEXA wC = {0};
|
||||
|
||||
wC.cbSize = sizeof(wC);
|
||||
wC.style = CS_GLOBALCLASS | CS_DBLCLKS;
|
||||
wC.lpfnWndProc = AXWndProc;
|
||||
wC.cbWndExtra = 4;
|
||||
wC.hInstance = GetModuleHandle(0);
|
||||
wC.lpszClassName = "AX";
|
||||
return RegisterClassExA(&wC);
|
||||
}
|
||||
|
||||
142
ax.h
Normal file
142
ax.h
Normal file
@@ -0,0 +1,142 @@
|
||||
// AX.H
|
||||
|
||||
// messages
|
||||
#define AX_QUERYINTERFACE (WM_USER + 1)
|
||||
#define AX_INPLACE (WM_USER + 2)
|
||||
#define AX_GETAXINTERFACE (WM_USER + 3)
|
||||
#define AX_CONNECTOBJECT (WM_USER + 4)
|
||||
#define AX_DISCONNECTOBJECT (WM_USER + 5)
|
||||
#define AX_SETDATAADVISE (WM_USER + 6)
|
||||
#define AX_DOVERB (WM_USER + 7)
|
||||
|
||||
|
||||
// Registration function
|
||||
ATOM AXRegister();
|
||||
|
||||
|
||||
// Class AXClientSide
|
||||
class AXClientSite :
|
||||
public IOleClientSite,
|
||||
public IDispatch,
|
||||
public IAdviseSink,
|
||||
public IOleInPlaceSite,
|
||||
public IOleInPlaceFrame
|
||||
{
|
||||
protected:
|
||||
|
||||
int refNum;
|
||||
|
||||
public:
|
||||
|
||||
|
||||
HWND Window;
|
||||
HWND Parent;
|
||||
HMENU Menu;
|
||||
bool InPlace;
|
||||
bool ExternalPlace;
|
||||
bool CalledCanInPlace;
|
||||
|
||||
class AX* ax;
|
||||
|
||||
// MyClientSite Methods
|
||||
AXClientSite();
|
||||
virtual ~AXClientSite();
|
||||
STDMETHODIMP_(void) OnDataChange2(FORMATETC*);
|
||||
|
||||
// IUnknown methods
|
||||
STDMETHODIMP QueryInterface(REFIID iid,void**ppvObject);
|
||||
STDMETHODIMP_(ULONG) AddRef();
|
||||
STDMETHODIMP_(ULONG) Release();
|
||||
|
||||
// IOleClientSite methods
|
||||
STDMETHODIMP SaveObject();
|
||||
STDMETHODIMP GetMoniker(DWORD dwA,DWORD dwW,IMoniker**pm);
|
||||
STDMETHODIMP GetContainer(IOleContainer**pc);
|
||||
STDMETHODIMP ShowObject();
|
||||
STDMETHODIMP OnShowWindow(BOOL f);
|
||||
STDMETHODIMP RequestNewObjectLayout();
|
||||
|
||||
// IAdviseSink methods
|
||||
STDMETHODIMP_(void) OnDataChange(FORMATETC *pFormatEtc,STGMEDIUM *pStgmed);
|
||||
|
||||
STDMETHODIMP_(void) OnViewChange(DWORD dwAspect,LONG lIndex);
|
||||
STDMETHODIMP_(void) OnRename(IMoniker * pmk);
|
||||
STDMETHODIMP_(void) OnSave();
|
||||
STDMETHODIMP_(void) OnClose();
|
||||
|
||||
// IOleInPlaceSite methods
|
||||
STDMETHODIMP GetWindow(HWND *p);
|
||||
STDMETHODIMP ContextSensitiveHelp(BOOL);
|
||||
STDMETHODIMP CanInPlaceActivate();
|
||||
STDMETHODIMP OnInPlaceActivate();
|
||||
STDMETHODIMP OnUIActivate();
|
||||
STDMETHODIMP GetWindowContext(IOleInPlaceFrame** ppFrame,IOleInPlaceUIWindow **ppDoc,LPRECT r1,LPRECT r2,LPOLEINPLACEFRAMEINFO o);
|
||||
STDMETHODIMP Scroll(SIZE s);
|
||||
STDMETHODIMP OnUIDeactivate(int);
|
||||
STDMETHODIMP OnInPlaceDeactivate();
|
||||
STDMETHODIMP DiscardUndoState();
|
||||
STDMETHODIMP DeactivateAndUndo();
|
||||
STDMETHODIMP OnPosRectChange(LPCRECT);
|
||||
|
||||
// IOleInPlaceFrame methods
|
||||
STDMETHODIMP GetBorder(LPRECT l);
|
||||
STDMETHODIMP RequestBorderSpace(LPCBORDERWIDTHS);
|
||||
STDMETHODIMP SetBorderSpace(LPCBORDERWIDTHS w);
|
||||
STDMETHODIMP SetActiveObject(IOleInPlaceActiveObject*pV,LPCOLESTR s);
|
||||
STDMETHODIMP InsertMenus(HMENU h,LPOLEMENUGROUPWIDTHS x);
|
||||
STDMETHODIMP SetMenu(HMENU h,HOLEMENU hO,HWND hw);
|
||||
STDMETHODIMP RemoveMenus(HMENU h);
|
||||
STDMETHODIMP SetStatusText(LPCOLESTR t);
|
||||
STDMETHODIMP EnableModeless(BOOL f);
|
||||
STDMETHODIMP TranslateAccelerator(LPMSG,WORD);
|
||||
|
||||
|
||||
// IDispatch Methods
|
||||
HRESULT _stdcall GetTypeInfoCount(unsigned int * pctinfo);
|
||||
HRESULT _stdcall GetTypeInfo(unsigned int iTInfo,LCID lcid,ITypeInfo FAR* FAR* ppTInfo);
|
||||
HRESULT _stdcall GetIDsOfNames(REFIID riid,OLECHAR FAR* FAR*,unsigned int cNames,LCID lcid,DISPID FAR* );
|
||||
HRESULT _stdcall Invoke(DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS FAR* pDispParams,VARIANT FAR* pVarResult,EXCEPINFO FAR* pExcepInfo,unsigned int FAR* puArgErr);
|
||||
|
||||
// IOleControlSite Methods
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
// Class AX
|
||||
class AX
|
||||
{
|
||||
public:
|
||||
|
||||
AX(char* clsid);
|
||||
CLSID GetCLSID();
|
||||
~AX();
|
||||
|
||||
|
||||
void Init(char* clsid);
|
||||
void Clean();
|
||||
|
||||
AXClientSite Site;
|
||||
IID* iid;
|
||||
IOleObject* OleObject;
|
||||
IStorage* Storage;
|
||||
IViewObject* View;
|
||||
IDataObject* Data;
|
||||
IUnknown* Unk;
|
||||
IOleInPlaceActiveObject* Pao;
|
||||
//AX_CONNECTSTRUCT* tcs;
|
||||
bool AddMenu;
|
||||
DWORD AdviseToken;
|
||||
DWORD DAdviseToken[100];
|
||||
|
||||
|
||||
|
||||
|
||||
private:
|
||||
|
||||
CLSID clsid;
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
BIN
content/images/ArrowCursor.png
Normal file
BIN
content/images/ArrowCursor.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.0 KiB |
BIN
content/images/GrabRotateCursor.png
Normal file
BIN
content/images/GrabRotateCursor.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.8 KiB |
BIN
content/images/surface.png
Normal file
BIN
content/images/surface.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 14 KiB |
BIN
content/images/surfacebr.png
Normal file
BIN
content/images/surfacebr.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 14 KiB |
BIN
content/sounds/SWITCH3.wav
Normal file
BIN
content/sounds/SWITCH3.wav
Normal file
Binary file not shown.
BIN
content/sounds/electronicpingshort.wav
Normal file
BIN
content/sounds/electronicpingshort.wav
Normal file
Binary file not shown.
BIN
content/sounds/pageturn.wav
Normal file
BIN
content/sounds/pageturn.wav
Normal file
Binary file not shown.
BIN
content/sounds/switch.wav
Normal file
BIN
content/sounds/switch.wav
Normal file
Binary file not shown.
4439
propertyGrid.cpp
Normal file
4439
propertyGrid.cpp
Normal file
File diff suppressed because it is too large
Load Diff
392
propertyGrid.h
Normal file
392
propertyGrid.h
Normal file
@@ -0,0 +1,392 @@
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// @file propertyGrid.h
|
||||
///
|
||||
/// @brief A property grid control in Win32 SDK C.
|
||||
///
|
||||
/// @author David MacDermot
|
||||
///
|
||||
/// @par Comments:
|
||||
/// This source is distributed in the hope that it will be useful,
|
||||
/// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
///
|
||||
/// @date 2-27-16
|
||||
///
|
||||
/// @todo
|
||||
///
|
||||
/// @bug
|
||||
///
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
//DWM 1.8: Added Message PG_FLATCHECKS and associated macroes
|
||||
|
||||
#ifndef PROPERTYGRID_H
|
||||
#define PROPERTYGRID_H
|
||||
|
||||
/****************************************************************************/
|
||||
// Public Messages
|
||||
|
||||
// List box message subset handled by the property grid.
|
||||
|
||||
// LB_ADDSTRING - PropGrid_AddItem()
|
||||
// LB_DELETESTRING - PropGrid_DeleteItem()
|
||||
// LB_GETCOUNT - PropGrid_GetCount()
|
||||
// LB_GETCURSEL - PropGrid_GetCurSel()
|
||||
// LB_GETHORIZONTALEXTENT - PropGrid_GetHorizontalExtent()
|
||||
// LB_GETITEMDATA - PropGrid_GetItemData()
|
||||
// LB_GETITEMHEIGHT - PropGrid_GetItemHeight()
|
||||
// LB_GETITEMRECT - PropGrid_GetItemRect()
|
||||
// LB_GETSEL - PropGrid_GetSel()
|
||||
// LB_RESETCONTENT - PropGrid_ResetContent()
|
||||
// LB_SETCURSEL - PropGrid_SetCurSel()
|
||||
// LB_SETHORIZONTALEXTENT - PropGrid_SetHorizontalExtent()
|
||||
// LB_SETITEMDATA - PropGrid_SetItemData()
|
||||
// LB_SETITEMHEIGHT - PropGrid_SetItemHeight()
|
||||
|
||||
/// @name Property grid specific messages.
|
||||
/// @{
|
||||
#define PG_EXPANDCATALOGS WM_USER + 0x01 ///<PropGrid_ExpandCatalogs()
|
||||
#define PG_COLLAPSECATALOGS WM_USER + 0x02 ///<PropGrid_CollapseCatalogs()
|
||||
#define PG_SHOWTOOLTIPS WM_USER + 0x03 ///<PropGrid_ShowToolTips()
|
||||
#define PG_SHOWPROPERTYDESC WM_USER + 0x04 ///<PropGrid_ShowPropertyDescriptions()
|
||||
#define PG_FLATCHECKS WM_USER + 0x05 ///<PropGrid_SetFlatStyleChecks()
|
||||
/// @}
|
||||
|
||||
/****************************************************************************/
|
||||
// Property item types
|
||||
|
||||
#define PIT_EDIT 0 ///< Property item type: Edit
|
||||
#define PIT_COMBO 1 ///< Property item type: Dropdownlist
|
||||
#define PIT_EDITCOMBO 2 ///< Property item type: Dropdown(editable)
|
||||
#define PIT_STATIC 3 ///< Property item type: Not editable text
|
||||
#define PIT_COLOR 4 ///< Property item type: Color
|
||||
#define PIT_FONT 5 ///< Property item type: Font
|
||||
#define PIT_FILE 6 ///< Property item type: File select dialog
|
||||
#define PIT_FOLDER 7 ///< Property item type: Folder select dialog
|
||||
#define PIT_CHECK 8 ///< Property item type: BOOL
|
||||
#define PIT_IP 9 ///< Property item type: IP Address
|
||||
#define PIT_DATE 10 ///< Property item type: Date
|
||||
#define PIT_TIME 11 ///< Property item type: Time
|
||||
#define PIT_DATETIME 12 ///< Property item type: Date & Time
|
||||
#define PIT_CATALOG 99 ///< Property item type: Catalog
|
||||
|
||||
/****************************************************************************/
|
||||
// Public structures and notifications
|
||||
|
||||
/// @var PROPGRIDFDITEM
|
||||
/// @brief A property grid file dialog item object
|
||||
|
||||
/// @var LPPROPGRIDFDITEM
|
||||
/// @brief Pointer to a property grid file dialog item
|
||||
|
||||
/// @struct tagPROPGRIDFDITEM
|
||||
/// @brief This is additional data associated with a property grid file dialog item
|
||||
typedef struct tagPROPGRIDFDITEM {
|
||||
LPTSTR lpszDlgTitle; ///< Dialog title
|
||||
LPTSTR lpszFilePath; ///< Initial path
|
||||
LPTSTR lpszFilter; ///< Double null terminated filter string
|
||||
LPTSTR lpszDefExt; ///< Default extension
|
||||
} PROPGRIDFDITEM, *LPPROPGRIDFDITEM;
|
||||
|
||||
/// @var PROPGRIDFONTITEM
|
||||
/// @brief A property grid font item object
|
||||
|
||||
/// @var LPPROPGRIDFONTITEM
|
||||
/// @brief Pointer to a property grid font item
|
||||
|
||||
/// @struct tagPROPGRIDFONTITEM
|
||||
/// @brief This is additional data associated with a property grid font item
|
||||
typedef struct tagPROPGRIDFONTITEM {
|
||||
LOGFONT logFont; ///< Logical font struct
|
||||
COLORREF crFont; ///< Text color
|
||||
} PROPGRIDFONTITEM, *LPPROPGRIDFONTITEM;
|
||||
|
||||
/// @var PROPGRIDITEM
|
||||
/// @brief A property grid item object
|
||||
|
||||
/// @var LPPROPGRIDITEM
|
||||
/// @brief Pointer to a property grid item
|
||||
|
||||
/// @struct tagPROPGRIDITEM
|
||||
/// @brief This is the data associated with a property grid item
|
||||
typedef struct tagPROPGRIDITEM {
|
||||
LPTSTR lpszCatalog; ///< Catalog (group) name
|
||||
LPTSTR lpszPropName; ///< Property (item) name
|
||||
LPTSTR lpszzCmbItems; ///< Double null terminated list of strings
|
||||
LPTSTR lpszPropDesc; ///< Property (item) description
|
||||
LPARAM lpCurValue; ///< Property (item) value
|
||||
INT iItemType; ///< Property (item) type identifier
|
||||
} PROPGRIDITEM, *LPPROPGRIDITEM;
|
||||
|
||||
/// @var NMPROPGRID
|
||||
/// @brief A property grid notification message data object
|
||||
|
||||
/// @var LPNMPROPGRID
|
||||
/// @brief Pointer to property grid notification message data
|
||||
|
||||
/// @struct tagNMPROPGRID
|
||||
/// @brief This is the data associated with a property grid notification
|
||||
typedef struct tagNMPROPGRID {
|
||||
NMHDR hdr; ///< Notification message header
|
||||
INT iIndex; ///< Index of a property grid item
|
||||
} NMPROPGRID, *LPNMPROPGRID;
|
||||
|
||||
#define PGN_PROPERTYCHANGE WM_USER + 0x2A ///<property grid Property changed notification message
|
||||
|
||||
/****************************************************************************/
|
||||
/// @name Macroes
|
||||
/// @{
|
||||
|
||||
/// @def PropGrid_AddItem(hwndCtl,lpItem)
|
||||
///
|
||||
/// @brief Add an item to a property grid. Items are appended to their respective
|
||||
/// catalogs.
|
||||
///
|
||||
/// @param hwndCtl The handle of a property grid.
|
||||
/// @param lpItem Pointer to a property grid item.
|
||||
///
|
||||
/// @returns The zero-based index of the item in the list box. If an error occurs,
|
||||
/// the return value is LB_ERR. If there is insufficient space to store
|
||||
/// the new string, the return value is LB_ERRSPACE.
|
||||
#define PropGrid_AddItem(hwndCtl,lpItem) ((int)(DWORD)SendMessage((hwndCtl),LB_ADDSTRING,0,(LPARAM)(lpItem)))
|
||||
|
||||
/// @def PropGrid_DeleteItem(hwndCtl,index)
|
||||
///
|
||||
/// @brief Deletes the item at the specified location in a property grid.
|
||||
///
|
||||
/// @param hwndCtl The handle of a property grid.
|
||||
/// @param index The zero-based index of the item to delete.
|
||||
///
|
||||
/// @returns A count of the items remaining in the grid. The return value is
|
||||
/// LB_ERR if the index parameter specifies an index greater than the
|
||||
/// number of items in the list.
|
||||
#define PropGrid_DeleteItem(hwndCtl,index) ((int)(DWORD)SendMessage((hwndCtl),LB_DELETESTRING,(WPARAM)(int)(index),0))
|
||||
|
||||
/// @def PropGrid_Enable(hwndCtl,fEnable)
|
||||
///
|
||||
/// @brief Enables or disables a property grid control.
|
||||
///
|
||||
/// @param hwndCtl The handle of a property grid.
|
||||
/// @param fEnable TRUE to enable the control, or FALSE to disable it.
|
||||
///
|
||||
/// @returns No return value.
|
||||
#define PropGrid_Enable(hwndCtl,fEnable) EnableWindow((hwndCtl),(fEnable))
|
||||
|
||||
/// @def PropGrid_GetCount(hwndCtl)
|
||||
///
|
||||
/// @brief Gets the number of items in a property grid.
|
||||
///
|
||||
/// @param hwndCtl The handle of a property grid.
|
||||
///
|
||||
/// @returns The number of items.
|
||||
#define PropGrid_GetCount(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl),LB_GETCOUNT,0,0))
|
||||
|
||||
/// @def PropGrid_GetCurSel(hwndCtl)
|
||||
///
|
||||
/// @brief Gets the index of the currently selected item in a property grid.
|
||||
///
|
||||
/// @param hwndCtl The handle of a property grid.
|
||||
///
|
||||
/// @returns The zero-based index of the selected item. If there is no selection,
|
||||
/// the return value is LB_ERR.
|
||||
#define PropGrid_GetCurSel(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl),LB_GETCURSEL,0,0))
|
||||
|
||||
/// @def PropGrid_GetHorizontalExtent(hwndCtl)
|
||||
///
|
||||
/// @brief Gets the width that a property grid can be scrolled horizontally
|
||||
/// (the scrollable width).
|
||||
///
|
||||
/// @param hwndCtl The handle of a property grid.
|
||||
///
|
||||
/// @returns The scrollable width, in pixels, of the property grid.
|
||||
#define PropGrid_GetHorizontalExtent(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl),LB_GETHORIZONTALEXTENT,0,0))
|
||||
|
||||
/// @def PropGrid_GetItemData(hwndCtl,index)
|
||||
///
|
||||
/// @brief Gets the PROPGRIDITEM associated with the specified property grid item.
|
||||
///
|
||||
/// @param hwndCtl The handle of a property grid.
|
||||
/// @param index The zero-based index of the item.
|
||||
///
|
||||
/// @returns A pointer to a PROPGRIDITEM object.
|
||||
#define PropGrid_GetItemData(hwndCtl,index) ((LPPROPGRIDITEM)(DWORD_PTR)SendMessage((hwndCtl),LB_GETITEMDATA,(WPARAM)(int)(index),0))
|
||||
|
||||
/// @def PropGrid_GetItemHeight(hwndCtl)
|
||||
///
|
||||
/// @brief Retrieves the height of all items in a property grid.
|
||||
///
|
||||
/// @param hwndCtl The handle of a property grid.
|
||||
///
|
||||
/// @returns The height, in pixels, of the items, or LB_ERR if an error occurs.
|
||||
#define PropGrid_GetItemHeight(hwndCtl) ((int)(DWORD)SendMessage((hwndCtl),LB_GETITEMHEIGHT,(WPARAM)0,0))
|
||||
|
||||
/// @def PropGrid_GetItemRect(hwndCtl,index,lprc)
|
||||
///
|
||||
/// @brief Gets the dimensions of the rectangle that bounds a property grid item
|
||||
/// as it is currently displayed in the property grid.
|
||||
///
|
||||
/// @param hwndCtl The handle of a property grid.
|
||||
/// @param index The zero-based index of the item in the property grid.
|
||||
/// @param lprc A pointer to a RECT structure that receives the client
|
||||
/// coordinates for the item in the property grid.
|
||||
///
|
||||
/// @returns If an error occurs, the return value is LB_ERR.
|
||||
#define PropGrid_GetItemRect(hwndCtl,index,lprc) ((int)(DWORD)SendMessage((hwndCtl),LB_GETITEMRECT,(WPARAM)(int)(index),(LPARAM)(RECT*)(lprc)))
|
||||
|
||||
/// @def PropGrid_GetSel(hwndCtl,index)
|
||||
///
|
||||
/// @brief Gets the selection state of an item.
|
||||
///
|
||||
/// @param hwndCtl The handle of a property grid.
|
||||
/// @param index The zero-based index of the item.
|
||||
///
|
||||
/// @returns If the item is selected, the return value is greater than zero;
|
||||
/// otherwise, it is zero. If an error occurs, the return value is LB_ERR.
|
||||
#define PropGrid_GetSel(hwndCtl,index) ((int)(DWORD)SendMessage((hwndCtl),LB_GETSEL,(WPARAM)(int)(index),0))
|
||||
|
||||
/// @def PropGrid_ResetContent(hwndCtl)
|
||||
///
|
||||
/// @brief Removes all items from a property grid.
|
||||
///
|
||||
/// @param hwndCtl The handle of a property grid.
|
||||
///
|
||||
/// @returns The return value is not meaningful.
|
||||
#define PropGrid_ResetContent(hwndCtl) ((BOOL)(DWORD)SendMessage((hwndCtl),LB_RESETCONTENT,0,0))
|
||||
|
||||
/// @def PropGrid_SetCurSel(hwndCtl,index)
|
||||
///
|
||||
/// @brief Sets the currently selected item in a property grid.
|
||||
///
|
||||
/// @param hwndCtl The handle of a property grid.
|
||||
/// @param index The zero-based index of the item to select, or <20>1 to clear the selection.
|
||||
///
|
||||
/// @returns If an error occurs, the return value is LB_ERR. If the index
|
||||
/// parameter is <20>1, the return value is LB_ERR even though no error occurred.
|
||||
#define PropGrid_SetCurSel(hwndCtl,index) ((int)(DWORD)SendMessage((hwndCtl),LB_SETCURSEL,(WPARAM)(int)(index),0))
|
||||
|
||||
/// @def PropGrid_SetHorizontalExtent(hwndCtl,cxExtent)
|
||||
///
|
||||
/// @brief Set the width by which a property grid can be scrolled horizontally
|
||||
/// (the scrollable width). If the width of the property grid is smaller
|
||||
/// than this value, the horizontal scroll bar horizontally scrolls items
|
||||
/// in the property grid. If the width of the property grid is equal to or
|
||||
/// greater than this value, the horizontal scroll bar is hidden.
|
||||
///
|
||||
/// @param hwndCtl The handle of a property grid.
|
||||
/// @param cxExtent The number of pixels by which the list box can be scrolled.
|
||||
///
|
||||
/// @returns No return value.
|
||||
#define PropGrid_SetHorizontalExtent(hwndCtl,cxExtent) ((void)SendMessage((hwndCtl),LB_SETHORIZONTALEXTENT,(WPARAM)(int)(cxExtent),0))
|
||||
|
||||
/// @def PropGrid_SetItemData(hwndCtl,index,data)
|
||||
///
|
||||
/// @brief Sets the PROPGRIDITEM associated with the specified property grid item.
|
||||
///
|
||||
/// @param hwndCtl The handle of a property grid.
|
||||
/// @param index The zero-based index of the item.
|
||||
/// @param data The item data to set.
|
||||
///
|
||||
/// @returns If an error occurs, the return value is LB_ERR.
|
||||
#define PropGrid_SetItemData(hwndCtl,index,data) ((int)(DWORD)SendMessage((hwndCtl),LB_SETITEMDATA,(WPARAM)(int)(index),(LPARAM)(data)))
|
||||
|
||||
/// @def PropGrid_SetItemHeight(hwndCtl,cy)
|
||||
///
|
||||
/// @brief Sets the height of all items in a property grid.
|
||||
///
|
||||
/// @param hwndCtl The handle of a property grid.
|
||||
/// @param cy The height of the items, in pixels.
|
||||
///
|
||||
/// @returns If the height is invalid, the return value is LB_ERR.
|
||||
#define PropGrid_SetItemHeight(hwndCtl,cy) ((int)(DWORD)SendMessage((hwndCtl),LB_SETITEMHEIGHT,(WPARAM)0,MAKELPARAM((cy),0)))
|
||||
|
||||
/// @def PropGrid_ExpandCatalogs(hwndCtl, lpszzCatalogs)
|
||||
///
|
||||
/// @brief Expand certain specified catalogs in a property grid.
|
||||
///
|
||||
/// @param hwndCtl The handle of a property grid.
|
||||
/// @param lpszzCatalogs The list of catalog names each terminated by a null (\\0).
|
||||
///
|
||||
/// @returns No return value.
|
||||
#define PropGrid_ExpandCatalogs(hwndCtl, lpszzCatalogs) ((void)SendMessage((hwndCtl),PG_EXPANDCATALOGS,(WPARAM)0,(LPARAM)(lpszzCatalogs)))
|
||||
|
||||
/// @def PropGrid_ExpandAllCatalogs(hwndCtl)
|
||||
///
|
||||
/// @brief Expand all catalogs in a property grid.
|
||||
///
|
||||
/// @param hwndCtl The handle of a property grid.
|
||||
///
|
||||
/// @returns No return value.
|
||||
#define PropGrid_ExpandAllCatalogs(hwndCtl) ((void)SendMessage((hwndCtl),PG_EXPANDCATALOGS,(WPARAM)0,(LPARAM)NULL))
|
||||
|
||||
/// @def PropGrid_CollapseCatalogs(hwndCtl, lpszzCatalogs)
|
||||
///
|
||||
/// @brief Collapse certain specified catalogs in a property grid.
|
||||
///
|
||||
/// @param hwndCtl The handle of a property grid.
|
||||
/// @param lpszzCatalogs The catalog names each terminated by a null (\\0).
|
||||
///
|
||||
/// @returns No return value.
|
||||
#define PropGrid_CollapseCatalogs(hwndCtl, lpszzCatalogs) ((void)SendMessage((hwndCtl),PG_COLLAPSECATALOGS,(WPARAM)0,(LPARAM)(lpszzCatalogs)))
|
||||
|
||||
/// @def PropGrid_CollapseAllCatalogs(hwndCtl)
|
||||
///
|
||||
/// @brief Collapse all catalogs in a property grid.
|
||||
///
|
||||
/// @param hwndCtl The handle of a property grid.
|
||||
///
|
||||
/// @returns No return value.
|
||||
#define PropGrid_CollapseAllCatalogs(hwndCtl) ((void)SendMessage((hwndCtl),PG_COLLAPSECATALOGS,(WPARAM)0,(LPARAM)NULL))
|
||||
|
||||
/// @def PropGrid_ShowToolTips(hwndCtl,fShow)
|
||||
///
|
||||
/// @brief Show or hide tooltips in the property grid.
|
||||
///
|
||||
/// @param hwndCtl The handle of a property grid.
|
||||
/// @param fShow TRUE for tooltips; FALSE do not show tooltips.
|
||||
///
|
||||
/// @returns No return value.
|
||||
#define PropGrid_ShowToolTips(hwndCtl,fShow) ((void)SendMessage((hwndCtl),PG_SHOWTOOLTIPS,(WPARAM)(fShow),(LPARAM)0L))
|
||||
|
||||
/// @def PropGrid_ShowPropertyDescriptions(hwndCtl,fShow)
|
||||
///
|
||||
/// @brief Show or hide the property discription pane in the property grid.
|
||||
///
|
||||
/// @param hwndCtl The handle of a property grid.
|
||||
/// @param fShow TRUE for descriptions; FALSE do not show discription pane.
|
||||
///
|
||||
/// @returns No return value.
|
||||
#define PropGrid_ShowPropertyDescriptions(hwndCtl,fShow) ((void)SendMessage((hwndCtl),PG_SHOWPROPERTYDESC,(WPARAM)(fShow),(LPARAM)0L))
|
||||
|
||||
/// @def PropGrid_SetFlatStyleChecks(hwndCtl, fFlat)
|
||||
///
|
||||
/// @brief Sets the appearance of the checkboxes.
|
||||
///
|
||||
/// @param hwndCtl The handle of a property grid.
|
||||
/// @param fFlat TRUE for flat checkboxes, or FALSE for standard checkboxes.
|
||||
///
|
||||
/// @returns No return value.
|
||||
#define PropGrid_SetFlatStyleChecks(hwndCtl, fFlat) \
|
||||
((void)SendMessage((hwndCtl),PG_FLATCHECKS,(WPARAM)(BOOL) (fFlat),(LPARAM)0L))
|
||||
|
||||
/// @def PropGrid_ItemInit(pgi)
|
||||
///
|
||||
/// @brief Initialize an item struct.
|
||||
///
|
||||
/// @param pgi The PROPGRIDITEM struct.
|
||||
///
|
||||
/// @returns No return value.
|
||||
#define PropGrid_ItemInit(pgi) \
|
||||
(pgi.lpszCatalog = NULL, pgi.lpszPropName = NULL, \
|
||||
pgi.lpszzCmbItems = NULL, pgi.lpszPropDesc = NULL, \
|
||||
pgi.lpCurValue = 0, pgi.iItemType = 0)
|
||||
|
||||
/// @}
|
||||
|
||||
/****************************************************************************/
|
||||
// Exported function prototypes
|
||||
|
||||
ATOM InitPropertyGrid(HINSTANCE hInstance);
|
||||
HWND New_PropertyGrid(HWND hParent, DWORD dwID);
|
||||
|
||||
#endif //PROPERTYGRID_H
|
||||
52
rapidxml/license.txt
Normal file
52
rapidxml/license.txt
Normal 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
406
rapidxml/manual.html
Normal file
File diff suppressed because one or more lines are too long
2596
rapidxml/rapidxml.hpp
Normal file
2596
rapidxml/rapidxml.hpp
Normal file
File diff suppressed because it is too large
Load Diff
174
rapidxml/rapidxml_iterators.hpp
Normal file
174
rapidxml/rapidxml_iterators.hpp
Normal 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
421
rapidxml/rapidxml_print.hpp
Normal 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 (< > ' " &)
|
||||
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
122
rapidxml/rapidxml_utils.hpp
Normal 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
|
||||
13
resource.h
13
resource.h
@@ -2,18 +2,17 @@
|
||||
// Microsoft Visual C++ generated include file.
|
||||
// Used by Dialogs.rc
|
||||
//
|
||||
#define IDD_ABOUT_DIALOG 102
|
||||
#define IDD_TOOLBOX 103
|
||||
#define IDI_ICON1 106
|
||||
#define IDC_TOOLBOX_BROWSER 1001
|
||||
#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 107
|
||||
#define _APS_NEXT_COMMAND_VALUE 40004
|
||||
#define _APS_NEXT_CONTROL_VALUE 1002
|
||||
#define _APS_NEXT_RESOURCE_VALUE 104
|
||||
#define _APS_NEXT_COMMAND_VALUE 40001
|
||||
#define _APS_NEXT_CONTROL_VALUE 1001
|
||||
#define _APS_NEXT_SYMED_VALUE 101
|
||||
#endif
|
||||
#endif
|
||||
|
||||
4
win32Defines.h
Normal file
4
win32Defines.h
Normal file
@@ -0,0 +1,4 @@
|
||||
#pragma once
|
||||
|
||||
#include <windows.h>
|
||||
#define GetHoldKeyState(nVirtKey) (GetKeyState(nVirtKey)>>1)
|
||||
Reference in New Issue
Block a user