#include <Array.h>
#include <iostream>
#include <Text.h>
#include <Fenster.h>
#include <DateiSystem.h>
#include <MausEreignis.h>
#include <TastaturEreignis.h>
#include <Globals.h>
#include <Bildschirm.h>
#include <RenderThread.h>
#include <Model2D.h>
#include <Bild.h>
#include <MausEreignis.h>
#include <M2Datei.h>
#include <Vec2.h>
#include <TextFeld.h>

using namespace Framework;
Vec2< int > maus;

void FClose( void *p, void *zF )
{
	StopNachrichtenSchleife( ( (WFenster*)zF )->getFensterHandle() );
}

bool FMaus( void *p, void *obj, MausEreignis me )
{
	return 1;
}

bool FTastatur( void *p, void *obj, TastaturEreignis te )
{
	return 1;
}

Bild *b;
Bildschirm *bs;
double durchschnitt = 0;
int anz = 0;


struct Game
{
    int id;
    int gelb;
    int rot;
    short jahrB;
    short jahrE;
    char gewonnen;
    char monB;
    char tagB;
    char stuB;
    char minB;
    char sekB;
    char monE;
    char tagE;
    char stuE;
    char minE;
    char sekE;
    char züge;
};

class Obj : public Zeichnung
{
public:
    Obj()
        : Zeichnung()
    {
        setGröße( 1600, 900 );
    }

    void render( Bild &zRObj )
    {
        zRObj.drawBildSkall( 0, 0, 1600, 900, *b );
        //zRObj.alphaBildSkall( 0, 0, 1600, 900, *b );
    }
};

void renderF( void *p, void *obj, Bild *zrObj )
{
    std::cout << "RenderZeit: " << bs->getRenderZeit() << " Durchschnitt:" << durchschnitt << "\n";
    anz++;
    durchschnitt += (bs->getRenderZeit() - durchschnitt) / anz;
}

int main()
{

    std::cout << sizeof( Game );
    //Sleep( 1000000 );
    //return 0;
	initFramework();

	LTDBDatei bd;
	bd.setDatei( new Text( "test.ltdb" ) );
	bd.leseDaten( 0 );
	//b = bd.laden( 0, new Text( "a.png" ) );

	WFenster *f = new WFenster();
	WNDCLASS fc = F_Normal( 0 );
	fc.lpszClassName = "Test";
	f->erstellen( WS_OVERLAPPEDWINDOW, fc );
	f->setGröße( 1601, 901 );
	f->setVSchließAktion( FClose );
	f->setMausAktion( FMaus );
	f->setTastaturAktion( FTastatur );
	f->setAnzeigeModus( 1 );

	bs = new Bildschirm3D( f->getThis() );
	f->setBildschirm( bs->getThis() );
	bs->setTestRend( 0 );
	//bs->setFüll( 1 );
    bs->setFüllFarbe( 0xFFFFFFFF );

    Obj *obj = new Obj();
    bs->addMember( obj );

	RenderTh *r = new RenderTh();
	r->setBildschirm( bs->getThis() );
	r->setMaxFps( 60 );
	r->setRenderFunktion( renderF );
	r->beginn();

	StartNachrichtenSchleife();

	r->beenden();
	r->release();

	f->setBildschirm( 0 );
	bs->release();
	f->release();
    //b->release();
    delete obj;

	releaseFramework();

	return 0;
}



//#include <sql.h>
//#include <Text.h>
//#include <iostream>
//#include <Fenster.h>
//#include <time.h>
//#include <Datei.h>
//#include <Zeit.h>
//#include <time.h>
//#include <immintrin.h>

//int main()
//{
//    char dir[ 255 ];
//    getcwd( dir, 255 );
//    bool b = DateiExistiert( "Framework.dll" );
//    char *t = new char();
//    t = 0;
//	srand( time( 0 ) );
//	for( int i = 0; i < 20; i++ )
//	{
//		std::cout << rand() % 256 << ", ";
//	}
//	getchar();
//	return 0;
//}


//#include <Array.h>
//#include <iostream>
//#include <Text.h>
//#include <Fenster.h>
//#include <DateiSystem.h>
//#include <MausEreignis.h>
//#include <TastaturEreignis.h>
//#include <Globals.h>
//#include <Bildschirm.h>
//#include <RenderThread.h>
//#include <Model2D.h>
//#include <Bild.h>
//#include <MausEreignis.h>
//#include <M2Datei.h>
//#include <Vec2.h>
//#include <TextFeld.h>
//
//using namespace Framework;
//Vec2< int > maus;
//
//void FClose( void *p, void *zF )
//{
//	StopNachrichtenSchleife( ( (WFenster*)zF )->getFensterHandle() );
//}
//
//bool FMaus( void *p, void *obj, MausEreignis me )
//{
//	maus = Vec2< int >( me.mx, me.my );
//	if( me.id == ME_Bewegung && !( ( (Model2D*)p )->istPunktInnen( Punkt( me.mx, me.my ) ) ) )
//		( (Model2D*)p )->setFarbe( 0xFFFF0000 );
//	return 1;
//}
//
//bool M2Maus( void *p, void *obj, MausEreignis me )
//{
//	( (Model2D*)obj )->setFarbe( 0xFF00FF00 );
//	if( getMausStand( M_Links ) )
//		( (Model2D*)obj )->addDrehung( 0.01f );
//	if( getMausStand( M_Rechts ) )
//		( (Model2D*)obj )->addDrehung( -0.01f );
//	if( me.id == ME_UScroll )
//		( (Model2D*)obj )->addGröße( 0.01f );
//	if( me.id == ME_DScroll )
//		( (Model2D*)obj )->addGröße( -0.01f );
//	( (Model2D*)obj )->setPosition( me.rmx, me.rmy );
//	return 1;
//}
//
//bool FTastatur( void *p, void *obj, TastaturEreignis te )
//{
//	if( getTastenStand( T_Oben ) )
//		( (Model2D*)p )->setPosition( ( (Model2D*)p )->getX(), ( (Model2D*)p )->getY() - 1 );
//	if( getTastenStand( T_Rechts ) )
//		( (Model2D*)p )->setPosition( ( (Model2D*)p )->getX() + 1, ( (Model2D*)p )->getY() );
//	if( getTastenStand( T_Unten ) )
//		( (Model2D*)p )->setPosition( ( (Model2D*)p )->getX(), ( (Model2D*)p )->getY() + 1 );
//	if( getTastenStand( T_Links ) )
//		( (Model2D*)p )->setPosition( ( (Model2D*)p )->getX() - 1, ( (Model2D*)p )->getY() );
//	return 1;
//}
//
//char getOutCode( Punkt& p, Bild *zrObj )
//{
//	char ret = 0;
//	if( p.x < 0 )
//		ret |= 1;
//	else if( p.x >= zrObj->getBreite() )
//		ret |= 2;
//	if( p.y < 0 )
//		ret |= 4;
//	else if( p.y >= zrObj->getHöhe() )
//		ret |= 8;
//	return ret;
//}
//
//Bild b;
//
//void renderF( void *p, void *obj, Bild *zrObj )
//{
//	zrObj->setFarbe( 0 );
//}
//
//int main()
//{
//	initFramework();
//
//	LTDBDatei bd;
//	bd.setDatei( new Text( "ship.ltdb" ) );
//	bd.leseDaten( 0 );
//	Bild *sb = bd.laden( 0, new Text( "ship.png" ) );
//	b.neuBild( sb->getBreite(), sb->getHöhe(), 0 );
//	int farbe = 0xFF55FF55;
//	int maxP = b.getBreite() * b.getHöhe();
//	int *buffer = sb->getBuffer();
//	for( int i = 0; i < maxP; i++ )
//	{
//		if( buffer[ i ] )
//		{
//			b.setPixelDP( i, ( buffer[ i ] & 0xFF000000 ) | ( farbe & 0x00FFFFFF ) );
//			b.alphaPixelDP( i, buffer[ i ] );
//		}
//	}
//	sb->release();
//
//
//	Model2D *test = new Model2D();
//	test->setFarbe( 0xFFFFFFFF );
//	test->setStyle( M2_Style::Sichtbar | /*M2_Style::Rahmen |*/ M2_Style::Textur );
//	M2Datei m2d;
//	m2d.setPfad( "ship.m2" );
//	m2d.leseDaten();
//	Model2DData *model = m2d.ladeModel( "a" );
//	test->setTextur( b.getThis() );
//	test->setModel( model );
//	test->setMausEreignis( M2Maus );
//	test->setPosition( 450, 350 );
//
//	WFenster *f = new WFenster();
//	WNDCLASS fc = F_Normal( 0 );
//	fc.lpszClassName = "Test";
//	f->erstellen( WS_OVERLAPPEDWINDOW, fc );
//	f->setGröße( 900, 700 );
//	f->setVSchließAktion( FClose );
//	f->setMausAktion( FMaus );
//	f->setMausEreignisParameter( test );
//	f->setTastaturEreignisParameter( test );
//	f->setTastaturAktion( FTastatur );
//	f->setAnzeigeModus( 1 );
//
//	Bildschirm *b = new Bildschirm( f->getThis() );
//	f->setBildschirm( b->getThis() );
//	b->setTestRend( 0 );
//	b->setFüll( 0 );
//	b->addMember( test );
//
//	RenderTh *r = new RenderTh();
//	r->setBildschirm( b->getThis() );
//	r->setMaxFps( 60 );
//	r->setRenderFunktion( renderF );
//	r->beginn();
//
//	StartNachrichtenSchleife();
//
//	r->beenden();
//	r->release();
//	test->release();
//
//	f->setBildschirm( 0 );
//	b->release();
//	f->release();
//
//	releaseFramework();
//
//	return 0;
//}

//#include <time.h>
//#include <iostream>
//#include <Zeit.h>
//#include <Bild.h>
//#include <Text.h>
//using namespace Framework;
//#include <GSLSoundV.h>
//
//using namespace std;
//
//#include <iostream>
//#include <Fenster.h>
//#include <Bildschirm.h>
//#include <RenderThread.h>
//#include <KSGScript.h>
//#include <MausEreignis.h>
//#include <TastaturEreignis.h>
//#include <Schrift.h>
//#include <DateiSystem.h>
//#include <time.h>
//#include <Textfeld.h>
//#include <Datei.h>
//
//namespace Framework
//{
//	void initFramework();
//	void releaseFramework();
//}
//
//using namespace Framework;
//using namespace KSGScript;
//
//KSGScriptObj *obj;
//
//void FClose( void *p, void *zF )
//{
//	StopNachrichtenSchleife( ( (WFenster*)zF )->getFensterHandle() );
//}
//
//void ksgsRückruf( void *p, RCArray< KSGSVariable > *param, KSGSVariable **ret )
//{
//    int i = 0;
//}
//
//int main()
//{
//#ifdef _DEBUG
//	_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
//#endif
//	srand( (int)time( 0 ) );
//	initFramework();
//	WFenster *f = new WFenster();
//	WNDCLASS fc = F_Normal( 0 );
//	fc.lpszClassName = "Test";
//	f->erstellen( WS_OVERLAPPEDWINDOW, fc );
//	f->setGröße( 900, 700 );
//	f->setVSchließAktion( FClose );
//	f->setMausAktion( _ret1ME );
//	f->setTastaturAktion( _ret1TE );
//	f->setAnzeigeModus( 1 );
//	Bildschirm *b = new Bildschirm( f->getThis() );
//	f->setBildschirm( b->getThis() );
//
//	LTDSDatei *sd = new LTDSDatei();
//	sd->setPfad( new Text( "normal.ltds" ) );
//	sd->leseDaten();
//	Schrift *s = sd->ladeSchrift();
//	sd->release();
//
//	HINSTANCE dll = LoadLibrary( "KSGScript.dll" );
//	KSGSGetObjekt func = (KSGSGetObjekt)GetProcAddress( dll, KSGS_START_FUNKTION );
//	KSGSGetVariable vars = (KSGSGetVariable)GetProcAddress( dll, KSGS_VARIABLE_FUNKTION );
//	obj = func();
//	obj->setSchriftZ( s->getThis() );
//	obj->setBildschirmZ( b->getThis() );
//	obj->setScriptDatei( "tmp.cpp" );
//	obj->setPosition( 0, 0 );
//	obj->setGröße( 600, 600 );
//	obj->setRückrufParam( vars );
//	obj->setRückrufFunktion( ksgsRückruf );
//	obj->neuLaden();
//	b->addMember( obj );
//	b->update();
//	RenderTh *r = new RenderTh();
//	r->setBildschirm( b->getThis() );
//	r->setMaxFps( 60 );
//	r->beginn();
//	StartNachrichtenSchleife();
//	r->beenden();
//	r->release();
//	obj->zurücksetzen();
//	Sleep( 100 );
//	b->removeMember( obj );
//	obj->release();
//	//FreeLibrary( dll );
//	f->setBildschirm( 0 );
//	b->release();
//	f->release();
//	s->release();
//	releaseFramework();
//	return 0;
//}
//
//#include <ShObjIdl.h>
//#include <Windows.h>
//#include <iostream>
//
//#pragma comment( lib, "Ole32.lib" )
//#pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")	
//
//int main()
//{
//    int i = 0;
//    int j = 0;
//    int p = -2500;
//    while( j < 100000000 )
//    {
//        j += p;
//        p += 9;
//        if( p >= 0 && p < 9 )
//            std::cout << i << "\n";
//        i++;
//    }
//    std::cout << i << " " << j << " " << p << "\n";
//    Sleep( 100000 );
//    int län = 100 * 100 * 4;
//    for( int i = 0, l = län > 2048 ? 2048 : län; län > 0; i += l, län -= l, l = län > 2048 ? 2048 : län )
//    {       
//        std::cout << "i:" << i << "\n";
//        std::cout << "l:" << l << "\n";
//        std::cout << "län:" << län << "\n\n";
//    }
//    // CoCreate the File Open Dialog object.
//    IFileDialog *pfd = NULL;
//    CoInitialize( NULL );
//    HRESULT hr = CoCreateInstance( CLSID_FileOpenDialog,
//                                   NULL,
//                                   CLSCTX_INPROC_SERVER,
//                                   IID_PPV_ARGS( &pfd ) );
//    if( SUCCEEDED( hr ) )
//    {
//        // Create an event handling object, and hook it up to the dialog.
//        //IFileDialogEvents *pfde = NULL;
//        //hr = CDialogEventHandler_CreateInstance( IID_PPV_ARGS( &pfde ) );
//        if( SUCCEEDED( hr ) )
//        {
//            // Hook up the event handler.
//            //DWORD dwCookie;
//            //hr = pfd->Advise( pfde, &dwCookie );
//            if( SUCCEEDED( hr ) )
//            {
//                // Set the options on the dialog.
//                DWORD dwFlags;
//
//                // Before setting, always get the options first in order 
//                // not to override existing options.
//                hr = pfd->GetOptions( &dwFlags );
//                if( SUCCEEDED( hr ) )
//                {
//                    // In this case, get shell items only for file system items.
//                    hr = pfd->SetOptions( dwFlags | FOS_FORCEFILESYSTEM );
//                    if( SUCCEEDED( hr ) )
//                    {
//                        // Set the file types to display only. 
//                        // Notice that this is a 1-based array.
//                        COMDLG_FILTERSPEC c_rgSaveTypes[] =
//                        {
//                            { L"szJPG", L"*.jpg;*.jpeg" },
//                            { L"szPNG", L"*.png" },
//                            { L"szAll", L"*.*" },
//                        };
//                        hr = pfd->SetFileTypes( ARRAYSIZE( c_rgSaveTypes ), c_rgSaveTypes );
//                        if( SUCCEEDED( hr ) )
//                        {
//                            // Set the selected file type index to Word Docs for this example.
//                            hr = pfd->SetFileTypeIndex( 3 );
//                            if( SUCCEEDED( hr ) )
//                            {
//                                // Set the default extension to be ".doc" file.
//                                hr = pfd->SetDefaultExtension( L"jpg;jpeg;png" );
//                                if( SUCCEEDED( hr ) )
//                                {
//                                    // Show the dialog
//                                    hr = pfd->Show( NULL );
//                                    if( SUCCEEDED( hr ) )
//                                    {
//                                        // Obtain the result once the user clicks 
//                                        // the 'Open' button.
//                                        // The result is an IShellItem object.
//                                        IShellItem *psiResult;
//                                        hr = pfd->GetResult( &psiResult );
//                                        if( SUCCEEDED( hr ) )
//                                        {
//                                            // We are just going to print out the 
//                                            // name of the file for sample sake.
//                                            PWSTR pszFilePath = NULL;
//                                            hr = psiResult->GetDisplayName( SIGDN_FILESYSPATH,
//                                                                            &pszFilePath );
//                                            if( SUCCEEDED( hr ) )
//                                            {
//                                                
//                                            }
//                                            psiResult->Release();
//                                        }
//                                    }
//                                }
//                            }
//                        }
//                    }
//                }
//                // Unhook the event handler.
//                //pfd->Unadvise( dwCookie );
//            }
//            //pfde->Release();
//        }
//        pfd->Release();
//    }
//    return hr;
//}