Ich habe folgendes Problem. Ich habe eine DLL geschrieben womit man überprüfen kann ob der Mauszeiger über ein Objekt ist. Nun es funktioniert auch alles herrvoragend unter C. Mit GML gemischt habe ich eine fps von 60 bei 100 Dreiecken erzielt. Als Ich alles komplett ohne GML gemacht habe, habe ich eine unglaubliche fps von 1200 bei 10000 Dreiecken erzielt, aber leider Bugy weil C nicht richtig zwei dimensionale Arrays unterstützt.
Es war eigentlich der Plan gleich C++ zu nehemen, aber genau da gab es Probleme. Es lässt sich zwar alles ohne Fehler Compilern und die DLL wird zwar auch erstellt und sieht auch ordentlich aus, aber im Game Maker sieht man garnichts. Nun die Frage ist, was mache ich Falsch sodass es nicht in C++ funktioniert?
Der Header
Spoiler anzeigen
Alles anzeigen
Der Sourcecode
Spoiler anzeigen
Alles anzeigen
Es war eigentlich der Plan gleich C++ zu nehemen, aber genau da gab es Probleme. Es lässt sich zwar alles ohne Fehler Compilern und die DLL wird zwar auch erstellt und sieht auch ordentlich aus, aber im Game Maker sieht man garnichts. Nun die Frage ist, was mache ich Falsch sodass es nicht in C++ funktioniert?
Der Header
Quellcode
- #ifndef _DLL_H_
- #define _DLL_H_
- #if BUILDING_DLL
- # define DLLIMPORT __declspec (dllexport)
- #else /* Not BUILDING_DLL */
- # define DLLIMPORT __declspec (dllimport)
- #endif /* Not BUILDING_DLL */
- DLLIMPORT double point_in_triangle(double x1, double y1, double x2, double y2, double x3, double y3, double xp, double yp);
- DLLIMPORT double convert_prepare(double arg0, double arg1, double arg2, double arg3, double arg4, double arg5, double arg6, double arg7, double arg8, double arg9, double arg10, double arg11);
- DLLIMPORT double convert_3d(double targetx, double targety, double targetz);
- DLLIMPORT double convert_get_x_2d();
- DLLIMPORT double convert_get_y_2d();
- DLLIMPORT double poo_begin();
- DLLIMPORT double poo_vertex(double vertX, double vertY, double vertZ);
- DLLIMPORT double poo_end();
- DLLIMPORT double poo_check(double obj, double pointX, double pointY);
- #endif /* _DLL_H_ */
Der Sourcecode
C-Quellcode
- #include "dll.h"
- #include <windows.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- short sign(double arg)
- {
- if(arg < 0)
- return(-1);
- if(arg == 0)
- return(0);
- if(arg > 0)
- return(1);
- }
- double sqr(double arg)
- {
- return(arg*arg);
- }
- double cam_dX;
- double cam_dY;
- double cam_dZ;
- double cam_uX;
- double cam_uY;
- double cam_uZ;
- double cam_vX;
- double cam_vY;
- double cam_vZ;
- double cam_xfrom;
- double cam_yfrom;
- double cam_zfrom;
- double screen_width;
- double screen_height;
- double tFOV;
- double poo_vertexe_x[0][1023];
- double poo_vertexe_y[0][1023];
- double poo_vertexe_z[0][1023];
- int objektnumber = 0;
- const float pi = 3.14159f;
- double x_2d;
- double y_2d;
- DLLIMPORT double point_in_triangle(double x1, double y1, double x2, double y2, double x3, double y3, double xp, double yp)
- {
- double a = (x1-xp)*(y2-yp)-(x2-xp)*(y1-yp);
- double b = (x2-xp)*(y3-yp)-(x3-xp)*(y2-yp);
- double c = (x3-xp)*(y1-yp)-(x1-xp)*(y3-yp);
- double back;
- if(sign(a) == sign(b) && sign(b) == sign(c))
- back = 1;
- else
- back = 0;
- return(back);
- }
- DLLIMPORT double convert_prepare(double arg0, double arg1, double arg2, double arg3, double arg4, double arg5, double arg6, double arg7, double arg8, double arg9, double arg10, double arg11)
- {
- double mm;
- cam_dX = arg3 - arg0;
- cam_dY = arg4 - arg1;
- cam_dZ = arg5 - arg2;
- mm = sqrt(cam_dX*cam_dX + cam_dY*cam_dY + cam_dZ*cam_dZ);
- cam_dX /= mm;
- cam_dY /= mm;
- cam_dZ /= mm;
- cam_uX = arg6;
- cam_uY = arg7;
- cam_uZ = arg8;
- mm = cam_uX*cam_dX + cam_uY*cam_dY + cam_uZ*cam_dZ;
- cam_uX -= mm*cam_dX;
- cam_uY -= mm*cam_dY;
- cam_uZ -= mm*cam_dZ;
- mm = sqrt(cam_uX*cam_uX + cam_uY*cam_uY + cam_uZ*cam_uZ);
- cam_uX /= mm;
- cam_uY /= mm;
- cam_uZ /= mm;
- tFOV = tan(arg9*pi/360);
- cam_uX *= tFOV;
- cam_uY *= tFOV;
- cam_uZ *= tFOV;
- cam_vX = cam_uY*cam_dZ - cam_dY*cam_uZ;
- cam_vY = cam_uZ*cam_dX - cam_dZ*cam_uX;
- cam_vZ = cam_uX*cam_dY - cam_dX*cam_uY;
- cam_vX *= arg10/arg11;
- cam_vY *= arg10/arg11;
- cam_vZ *= arg10/arg11;
- cam_xfrom = arg0;
- cam_yfrom = arg1;
- cam_zfrom = arg2;
- screen_width = arg10;
- screen_height = arg11;
- return(1);
- }
- DLLIMPORT double convert_3d(double targetx, double targety, double targetz)
- {
- double pX;
- double pY;
- double pZ;
- double mm;
- pX = targetx - cam_xfrom;
- pY = targety - cam_yfrom;
- pZ = targetz - cam_zfrom;
- mm = pX*cam_dX + pY*cam_dY + pZ*cam_dZ;
- if (mm > 0)
- {
- pX /= mm;
- pY /= mm;
- pZ /= mm;
- }
- else
- {
- x_2d = 0;
- y_2d = -100;
- return (0);
- }
- mm = (pX*cam_vX + pY*cam_vY + pZ*cam_vZ) / sqr((screen_width/screen_height)*tan(45*pi/360));
- x_2d = (mm+1)/2*screen_width;
- mm = (pX*cam_uX + pY*cam_uY + pZ*cam_uZ) / sqr(tan(45*pi/360));
- y_2d = (1-mm)/2*screen_height;
- return(1);
- }
- DLLIMPORT double convert_get_x_2d()
- {
- return(x_2d);
- }
- DLLIMPORT double convert_get_y_2d()
- {
- return(y_2d);
- }
- DLLIMPORT double poo_begin()
- {
- poo_vertexe_x[objektnumber][0] = 1;
- poo_vertexe_y[objektnumber][0] = 1;
- poo_vertexe_z[objektnumber][0] = 1;
- return(1);
- }
- DLLIMPORT double poo_vertex(double vertX, double vertY, double vertZ)
- {
- poo_vertexe_x[objektnumber][(int)poo_vertexe_x[objektnumber][0]] = vertX;
- poo_vertexe_y[objektnumber][(int)poo_vertexe_x[objektnumber][0]] = vertY;
- poo_vertexe_z[objektnumber][(int)poo_vertexe_x[objektnumber][0]] = vertZ;
- poo_vertexe_x[objektnumber][0] += 1;
- poo_vertexe_y[objektnumber][0] += 1;
- poo_vertexe_z[objektnumber][0] += 1;
- return(1);
- }
- DLLIMPORT double poo_end()
- {
- objektnumber += 1;
- return(objektnumber - 1);
- }
- DLLIMPORT double poo_check(double obj, double pointX, double pointY)
- {
- double back = 0;
- int objekt;
- double px1;
- double py1;
- double px2;
- double py2;
- double px3;
- double py3;
- objekt = (int)obj;
- int i;
- for(i=1; i<poo_vertexe_x[objekt][0]; i+=3)
- {
- convert_3d(poo_vertexe_x[objekt][i],poo_vertexe_y[objekt][i],poo_vertexe_z[objekt][i]);
- px1 = x_2d;
- py1 = y_2d;
- convert_3d(poo_vertexe_x[objekt][i+1],poo_vertexe_y[objekt][i+1],poo_vertexe_z[objekt][i+1]);
- px2 = x_2d;
- py2 = y_2d;
- convert_3d(poo_vertexe_x[objekt][i+2],poo_vertexe_y[objekt][i+2],poo_vertexe_z[objekt][i+2]);
- px3 = x_2d;
- py3 = y_2d;
- if(point_in_triangle(px1,py1,px2,py2,px3,py3,pointX,pointY))
- {
- back = 1;
- break;
- }
- }
- return(back);
- }
- BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ ,
- DWORD reason /* Reason this function is being called. */ ,
- LPVOID reserved /* Not used. */ )
- {
- switch (reason)
- {
- case DLL_PROCESS_ATTACH:
- break;
- case DLL_PROCESS_DETACH:
- break;
- case DLL_THREAD_ATTACH:
- break;
- case DLL_THREAD_DETACH:
- break;
- }
- /* Returns TRUE on success, FALSE on failure */
- return TRUE;
- }