Plugin problem:
I've been working on my procedural 3D level generator for a long time now and just recently got it to work perfect with Dark GDK (V1.0). So, once it was working in Dark GDK, it was time to turn it into a plugin for the Dark Basic Pro community.
The Visual Studio 2008 Express C++ setup for a DLL with the default project settings I used, with the Multi-Byte settings changed and also attached the lib and the include dirs for the DBP plugin header files from IanM.
At first, when writing a sample dba file to test the plugin I'd immediatly hit 'Error 501: Something about an image'. So I put checks in my code to test the stages it was running at and it got past the first function, the setup. I also took out a vector with held an array of objects for the plugin for future use. I even ditched the lot and started the DLL plugin project another 2 times.
What is actually happening now is the when I go to compile a project from the DBP IDE (default editor), it will freeze and then complain it cannot write the exe file. So I loaded up some old DBP projects and they compile and run just fine.
In case the problem can be spotted from here I'll post some of the source files. If not I can email the project over for someone to take a look at. I'm pulling my hair out again and really want to release this plugin as soon as but I'm flummoxed.
stdafx.h
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//
#pragma once
#include "targetver.h"
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
// Windows Header Files:
#include <windows.h>
#include <vector>
#include <math.h>
// TODO: reference additional headers your program requires here
#include <DBPro.hpp>
#include "PROC_MAP.h"
#include "_GDK_PM.h"
// define the EXPORT functions
#define EXPORT __declspec(dllexport)
#define EXPORTC extern "C" __declspec(dllexport)
// make sure to use ASM optimised code (not used at the moment)
#define WL_USE_ASM
// other function declarations
sFrame* dbCreateNewFrame( sObject* pObject, LPSTR pName, bool bNewMesh );
// external references
extern GlobStruct *g_pGlob;
Standard.cpp
#include "stdafx.h"
//
// see: http://forum.thegamecreators.com/?m=forum_view&t=190224&b=18
// for more refernces
//
#pragma comment (lib, "DBProInterface9.0.lib")
//#pragma comment (lib, "comctl32.lib")
GlobStruct* g_pGlob;
// Constructor
void Constructor ( void ) { // Create memory here
//InitCommonControls();
}
// Destructor
EXPORT void PreDestructor(void) { // Early shutdown stuff goes here
}
void Destructor ( void ) { // Free memory here
}
// Get GlobStruct
void ReceiveCoreDataPtr ( LPVOID pCore ) { // Get Core Data Pointer here
g_pGlob = (GlobStruct*)pCore;
}
// List of DLL's that this plug-in depends on
const char* Dependencies[] =
{
"DBProBasic3DDebug.dll",
"DBProImageDebug.dll",
"DBProBasic2DDebug.dll"
};
EXPORT int GetNumDependencies( void )
{
return sizeof(Dependencies) / sizeof(const char*);
}
EXPORT const char* GetDependencyID(int ID)
{
return Dependencies[ID];
}
// missing function declaration
typedef sFrame* (__cdecl * dbCreateNewFrame0) ( sObject* pObject, LPSTR pName, bool bNewMesh );
sFrame* dbCreateNewFrame( sObject* pObject, LPSTR pName, bool bNewMesh )
{
static dbCreateNewFrame0 fPtr = 0;
if ( fPtr == 0 )
fPtr = (dbCreateNewFrame0) GetProcAddress(
GetModuleHandle("DBProBasic3DDebug.dll"),
"?CreateNewFrame@@YAPAUsFrame@@PAUsObject@@PAD_N@Z" );
return fPtr(pObject, pName, bNewMesh);
}
dllmain.cpp
// dllmain.cpp : Defines the entry point for the DLL application.
#include "stdafx.h"
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
resource.h
#ifndef IDC_STATIC
#define IDC_STATIC (-1)
#endif
#define IDS_STRING1 1
#define IDS_STRING2 2
#define IDS_STRING3 3
#define IDS_STRING4 4
#define IDS_STRING5 5
#define IDS_STRING6 6
#define IDS_STRING7 7
#define IDS_STRING8 8
#define IDS_STRING9 9
#define IDS_STRING10 10
#define IDS_STRING11 11
#define IDS_STRING12 12
#define IDS_STRING13 13
#define IDS_STRING14 14
#define IDS_STRING15 15
#define IDS_STRING16 16
#define IDS_STRING17 17
#define IDS_STRING18 18
#define IDS_STRING19 19
#define IDS_STRING20 20
#define IDS_STRING21 21
#define IDS_STRING22 22
#define IDS_STRING23 23
#define IDS_STRING24 24
resource.rc
#include "resource.h"
STRINGTABLE
{
// Setup functions
IDS_STRING1 "PMAP SET MAP DATA%LLLL%pm_set_map%size,seed,height,tess"
IDS_STRING2 "PMAP SET CORRIDOR%LLLLLL%pm_set_corridor%lmin,lmax,amin,amax,smin,smax"
IDS_STRING3 "PMAP SET ROOM%LLLL%pm_set_room%lmin,lmax,smin,smax"
// Edge functions
IDS_STRING4 "PMAP SEL IN EDGE%LL%pm_sel_in_edge%seg,edge"
IDS_STRING5 "PMAP SEL OUT EDGE%LL%pm_sel_out_edge%seg,edge"
IDS_STRING6 "PMAP GET IN COUNT[%LL%pm_get_in_count%seg"
IDS_STRING7 "PMAP GET OUT COUNT[%LL%pm_get_out_count%seg"
IDS_STRING8 "PMAP EDGE CENTRE X[%L%pm_edge_centre_x%"
IDS_STRING9 "PMAP EDGE CENTRE Y[%L%pm_edge_centre_y%"
IDS_STRING10 "PMAP EDGE CENTRE Z[%L%pm_edge_centre_z%"
// Setup textures
IDS_STRING11 "PMAP TEXTURE CORRIDOR%SSS%pm_texture_corridor%floor,wall,roof"
IDS_STRING12 "PMAP TEXTURE ROOM%SSS%pm_texture_room%floor,wall,roof"
// Main generate function
IDS_STRING13 "PMAP GENERATE%0%pm_generate%"
// Return objects ID number
IDS_STRING14 "PMAP OBJECT ID[%L%pm_get_object%"
}
PROC_MAP.ini
PMAP SET MAP DATA==size,seed,height,tessflag
PMAP SET CORRIDOR==lmin,lmax,amin,amax,smin,smax
PMAP SET ROOM==lmin,lmax,smin,smax
PMAP SEL IN EDGE==seg,edge
PMAP SEL OUT EDGE==seg,edge
PMAP GET IN COUNT==(seg)
PMAP GET OUT COUNT==(seg)
PMAP EDGE CENTRE X==()
PMAP EDGE CENTRE Y==()
PMAP EDGE CENTRE Z==()
PMAP TEXTURE CORRIDOR==floor$,wall$,roof$
PMAP TEXTURE ROOM==floor$,wall$,roof$
PMAP GENERATE==*no params*
PMAP OBJECT ID==()
DBP_functions
#include "stdafx.h"
// storage for the PROC_MAP
_GDK_PM MAP;
// used to select an edge
_EDGE *PM_edge = 0;
_VERT *PM_verts = 0;
EXPORTC void pm_set_map( int size, int seed, int height, int tess )
{
MAP.set_map( size, seed, height );
MAP.tess = tess;
}
EXPORTC void pm_set_corridor( int len_min, int len_max, int ang_min, int ang_max, int seg_min, int seg_max )
{
MAP.set_corridor( len_min, len_max, ang_min, ang_max, seg_min, seg_max );
}
EXPORTC void pm_set_room( int len_min, int len_max, int seg_min, int seg_max )
{
MAP.set_room( len_min, len_max, seg_min, seg_max );
}
EXPORTC void pm_sel_in_edge( int seg, int edge )
{
seg %= MAP.map_size;
edge %= MAP.pSegList[seg].iedges.size();
PM_edge = &MAP.pSegList[seg].iedges[edge];
PM_verts = &MAP.pSegList[seg].verts[0];
}
EXPORTC void pm_sel_out_edge( int seg, int edge )
{
seg %= MAP.map_size;
edge %= MAP.pSegList[seg].oedges.size();
PM_edge = &MAP.pSegList[seg].oedges[edge];
PM_verts = &MAP.pSegList[seg].verts[0];
}
EXPORTC int pm_get_in_count( int seg )
{
seg %= MAP.map_size;
return MAP.pSegList[seg].iedges.size();
}
EXPORTC int pm_get_out_count( int seg )
{
seg %= MAP.map_size;
return MAP.pSegList[seg].oedges.size();
}
EXPORTC void pm_texture_corridor( char* floor, char* wall, char* roof )
{
MAP.GDK_corridor_textures( floor, wall, roof );
}
EXPORTC void pm_texture_room( char* floor, char* wall, char* roof )
{
MAP.GDK_room_textures( floor, wall, roof );
}
EXPORTC DWORD pm_get_object()
{
return MAP.GDK_get_object();
}
EXPORTC DWORD pm_edge_centre_x()
{
float result = ( PM_verts[PM_edge->v1].x + PM_verts[PM_edge->v2].x ) / 2.0f;
return DBPro::CastToFloat( result );
}
EXPORTC DWORD pm_edge_centre_y()
{
float result = ( PM_verts[PM_edge->v1].y + PM_verts[PM_edge->v2].y ) / 2.0f;
return DBPro::CastToFloat( result );
}
EXPORTC DWORD pm_edge_centre_z()
{
float result = ( PM_verts[PM_edge->v1].z + PM_verts[PM_edge->v2].z ) / 2.0f;
return DBPro::CastToFloat( result );
}
EXPORTC void pm_generate()
{
MAP.GDK_generate();
}
The other four files are the main PROC_MAP code with all the GDK function calls changed to DBP calls, ie from _GDK_PM.cpp
void _GDK_PM::GDK_build_object()
{
iLimbCount = map_size * 3;
ObjID = GDK_free_object();
DBPro::CreateNewObject( ObjID, "", 1 );
pObject = DBPro::GetObjectData( ObjID );
DBO_flag = false;
GDK_dbo_floor();
GDK_dbo_wall();
GDK_dbo_roof();
DBPro::SetNewObjectFinalProperties( ObjID, 10.0f );
DBPro::TextureObject( ObjID, 0 );
int loop, type;
int wall_off = map_size;
int roof_off = wall_off + map_size;
for ( loop = 0; loop < map_size; loop ++ )
{
type = pSegList[loop].faces[0].type;
int limb = loop;
if ( type == PM_RFACE )
{
if ( textures[0] ) DBPro::TextureLimb( ObjID, limb, textures[0] );
else DBPro::ColorLimb( ObjID, limb, 0x888888 );
if ( textures[1] ) DBPro::TextureLimb( ObjID, limb + wall_off, textures[1] );
else DBPro::ColorLimb( ObjID, limb + wall_off, 0xff8800 );
if ( textures[2] ) DBPro::TextureLimb( ObjID, limb + roof_off, textures[2] );
else DBPro::ColorLimb( ObjID, limb + roof_off, 0xff0000 );
}
else
{
if ( textures[3] ) DBPro::TextureLimb( ObjID, limb, textures[3] );
else DBPro::ColorLimb( ObjID, limb, 0x00ffff );
if ( textures[4] ) DBPro::TextureLimb( ObjID, limb + wall_off, textures[4] );
else DBPro::ColorLimb( ObjID, limb + wall_off, 0x00ff88 );
if ( textures[5] ) DBPro::TextureLimb( ObjID, limb + roof_off, textures[5] );
else DBPro::ColorLimb( ObjID, limb + roof_off, 0x00ff00 );
}
}
}
I've also checked many times that #include "DarkGDK.h" is not there and it isn't...
Please someone help me get this finished.
I'll email the entire project if anyone would like to check it out.
Mental arithmetic? Me? (That's for computers) I can't subtract a fart from a plate of beans!
Warning! May contain Nuts!