 |
| Author |
Message |
jason p sage
User
Joined: Sun Jun 10th 2007
Location: Ellington, CT USA
|
|
Posted: 17th May 2008 17:08 Edited: 30th May 2008 20:51 |
| link | toggle |
VERSION 2.0 RELEASED!! Lights and Effects Classes revisited! Solution reorganized to compile MUCH MUCH faster!
Project Web Page: http://code.google.com/p/darkgdkoop/
1.25 Megs of Source, 100+ Source Files, 36000+ Lines of code, and there is even full source for a GUI that works in Full Screen Mode!
Thanks to all of you who helped me test and to all who paid their contributions in forum posts, media, shaders, Code, and ideas!
Special thanx To: DavidW, Visigoth, Green Gandalf, Lost In Thought, IanM, VanB, CuCumBer!
Make sure to read the doc folder's "readme" texts for each demo!
|
Back to top
 |
|
Pixel Perfect
User
Joined: Wed Feb 21st 2007
Location: UK
|
Great piece of work Jason .. congratulations on getting this completed and released. I'm sure many people will benefit greatly from this
No matter how good your code is, someone will improve on it
|
Back to top
 |
|
Not_Maindric
User
Joined: Tue Jul 10th 2007
Location: Omaha, NE
|
Hm, looks interesting. Downloading now.
|
Back to top
 |
|
tobi453
User
Joined: Thu Apr 28th 2005
Location: Bonn, Germany
|
|
Posted: 18th May 2008 08:30 Edited: 18th May 2008 08:44 |
| link | toggle |
I can't finish the download.  Every time when it's close to completion the download aborts.
Can you upload it somewhere else?
FINAL VERSION RELEASED!!!!

|
Back to top
 |
|
jason p sage
User
Joined: Sun Jun 10th 2007
Location: Ellington, CT USA
|
|
Posted: 18th May 2008 08:59 Edited: 1st Jan 2009 09:19 |
| link | toggle |
Though this is LAST RESORT Download location! (Bandwidth not that high): ftp://jegas.com/Downloads/
Can't wait to hear what you think of this!
|
Back to top
 |
|
jason p sage
User
Joined: Sun Jun 10th 2007
Location: Ellington, CT USA
|
tobi453 and I were Talking in another thread and both times I didn't realize it was not the correct thread... so I'm moving the conversation here.
tobi453 Wrote:
Quote: "hi jason,
I counted your lines (FoundationClasses && Game Classes): 36943. Awesome.  That's nearly twice my star wars game.  It took me 10 minutes or so to compile all your example projects. I haven't looked at all the examples in detail yet, but it looks very good so far.
I noticed that the text input seems to lag a bit. Is this intended or a problem with my vista?
Keep up the good work! 
"
Awesome! Input Lagging... Well.. there is a delay on the keyboard... see jgc_configuration.h but before changning note that for the GUI especially, I'm using native GDK to get those fancy keypresses like CNTL+C, CNTL+V, SHIFT+END, SHIFT+HOME etc.
I need to throttle those dbKeyState(??) functions' frequency so I don't get rthousands of messages going through the gui if you hold down shift key or something. However the text you type uses dbEntry, so that is a buffer that GDK (seems like) manages by getting window messages - in the REAL WinMain. So, this buffer gets filled even when I'm not polling, then when I do POLL - it snags the whole buffer and clears it for another go around.
Now those settings in jgc_configuration.h can be changed, however its like balancing a ball trying to get the right balance of Frame Rates per Second and KeyBoard Poll Frequency (mostly due to the need to scan for special keys like CNTL and SHIFT.. I can't rely on the dbEntry() buffer alone.)
So its probably not your Vista so much as what I explained. I do think its certainly good enough for a game menu, game editors, utilities etc.
Morcilla answered a post I had made recently about this very subject. I was wondering if we could subclass or whatever without losing the control we haave for many key combinations with simulatanesous keypresses.
He didn't refer to losing or not losing that but he did point me to some code IanM wrote that seems to more or less use PeekMessage to get the OS messages without processing them. This would give the responsiveness I would need - as its not unlike interrupt programming in that I can process the keys in real time, withouth needing to adversely effect FPS .. at least that's the theory.
Have you checked out the Demo VMesh (Big Terrain) Demo Yet? USGS Data for an island in Hawaii (tweaked a bit to utilize the full heightmap bitmap "square") ... but... Curious what you or anyone else thought of that one!
Best Regards,
Jason P Sage
tobi453 Wrote Again:
Quote: "
Yes I checked it out. First I thought that it was only a plane but then I realized after moving around a bit that there are actually hills. Amazing.
I think you should definitely increase the moving speed ( the terrain is so huge, more than 1.3 million polys! ). I increased camera range and fog range and there were some strange clipping problems, but I think this is a directx problem.(Screenshot attached.)
I haven't looked at the code in detail. How have you done the terrain? With memblocks or is it advanced terrain or something else?
"
--------------
(BTW - thats the attached Pic in this post)
My Response Below
--------------
Quote: "Yes I checked it out."
LOL AWESOME!
Quote: "First I thought that it was only a plane but then I realized after moving around a bit that there are actually hills. Amazing."
Thanx! Yeah - That "plain" is just the black edges around the heightmap - it's pretty freaking huge! LOL)
Quote: "I think you should definitely increase the moving speed" Well, you can hold SHIFT to go faster, and its inside the test_jgc_vmesh_bigterrain1.cpp file... near the bottom... (line 615 before changes) looks like:
+ Code Snippet
JGC::Daddy->Update();
float cx; float cy; float cz;
if(!JGC::UserInput->MouseButton2 ){
JGC::Cam0->Control(0.05f,0.50f,0.1f,0.05f,JGC::Clock->Time_ElapsedFloat);
};
Those Cam Control Values effect speed... its an advanced version of the camera command that moves with the arrows( dbControlCameraUsingArrowKeys() I think its called).
So you can speed it up.
Quote: "the terrain is so huge, more than 1.3 million polys!" I presume you counted them by maxing out the camera LOL... yeah... Its big...
Quote: "I increased camera range and fog range and there were some strange clipping problems, but I think this is a directx problem.(Screenshot attached.)"
Never seen that before - I think it might of really pushed directX to the limit with the camera range out far enough to count 1.3 million POLY! Glad you're having fun with it!
Quote: "I haven't looked at the code in detail. How have you done the terrain? With memblocks or is it advanced terrain or something else?"
It starts in a memblock. That JGC_VMESH class is a multi-object, multi-limbed, "Matrix" on steroids  It has Welded Verts and a poly layout (modeled after Visigoth's USGS terrains.) That mesh is created by FIRST making a single poly for a "root" object (due to anomalies with how root behaves a bit different than limbs - and can look awful... for example... working on the mesh - if root 0 seems to be whole object - same for uv.. ) So I then create a mesh CellsX x CellsY (per limb) in a memblock.. then make a mesh from it, and then carbon copy it to fill the rest of the requested mesh size asked for. Cells are per limb - and need to even numbers due to the poly arrangement... 2x2, 4x2, 4x4, 16x2... Whatever ya need just even numbers for the cells. You also pick how many limbs per object (x,y), and how many objects (x,y) .... So its pretty dynamic.
There is also command to control UV and reset UV (to stock) for individual cells, and naturally, per limb, and per object, and per ENTIRE MESH... so makinging a level where you recycle a textures... and just replace use detail textures where you need them.. well.. I suspect when I get to the level editor potion of all this for iron infantry - it'll be pretty neat.
Sorry to go on an on but you asked.
The reason the frame rates are so high with that mesh is because of the frustrum culling and that's BEFORE I added any quad or Oct tree processing to optimize it...however its using my frustrum "Regions" stuff ... which basically works like a 1 tiered Quadtree in that particular demo.
the Terrain (as far as frustrum is concerned) is broken into FOUR SQUARES... And these are each a region. if the REGION is not on the screen... then all the objects in the region are excluded - PERIOD, if the REGION is in the frustrum - then normal frustrum processing (Limb Frustrum culling in this case) is performed to see what (in that region) is really on the screen or not, hiding limbs that are not visible ...cuz it helps... and excluding objects that aren't visible... helps alot more LOL  .
So I hope that at least gives you some idea of what I'm doing so when you read the code - you'll know where its heading before you start.
Thanx for the report!
Best Regards,
Jason P Sage
|
Back to top
 |
|
draknir_
User
Joined: Thu Oct 19th 2006
Location: Netherlands
|
awesome Jason, thanks for releasing this  Ill be checking it out tomorrow (need some sleep right now)
|
Back to top
 |
|
jason p sage
User
Joined: Sun Jun 10th 2007
Location: Ellington, CT USA
|
zzzz... me too... Eyes are BURNING!!!!
|
Back to top
 |
|
Niels Henriksen
User
Joined: Mon Sep 27th 2004
Location: Behind you breathing heavely
|
this is just perfect....
But Jason... can you explain how I make a new project with your classes? do I need to add all files or to make ref. to them?
Niels Henriksen
www.tales-of-the-realms.com
if Microsoft can sell software with bugs, so can I.
|
Back to top
 |
|
jason p sage
User
Joined: Sun Jun 10th 2007
Location: Ellington, CT USA
|
The latter.. This is what I do Neils - Note - IDEALLY a static lib would be used, so you don't need to recompile all the source for each project... but ... it was hinted that thier may be some gramlins with that... so I think I'm staying with the configuration because..well.. it seems to work.
1: I make a new project in that same solution.
2: I delete main.cpp (really DELETE LOL) and the readme.txt
3: I right click the project and add a new "Filter" and name it FoundationClassesRef (because its a reference and not COPIES of the source code)
4: I Right click this new filter, and select "Add Existing Item" and I navigate up a directory, and down into the FoundationClasses directory and select all the JFC_*.h and JFC_.cpp files. ( NOT the TEST PROGRAM test_foundation_classes.cpp or whatever its called!)
5: I right click the project and add a new "Filter" and name it GameClassesRef (because it is also just a reference and not COPIES of the source code)
6: I Right click this new filter, and select "Add Existing Item" and I navigate up a directory, and down into the GamesClasses directory and select all the JFC_*.h and JFC_.cpp files. ( NOT any TEST PROGRAMS Just the JGC_*.* files!)
7: Right click your new project in the tree view, select properties, and go to General->Additional Dependacies Area and enter: ..\FoundationClasses ; ..\GameClasses
8: Right Click your New Project in the Tree view and select Add New Item. (Could've just worked off the default main.cpp but...)
9: Start with this as your base code:
+ Code Snippet
#include <DarkGDK.h>
#include "jfc_common.h"
#include "jgc_configuration.h"
#include "jgc_common.h"
void DarkGDK(void){
JGC::Daddy = new JGC_DADDY();
JGC::Daddy->Init();
while(LoopGDK()){
JGC::Daddy->Update();
};
delete JGC::Daddy;
};
Good Luck Neils! Don't hesitate to ask questions... Any one!
|
Back to top
 |
|
Niels Henriksen
User
Joined: Mon Sep 27th 2004
Location: Behind you breathing heavely
|
Nice work jason..... I cant wait till you make it as a lib... it take so long time to compile
If you come to denmark/sweden, then tell me and I will give a dinner  ... Your project has helped me a lot...
Niels Henriksen
www.tales-of-the-realms.com
if Microsoft can sell software with bugs, so can I.
|
Back to top
 |
|
david w
User
Joined: Sun Dec 18th 2005
Location: Cyberspace
|
@Jason Thanks for the contribution. Also the fact that its open source is really great. Also, great work. Best I've seen in GDK to-date.
|
Back to top
 |
|
Elspin
User
Joined: Sun Mar 30th 2008
Location: Cyberspace
|
(continuation of previous discussion) I honestly don't know what happened, but it's just compiling right now. Same version, same files, same compiler, no settings changed. It just works now. Or at least, the hello world I tried compiling. I'll see if everything else works... yup. Can't wait to try this out
|
Back to top
 |
|
jason p sage
User
Joined: Sun Jun 10th 2007
Location: Ellington, CT USA
|
@Elspin (New person delayed... his message came to me via email)
I'm glad you got it working! Let me know how you make out!
|
Back to top
 |
|
Elspin
User
Joined: Sun Mar 30th 2008
Location: Cyberspace
|
|
Posted: 23rd May 2008 21:23 Edited: 23rd May 2008 22:21 |
| link | toggle |
It was crashing again, and I figured out why. Was really stupid, I was just missing the media folder for my project. I guess that explains why it couldn't get the font sizes... there were none.
|
Back to top
 |
|
jason p sage
User
Joined: Sun Jun 10th 2007
Location: Ellington, CT USA
|
Yes, and you'll notice that there is a log file that is "working" for anything that uses the JGC library - most importantly - for missing files.. loading an object that's not there... leaves a log file entry... now your program might crash as yours did because now there are pointers that ... well.. aren't what they were expected to be etc... but... that log file will help ya get that stuff sorted out
(Happens to me too... that's why I put it there!)
|
Back to top
 |
|
Elspin
User
Joined: Sun Mar 30th 2008
Location: Cyberspace
|
|
Posted: 23rd May 2008 23:23 Edited: 23rd May 2008 23:23 |
| link | toggle |
Durrr, just found that logfile which would have saved a lot of confusion. Anyways, what exactly does JGC do to the screen? It wipes all my drawing operations off as I do them. And if I create a bitmap that is not in conflicting space with the GUI, it spazzes and everything goes invisible.
|
Back to top
 |
|
|
Google Ad
AdBot
Joined: Aug 26th 2002
Location: Everywhere
|
|
Back to top
 |
|
Lost in Thought
User
Joined: Wed Feb 4th 2004
Location: U.S.A. : Douglas, Georgia
|
Glad to see you released this open source. Keep it up man. Great work.
|
Back to top
 |
|
jason p sage
User
Joined: Sun Jun 10th 2007
Location: Ellington, CT USA
|
@Lost In Thought - Thank You VERY much! Your Frustrum code is embedded in there BTW - I ported it to DarkGDK! Thank You for your work as well!
@Elspin - JGC::Init() and JGC::Update effect the screen. Have you downloaded the Getting Started Guide? This covers some of the details but I'll summerize it for you.
I made a 2 step "start up process" - The first part you create the instance of JGC: addy like this:
+ Code Snippet
JGC::Daddy = new JGC_DADDY();
Now the library is "ALMOST READY".. the two step process allows you to change a few defaults programmatically before you call JGC::Init() In vs2008, when you type JGC: addy-> intellisense shuold display a drop down list of functions and proerties. All the properties that start with D_ are the defaults you can change. Once you have things how you want them.. you call the JGC: addy->Init() and the library comes to life.
JGC::Update is supposed to be called in your main loop. I recommend using the vs2008 IDE to right click on the token "Update" and selecting "Go to Definition" to show you what its doing by bringing you to that location in the source file. Here's the snippet. I hope its self explainatory - at least as an overview of what's happening:
+ Code Snippet
//----------------------------------------------------------------------------
void JGC_DADDY::Update(void){
//----------------------------------------------------------------------------
JGC::DarkPhysics->Update();
JGC::Cull->Update_Cull_Objs();
//dbUpdateTerrain();
JGC::Clock->Update();
JGC::Cam0->Update();
JGC::UserInput->Update(JGC::Clock->Time_New);
try{
dbSync();
JGC::Cam0->Update();
}catch(...){
int STOP=0;
};
};
//----------------------------------------------------------------------------
The try statement shouldn't be necessary - but its there for me to debug. But you can see... to sumamerize your answer: JGC: addy->Update(); calls dbSync();
I hope this helps. Let me know how you make out!
|
Back to top
 |
|
Elspin
User
Joined: Sun Mar 30th 2008
Location: Cyberspace
|
|
Posted: 24th May 2008 12:56 Edited: 24th May 2008 13:55 |
| link | toggle |
Well, yes, I have gone through those functions and know what they do, but I mean aside from that something odd is happening that's preventing all bitmap operations from working.
I determined it's the camera backdrop, but turning it off totally screws the GUI over... God it's a nightmare getting anything to be compatible with the bitmaps in darkGDK.
|
Back to top
 |
|
jason p sage
User
Joined: Sun Jun 10th 2007
Location: Ellington, CT USA
|
Can you elaborate? there really isn't much in the way of "Bitmaps" or anything using bitmaps in anyway. How about a detailed report of what's going on, posting your code, and perhaps media or media "stubs" that can show what's going on on. It's just hard to guess what is going on without some reference.
Let's Squash the "oddness".. help me help you on this - at least so myself or others can see what your code is doing. It may or may not be related to the lib at all. I won't know though until you post some details!
|
Back to top
 |
|
Elspin
User
Joined: Sun Mar 30th 2008
Location: Cyberspace
|
Alright, here's my plain and simple code, there's probably at least a hundred things wrong.
+ Code Snippet#include "DarkGDK.h"
#include <jfc_common.h>
#include <jgc_configuration.h>
#include <jgc_common.h>
#define CAN_GUI
int CUR_TOOL = 2;
int drawcol;
#ifdef CAN_GUI
//--GUI CONTROLS--//
JGC_GUIMESSAGE *Msg=0; // Used in the Message Loop Below
JGC_GUIWINDOW *Win=0;// Our Window
JGC_GUIBUTTON *Btn=0;
JGC_GUIBUTTON *Btn2=0;
int VideoPhreakBitmapFontIndex=0;
//----------------//
//--handles GUI input
void MessageHandler(JGC_GUIMESSAGE *p_Msg){
switch(p_Msg->MsgType){
case MSG_CONTROLCLICK:
{
if(p_Msg->Param2==(void*)Btn)
{
CUR_TOOL = 1;
}
else if(p_Msg->Param2==(void*)Btn2)
{
CUR_TOOL = 2;
}
default:
break;
}
}
}
#endif
bool MOUSE_INRANGE()
{
if (dbMouseX() > 129 && dbMouseX() < 801)
{
if( dbMouseY() > -1 && dbMouseY() < 601)
return true;
else
return false;
}
else
return false;
}
void DarkGDK ( void )
{
dbAlwaysActiveOn();
dbSyncOn();
dbSyncRate(60);
#ifdef CAN_GUI
JGC::Daddy = new JGC_DADDY();
JGC::Daddy->Init();
JGC::ObjAnchor->Exclude_Set(true); // hide the 3d World Home Marker at position 0,0,0
JGC::BitmapFontArray->AppendItem_BitmapFont("C:/jegasllc/media/fonts/Video Phreak.dds",10,10);
VideoPhreakBitmapFontIndex = JGC::BitmapFontArray->Size_Get()-1;
Win=new JGC_GUIWINDOW(JGC::GUI->OwnerTopLevel,&MessageHandler);
Win->BorderStyle = WindowBorderStyle_FixedToolWindow;
Win->Size->X=130;
Win->Size->Y=600;
Win->Position->X=0;
Win->Position->Y=0;
Win->Text->String_Set("Tools");
//Creating the controls
//---------Button
Btn=new JGC_GUIBUTTON(Win,Win); //Our Btn
Btn->Position->X=10;
Btn->Position->Y=10;
Btn->Size->X=110;
Btn->Size->Y=50;
Btn->FontPosition->X=80;
Btn->FontPosition->Y=30;
Btn->Text->String_Set("Pencil");
Btn->TabIndex=0;
//--Second Button
Btn2 = new JGC_GUIBUTTON(Win, Win);
Btn2->Position->X=10;
Btn2->Position->Y=70;
Btn2->Size->X=110;
Btn2->Size->Y=50;
Btn2->FontPosition->X=80;
Btn2->FontPosition->Y=30;
Btn2->Text->String_Set("Bubble");
Btn2->TabIndex=1;
//Adding controls to the window
Win->WidgetDL->AppendItemToList((void*)Btn);
Win->WidgetDL->AppendItemToList((void*)Btn2);
#endif
dbBackdropOff();
//dbAutoCamOff();
dbCreateBitmap(1, 800, 600);
DWORD black = dbRGB(0,0,0);
DWORD white = dbRGB(255,255,255);
drawcol = black;
dbInk( drawcol, black );
dbCLS( white );
while ( LoopGDK ( ) )
{
#ifdef CAN_GUI
while(0!=(Msg=JGC::GUI->MessageGet()))
{
JGC::GUI->MessagePost(Msg);
}
#endif
if (dbMouseClick() == 1 && MOUSE_INRANGE() )
{
switch(CUR_TOOL)
{
case 1:
dbDot(dbMouseX(), dbMouseY());
break;
case 2:
dbCircle(dbMouseX(), dbMouseY(), 6);
break;
case 3:
dbBox(dbMouseX() - 3, dbMouseY() - 3, dbMouseX() + 3, dbMouseY() + 3);
break;
default:
break;
}
dbCopyBitmap(1, 0);
}
#ifdef CAN_GUI
JGC::Daddy->Update();
#endif
dbWait(1);
}
delete JGC::Daddy;
return;
}
The reason it's such a mess right now with things in odd places is because I've been trying a lot of things to get it to work.
|
Back to top
 |
|
jason p sage
User
Joined: Sun Jun 10th 2007
Location: Ellington, CT USA
|
I like what it appears you're developing ... Good Show. I'm looking at your code now to see if I can't ascertain how you expect it to work... and make it happen.
|
Back to top
 |
|
jason p sage
User
Joined: Sun Jun 10th 2007
Location: Ellington, CT USA
|
|
Posted: 24th May 2008 19:26 Edited: 24th May 2008 19:38 |
| link | toggle |
How's This Elspin?
+ Code Snippet
#include "DarkGDK.h"
#include "jfc_common.h"
#include "jgc_configuration.h"
#include "jgc_common.h"
JGC_GUIMESSAGE *Msg=0; // Used in the Message Loop Below
JGC_GUIWINDOW *Win=0;// Our Window
// Our Drawing Area - Basically, I set this up so it's a borderless window, and I made is transparent
// but same size as your bitmap.
// Why? So we can use the existing mouse handler
// when the mouse is over it. This way we can process messages to the drawing area in this
// region. You did a fine job BTW - and there is no way you could know the lib
// like I do - so you wouldn't have come up with this. But I know its inner workings,
// and hopefully - between us - we can get this project underway and perhaps
// others can learn from the techniques implemented here! :) - Jason
JGC_GUIWINDOW *Win2=0;
JGC_GUIBUTTON *btnPencil=0;
JGC_GUIBUTTON *btnBubble=0;
JGC_GUIBUTTON *btnBox=0;
JGC_GUIBUTTON *btnClear=0;
JGC_GUIBUTTON *btnColor=0;
int CUR_TOOL = 1;
int drawcol;
JGC_BITMAP *BMap=0;
DWORD black = dbRGB(0,0,0);
DWORD white = dbRGB(255,255,255);
//----------------------------------------------------------------------------
void MessageHandlerWin1(JGC_GUIMESSAGE *p_Msg){
//----------------------------------------------------------------------------
switch(p_Msg->MsgType){
case MSG_CONTROLCLICK:
if(p_Msg->Param2==(void*)btnPencil){
CUR_TOOL = 1;
}else{
if(p_Msg->Param2==(void*)btnBubble){
CUR_TOOL = 2;
}else{
if(p_Msg->Param2==(void*)btnBox){
CUR_TOOL = 3;
}else{
if(p_Msg->Param2==(void*)btnClear){
BMap->SetToCurrentBitmap();
dbCLS( drawcol );
JGC::Bitmap0->SetToCurrentBitmap();
}else{
if(p_Msg->Param2==(void*)btnColor){
drawcol=dbRGB(dbRnd(255),dbRnd(255),dbRnd(255));
btnColor->BackColor->RGB_Set(drawcol);
JGC::GUI->MessageSend(MSG_WINDOWPAINT,p_Msg->Param1);// Paint Me ;)
};
};
};
};
};
break;
};//endswitch
}
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
void MessageHandlerWin2(JGC_GUIMESSAGE *p_Msg){
//----------------------------------------------------------------------------
switch(p_Msg->MsgType){
case MSG_WINDOWMOUSEMOVE:{
int MX=p_Msg->Param3;// Mouse Position is RELATIVE to top left of window,
int MY=p_Msg->Param4;// Not ACTUALLY the Screen... but works here because
// draw window is at position 0,0
// Relevant Mouse buttons are sent with the MOUSEDOWN and MOUSEUP
// events and NOT with Mouse Move. (Maybe Next Version :) )
// However the UserInput class has this info ready for us always.
if(JGC::UserInput->MouseButton1){
switch(CUR_TOOL){
case 1:
BMap->SetToCurrentBitmap();
dbInk(drawcol,0);
dbDot(MX,MY);
JGC::Bitmap0->SetToCurrentBitmap();
break;
case 2:
BMap->SetToCurrentBitmap();
dbInk(drawcol,0);
dbCircle(MX,MY, 6);
JGC::Bitmap0->SetToCurrentBitmap();
break;
case 3:
BMap->SetToCurrentBitmap();
dbInk(drawcol,0);
dbBox(MX - 3, MY - 3, MX + 3, MY + 3);
JGC::Bitmap0->SetToCurrentBitmap();
break;
default:
break;
};//End Switch
};
};
case MSG_WINDOWMOUSEUP:
if((p_Msg->Param5 & 1)==1){// lifted up mouse one?
// Let's make sure Tools window has focus
JGC::GUI->MessageSend(MSG_WINDOWSETFOCUS,(void*)Win);
};
break;
default:
break;
}//End Switch
}
//----------------------------------------------------------------------------
void DarkGDK ( void )
{
//dbAlwaysActiveOn();
//dbSyncOn();
//dbSyncRate(60);
JGC::Daddy = new JGC_DADDY();
JGC::Daddy->Init();
//JGC::Cam0->Backdrop_Set(false);
JGC::ObjAnchor->Exclude_Set(true); // hide the 3d World Home Marker at position 0,0,0
// I make Win2 First So Win1 made last - and therefore focused.
// there is a MSG_SETFOCUS message, but you need to send in a message handler
// or strategically (underneath the main gui loop below and made to only
// happen once - first time through that GUI While loop.
Win2=new JGC_GUIWINDOW(JGC::GUI->OwnerTopLevel,&MessageHandlerWin2);
Win2->BorderStyle = WindowBorderStyle_None;
Win2->Size->X=JGC::Display->Width_Get();
Win2->Size->Y=JGC::Display->Height_Get();
Win2->Position->X=0;
Win2->Position->Y=0;
Win2->Opacity=0; // make it invisible partially
Win=new JGC_GUIWINDOW(JGC::GUI->OwnerTopLevel,&MessageHandlerWin1);
Win->BorderStyle = WindowBorderStyle_FixedToolWindow;
Win->Size->X=130;
Win->Size->Y=600;
Win->Position->X=0;
Win->Position->Y=0;
Win->Text->String_Set("Tools");
Win->ButtonClose->Visible=false;
//Creating the controls
btnPencil=new JGC_GUIBUTTON(Win,Win); //Our Btn
btnPencil->Position->X=10;
btnPencil->Position->Y=10;
btnPencil->Size->X=110;
btnPencil->Size->Y=50;
btnPencil->Text->String_Set("Pencil");
btnPencil->TabIndex=0;
btnBubble = new JGC_GUIBUTTON(Win, Win);
btnBubble->Position->X=10;
btnBubble->Position->Y=70;
btnBubble->Size->X=110;
btnBubble->Size->Y=50;
btnBubble->Text->String_Set("Bubble");
btnBubble->TabIndex=1;
btnBox = new JGC_GUIBUTTON(Win, Win);
btnBox->Position->X=10;
btnBox->Position->Y=130;
btnBox->Size->X=110;
btnBox->Size->Y=50;
btnBox->Text->String_Set("Box");
btnBox->TabIndex=2;
btnClear = new JGC_GUIBUTTON(Win, Win);
btnClear->Position->X=10;
btnClear->Position->Y=200;
btnClear->Size->X=110;
btnClear->Size->Y=50;
btnClear->Text->String_Set("Clear");
btnClear->TabIndex=3;
btnColor = new JGC_GUIBUTTON(Win, Win);
btnColor->Position->X=10;
btnColor->Position->Y=270;
btnColor->Size->X=110;
btnColor->Size->Y=50;
btnColor->Text->String_Set("Color");
btnColor->TabIndex=4;
//Adding controls to the window
Win->WidgetDL->AppendItemToList((void*)btnPencil);
Win->WidgetDL->AppendItemToList((void*)btnBubble);
Win->WidgetDL->AppendItemToList((void*)btnBox);
Win->WidgetDL->AppendItemToList((void*)btnClear);
Win->WidgetDL->AppendItemToList((void*)btnColor);
// Remember in my post in the TGC forums I said I didn't have a ton of
// bitmap code written? Well, we can mix and match DarkGDK native stuff
// with a little care.
BMap=new JGC_BITMAP(); // Force ID 1 ;)
dbCreateBitmap(BMap->ID, JGC::Display->Width_Get(), JGC::Display->Height_Get());
drawcol = black;
dbInk( drawcol, black );
dbCLS( white );
JGC::Bitmap0->SetToCurrentBitmap();
while ( LoopGDK ( ) )
{
while(0!=(Msg=JGC::GUI->MessageGet())){
JGC::GUI->MessagePost(Msg);
};
JGC::Bitmap0->CopyFrom(BMap->ID); // Grab the drawn On Bitmap 1 into view via a copy
JGC::Daddy->Update();
//dbWait(1);
//Sleep(10);
}
delete JGC::Daddy;
return;
}
See Attached Pic
[edit] slight text edit in code, made comments reflect what code was doing better than initial post[/edit]
|
Back to top
 |
|
Elspin
User
Joined: Sun Mar 30th 2008
Location: Cyberspace
|
|
Posted: 24th May 2008 20:12 Edited: 24th May 2008 20:17 |
| link | toggle |
Thanks! gonna try this out now
EDIT:Great, exactly how it was intended.
|
Back to top
 |
|
jason p sage
User
Joined: Sun Jun 10th 2007
Location: Ellington, CT USA
|
AWESOME! Glad you like it! Now remember, because of how mouse moves generally aren't read every pixel... for the "Pencil" you probably want to work in a "line" versus drawing with t a dot. You'll want to save that "last" mouse X,Y somewhere, and each new "pencil move - with mouse down" draw a line from the last position to the current position, then save those mouse x,y's for the next go around.
|
Back to top
 |
|
Aaron Miller
User
Joined: Sat Feb 25th 2006
Location: Behind the trusty dumpster.
|
Looks cool, good job.
Your signature has been erased by a mod
|
Back to top
 |
|
jason p sage
User
Joined: Sun Jun 10th 2007
Location: Ellington, CT USA
|
New Release Anouncement! Version 1.1!!! See the downloads area for this project on the project home page - Make sure to grab Version 1.1! http://code.google.com/p/darkgdkoop/
ENJOY!
--Jason P Sage
Here's the release notes:
+ Code Snippet
/*============================================================================
| _________ _______ _______ ______ _______ Jegas, LLC |
| /___ ___// _____/ / _____/ / __ / / _____/ JasonPSage@jegas.com |
| / / / /__ / / ___ / /_/ / / /____ |
| / / / ____/ / / / / / __ / /____ / |
|____/ / / /___ / /__/ / / / / / _____/ / |
/_____/ /______/ /______/ /_/ /_/ /______/ |
| Under the Hood |
==============================================================================
Copyright(c)2008 Jegas, LLC
============================================================================*/
May 26, 2008 - Version 1.1 - author: Jason P Sage
==============================================================================
Project Home Web Site: http://code.google.com/p/darkgdkoop/
Thanx for downloading and installing the JGC Library v1.1! I Hope you LOVE IT!
Please forgive the fact that the the documentation in this 1.1 release aside
from this "release notes doc" has not been modified, but I think its important
to get the latest and greatest out there in your hands as soon as possible!
What's New? Many bugs fixed and many systemic changes to tighten up the
library's architecture! If you already have version 1.0, fear not, the changes
aren't that earth shattering for conversion and I'd be glad to offer any
suggestions and or help I can that time allows! (Visit me in the TGC forums,
I'm usually scoping out the threads in the DarkGDK forum on the regular!)
I can say this with confidence: This release is the best yet!
MAJOR CHANGE:
Configuration paradigm overhauled! There is more than 152 settings you can
change before you pull the trigger and init the library, and more if you
count some of the compiler directives found in JGC_CONFIGURATION.H
I explain my two step start up design in another document - (The Getting
Started Guide yet to be updated available on the project web site) and this
design hasn't changed - its just been expanded. If you have some old code that says a
setting doesn't exist anymore (some identifier not found error while compiling,
then it might still be there but now in UPPER CASE. Also some names changed
slightly like D_CameraRange_Far might now be D_CAMERA_RANGE_FAR for example.
Here's an example you'll see in various demos more or less:
----Code
void DarkGDK ( void ){
JGC::Daddy = new JGC_DADDY();
JGC::Daddy->D_USERINPUT_MOUSE_VISIBLE=false;
JGC::Daddy->Init();
----Code
Now this allows changing settings BEFORE the library is started. Notice the
"D_" before "USERINPUT" .. this means DEFAULT. In the JGC_CONFIGURATION.H
file, these same values (the hardcoded defaults, have SAME NAMES but have
the word DEFAULT spelled out. DEFAULT_USERINPUT_MOUSE_VISIBLE.
The groundwork has been laid to in the future add code that allows loading
of this configuration data... but that's still vaporware :)
JGC inventories its usage of GDK and some JGC core classes! This paves the way
for lost DirectX "Surfaces" (Switching full screen to windowed mode via ALT-TAB
can cause all objects to be discarded. Having a list of ALL objects for example
and their filenames (if you loaded them) handy is a step in the right
direction! Also, these entities (classes or whatever) will self clean them-
selves at the end of the application in case you overlook any of them. This is
not a replacement for good proper coding practices... however its nice to have
a list of EVERYTHING you have going on in the system. If you use this JGC lib
to invoke all your GDK entities.. sounds etc, you have a very useful
(diagnostics or whatever) source of resources information available to you
via the arrays that house this info in the JGC namespace.
--The following entities are now self managed in the API.
JGC_PIXELGRID
JGC_OBJECT
JGC_CAMERA
JGC_VECTOR
JGC_BITMAP
JGC_IMAGE
JGC_VECTOR
JGC_LIGHT
JGC_SPRITE
JGC_EFFECT
JGC_TIMER
JGC_MESH
JGC_MEMBLOCK
JGC_MATRIX
JGC_TERRAIN
JGC_BITMAPFONT
JGC_BITMAPTEXT
JGC_MUSIC
JGC_SOUND
-They arrays (of type JFC_AR in the foundations classes) that house them:
JGC::PixelGridArray;
JGC::ObjectArray;
JGC::CameraArray;
JGC::VectorArray;
JGC::BitmapArray;
JGC::ImageArray;
JGC::VectorArray;
JGC::LightArray;
JGC::SpriteArray;
JGC::EffectArray;
JGC::TimerArray;
JGC::MeshArray;
JGC::MemblockArray;
JGC::MatrixArray;
JGC::TerrainArray;
JGC::BitmapFontArray;
JGC::BitmapTextArray;
JGC::MusicArray;
JGC::SoundArray;
To understand these arrays, see the JFC_AR class, but in short, its a a dynamic
array with easy commands. The ONE thing you need to know about it is that I DID
NOT use the STDLIB and I did not use a template design. This means that array
only keeps track of one data type! It's a dynamic array of 32 bit integers!
This means I can store any 32 bit value in there however via type casting. So,
to examine the contents of say the JGC::ObjectArray, you first make sure there
is something there:
if(JGC::ObjectArray->Size_Get()>0){ do whatever here };
Then you say.. for this example want to examine (or set) the new Description
string in the first object in the array. Well, you could type cast this ugly
way - which is very efficient from a speed perspective:
dbPrint( ((JGC_OBJECT*)JGC::ObjectArray->ar[0])->Description->s );
Or cheat which I do when readability is more important:
JGC_OBJECT *ObjReference = (JGC_OBJECT*)JGC::ObjectArray->ar[0];
dbPrint(ObjReference->Description->s);
Any ways, thats how it works in a nut shell.
Also, all classes with load and or save functionality now have a string
(JFC_STRING class in the foundation classes) containing the last successful
LOAD or SAVE of that entity. Also, there is a Description string also for
these, to make your custom editor or game creation that much easier! Have a
bunch of music loaded? Maybe a description would do more justice than a
filename alone! Example:
JGC_OBJECT *MyObject=new JGC_OBJECT();
if(MyObject->Load("MyModel.x")){
dbPrint(MyObject->Filename->s);
MyObject->Description->Set("My Awesome Model!");
}else{
dbPrint("See Log file, file not found!");
};
Note - I said the new "Filename" strings get set when a successful LOAD or SAVE.
If you loaded "MyModel.x", and then saved it as "MyModelCopy.x", the the filename
string for this object would become: "MyModelCopy.x".
Ok... So you are aware, some stuff is created for you when the library is
initialized via : JGC::Init(); (See demos and source for examples) Here is a
break down of what they are - new things have been added. Welcome to the
JFC and JGC Namespaces!
=== JFC Namespace ============Foundation Classes Project==========
char CHAR1K[1024];
Char buffer I use for all string ops. Volatile but handy
when you need a char buffer now!
float Interpolate(float x0, float x1, float x , float y0, float y1);
The famous LERP function! Look in
(I presume these are obvious)
float Convert_Meters_To_Millimeters(float p_Meters);
float Convert_Meters_To_Centimeters(float p_Meters);
float Convert_Meters_To_Feet(float p_Meters);
float Convert_Meters_To_Yards(float p_Meters);
float Convert_Meters_To_Miles(float p_Meters);
float Convert_Meters_To_Inches(float p_Meters);
float Convert_Meters_To_Kilometers(float p_Meters);
float Convert_Millimeters_To_Meters(float p_Millimeters);
float Convert_Centimeters_To_Meters(float p_Centimeters);
float Convert_Feet_To_Meters(float p_Feet);
float Convert_Yards_To_Meters(float p_Yards);
float Convert_Miles_To_Meters(float p_Miles);
float Convert_Inches_To_Meters(float p_Inches);
float Convert_Kilometers_To_Meters(float p_Kilometers);
float Convert_Seconds_To_MilliSeconds(float p_Seconds);
float Convert_Seconds_To_Minutes(float p_Seconds);
float Convert_Seconds_To_Hours(float p_Seconds);
float Convert_Seconds_To_Days(float p_Seconds);
float Convert_Milliseconds_To_Seconds(float p_Milliseconds);
float Convert_Milliseconds_To_Minutes(float p_Milliseconds);
float Convert_Milliseconds_To_Hours(float p_Milliseconds);
float Convert_Minutes_To_Seconds(float p_Minutes);
float Convert_Hours_To_Seconds(float p_Hours);
float Convert_Days_To_Hours(float p_Days);
int ABS(int i);
Drop in replacement for the DarkGDK ABS function.
This one is for integers. (Faster to use these)
float ABS(float f);
Drop in replacement for the DarkGDK ABS function.
This one is for floats. (Faster to use these)
If you inline these - you could make em faster still.
Compiler might be doing it automagically. I don't know for sure.
=== JGC Namespace =========GameClasses Project===========
JFC_AR *PixelGridArray; This array has an element for each instantiated JGC_PIXELGRID class.
JFC_AR *ObjectArray; This array has an element for each instantiated JGC_OBJECT class.
JFC_AR *CameraArray; This array has an element for each instantiated JGC_CAMERA class.
JFC_AR *VectorArray; This array has an element for each instantiated JGC_VECTOR class.
JFC_AR *BitmapArray; This array has an element for each instantiated JGC_BITMAP class.
JFC_AR *ImageArray; This array has an element for each instantiated JGC_IMAGE class.
JFC_AR *LightArray; This array has an element for each instantiated JGC_LIGHT class.
JFC_AR *SpriteArray; This array has an element for each instantiated JGC_SPRITE class.
JFC_AR *EffectArray; This array has an element for each instantiated JGC_EFFECT class.
JFC_AR *TimerArray; This array has an element for each instantiated JGC_TIMER class.
JFC_AR *MeshArray; This array has an element for each instantiated JGC_MESH class.
JFC_AR *MemblockArray; This array has an element for each instantiated JGC_MEMBLOCK class.
JFC_AR *MatrixArray; This array has an element for each instantiated JGC_MATRIX class.
JFC_AR *TerrainArray; This array has an element for each instantiated JGC_TERRAIN class.
JFC_AR *BitmapFontArray;This array has an element for each instantiated JGC_BITMAPFONT class.
JFC_AR *BitmapTextArray;This array has an element for each instantiated JGC_BITMAPTEXT class.
JFC_AR *MusicArray; This array has an element for each instantiated JGC_MUSIC class.
JFC_AR *SoundArray; This array has an element for each instantiated JGC_SOUND class.
JGC_CAMERA *Cam0; This is the default camera in a globally available JGC_CAMERA class
JGC_DADDY *Daddy; This is the Heart of the JGC library. See demos to see how its fired up!
JGC_DARKPHYSICS *DarkPhysics; This class is instantiated for you and manages DarkPhysics. Light implementation
so far, but it's magic is the seamless updating in JGC::Daddy->Update(); and the
ability to change a compiler directive and DFarkPhysics stuff gets compiled in or
not depending on setting. The class is Inert if you don't link to DarkPhysics via
the default JGC_CONFIGURATION compiler directive setting.
JGC_DISPLAY *Display; This class is instantiated for you and allows you to control and query the display.
JGC_CLOCK *Clock; This is created for you and is the heart of all timer based anything.
JGC_FILE *File; This utility class is created for you and is the heart of the logging system as well
as a few other file related tools. Including built in checklist diagnostic routines you
can call to spit out any DarkGDK CheckList and spit it to a file!
JGC_USERINPUT *UserInput; Well.. I imagine you know what this class is used for, however note that the
mouse visible set and get functions herein are for the hardware mouse and are
akin to DarkGDK's dbHideMouse() or whatever. The GUI has its own mouse setting that
pertains to a "sprite mouse pointer". Yes you can have both on at same time :)
JGC_VECTOR *mthDistanceVector; Used internally for some of the Distance functions found in JGC_COMMON.H that are
avilable for you.. distance to object, plus others.
JGC_LIGHT *Light0; Default Light0 (JGC_LIGHT class)
JGC_LIGHT *Light1; Default Light1 (JGC_LIGHT class) because Light0 doesn't behave right all the time
in DarkGDK, so having Light1 created already is just another leg up to get stuff running!
JGC_OBJECT *ObjAngleFinder; This is a JGC_OBJECT and is defaulted to excluded (not seen or rendered) but you can
change that as it works like any other object. I use this to get information... like
place it somewhere, turn it, then read back the coordinates and the angles.
JGC_OBJECT *ObjAnchor; This is by default visible, its the same "object design" (Cloned? I forget) as the
object angle finder - a big colorful 3d cursor like cross - resembles a jack from the
game "jacks" (...rubber ball.. little metal things that stink if you step on them barefoot.)
Visible by default.
JGC_OBJECT *ObjToy; Just like ObjAnchor and ObjAngleFinder - this is another 3d Cursor. I use this myself as a visible
3d cursor and utility thing... but - its hidden by default.
JGC_IMAGE *ImgTest; This image is hardcoded and is created at startup. It's just a default JGC_IMAGE with data ready to go.
JGC_IMAGE *ImgRed; JGC_IMAGE - a red pixel.
JGC_IMAGE *ImgGreen; JGC_IMAGE - a green pixel.
JGC_IMAGE *ImgYellow; JGC_IMAGE - a yellow pixel.
JGC_IMAGE *ImgBlue; JGC_IMAGE - a blue pixel.
JGC_PIXELGRID *PG; JGC_PIXELGRID - for scratch use. Until you play with the pixelgrid, you won't appreciate having this
little tool available on the ready.
JGC_CULL *Cull; JGC_CULL - the frustrum culling system - instantiated and ready to go. Just feed it objects!
Read the code, and view the demos. A powerful (expandable) frustrum (limb) culling system is there
for the taking.
JGC_BITMAP *Bitmap0; This is the default Bitmasp Zero - with a JGC class already configured for it: JGC_BITMAP.
JGC_BITMAPFONT *BitmapFont_Default; - This is the default bitmap font, preloaded, ready to go. Also, the JGC_BITMAPTEXT class
REQUIRES a "real JGC_BITMAPFONT" instance is associated with it or its metrics functions error out.
This is the font all JGC_BITMAPTEXT's instances use if nothing else is specified.
JGC_BITMAPFONT *BitmapFont_DefaultBold; This is the default BOLD font, preloaded, ready to go. Also, the JGC_BITMAPTEXT class.
The GUI system relies on both of these two preloaded fonts.
JGC_GUI *GUI; Wow.. alot of work went into this. I don't don't knwo where to start except to say you have a GUI at
your disposal, read code in the demos, and give it a whirl. All source included :)
==============================================================================
May 15, 2008 - Version 1.0 - author: Jason P Sage
==============================================================================
I Disable the Escape key in many projects and the code so far has never been
made into a true release as yet. Thats up to you.. but YOU MUST during testing
stop the application via the Visual Studio 2008 Debug Menu, "Stop Debugging"
option. NOT because of memleaks.. but vs2008 TAKES FOREVER to shut down GDK
apps and it will frustrate you.
So TRY to make a habit of ALT-TAB back to Visual Studio and Selecting that
Stop Debuggin option or pressing SHIFT+F5.
Of Course you CAN shut these apps down the proper way.. just go get a cup of
Joe while it does its thing! :)
Enjoy - I put a lot of work in to this and I hope people can utilize it,
learn from it, and have fun!
--Jason P Sage
|
Back to top
 |
|
jason p sage
User
Joined: Sun Jun 10th 2007
Location: Ellington, CT USA
|
VERSION 1.1 PATCH RELEASED!! Be sure to download the Version 1.1 PATCH if you haven't done so yet from:
Project Web Page: http://code.google.com/p/darkgdkoop/
I think you'll see why I bothered with this patch when you see the readme:
+ Code Snippet
/*============================================================================
| _________ _______ _______ ______ _______ Jegas, LLC |
| /___ ___// _____/ / _____/ / __ / / _____/ JasonPSage@jegas.com |
| / / / /__ / / ___ / /_/ / / /____ |
| / / / ____/ / / / / / __ / /____ / |
|____/ / / /___ / /__/ / / / / / _____/ / |
/_____/ /______/ /______/ /_/ /_/ /______/ |
| Under the Hood |
==============================================================================
Copyright(c)2008 Jegas, LLC
============================================================================*/
May 27, 2008
Installation Instructions. Copy the three source files that came in this patch
into your GameClasses folder. That's it! Just recompile and go!
What does the patch do?
--Fixes problem where the JGC_GUIBUTTON class would not honor the FontPosition
offsets "X" and "Y". This meant that no matter what your text was pinned
into the upper left of the button.
File jgc_gui.cpp
Note: There is also a "Z" FontPosition offset. This is not implemented but
may be in future versions (Maybe you write it and contribute!) to
allow "automagically" positioning Bitmap Fonts in 3d Space by rendering
to a GDK plane! (You can accomplish this now, so I haven't made it a
priority. Just render to an image, followed by texturing your 3d Plane
with it!
--Fixes Issue with the JGC_BITMAPTEXT class (it renders you have in mem loaded
into instances of JGC_BITMAPFONT) where it wasn't properly rendering Right
aligned and centered strings. How do you align? jfc_common.h has an enum
declared: ALIGNLEFT, ALIGNCENTER, ALIGNRIGHT. Use these like this:
JGC_BITMAPTEXT *bmt=new JGC_BITMAPTEXT();
bmt->Alignment_Set(ALIGNRIGHT);
bmt->String_Write(X,Y,"Hello!");
File: jgc_bitmapfonts.cpp
That's all - sorry about the mishaps! I updated the Bitmap demo to illustrate
how this is accomplished.
Enjoy,
Jason P Sage
|
Back to top
 |
|
jason p sage
User
Joined: Sun Jun 10th 2007
Location: Ellington, CT USA
|
VERSION 2.0 RELEASED!! Lights and Effects Classes revisited!
Also the whole solution was reorganized to make compiling MUCH faster!
Any and all feed back appreciated! It's going to be awhile before there are any more releases because I'm starting a new project.
Have fun! Enjoy!
-- Jason
|
Back to top
 |
|
Zuka
User
Joined: Mon Apr 21st 2008
Location: They locked me in the insane asylum.
|
Don't want to let this die!
If you can do any models for FW, reply to the FleetWars thread.
Click here!
|
Back to top
 |
|
jason p sage
User
Joined: Sun Jun 10th 2007
Location: Ellington, CT USA
|
LOL - Thanx for the post - I think its dying - but the occasional bump might be needed. I know there have been over 530 downloads of this library, and I haven't heard any complaints - so I can only guess that a number of people are in fact using the library, borrowing clips of code from it, learning from it, and maybe making games and things with it....
You don't always hear feedback from the people who are using these kinds of "programming leg ups" - in fact - its often the trend to strip out references to the "last person" and adopt it all and call it "original" - which is fine with me in this case - because this is a LEG UP to my fellow (and budding) game developers...
So again - Thank You Zuka for the bump!
BTW - I haven't abandoned this library - and I always try to answer posts - questions - etc. time permitting. I've been tryng my hand at other things - such as DirectX programming directly - but I'm still around - and I am still actively a TGC customer - albeit models, software whatever - so I'm around
|
Back to top
 |
|
Zuka
User
Joined: Mon Apr 21st 2008
Location: They locked me in the insane asylum.
|
I'm having trouble with it, though. I posted in the Dark GDK subforum, check there, please.
If you can do any models for FW, reply to the FleetWars thread.
Click here!
|
Back to top
 |
|
jason p sage
User
Joined: Sun Jun 10th 2007
Location: Ellington, CT USA
|
Zuka - have you gotten this resolved? <bad form to send me on a hunt LOL... Link me!  >
|
Back to top
 |
|
Sorry, but it has been so long since anyone replied to this Thread that it has been automatically locked.
You may read it but not reply.
Enter a word or phrase to search our Forum for:
|
|
 |