 
//Use OpenGL
#define EGL_NONE
  
///////////////////////////////////////////////////////////////////// 
// Include and link the library                                    // 
///////////////////////////////////////////////////////////////////// 
 
//Include EDGELIB 
#include "edgemain.h" 
  
//Link the EDGELIB static library 
#pragma comment(lib, "edge.lib") 
  
//Include internal resources 
#include "resource.h" 
////Link the Edge static library
//#pragma comment(lib, "edge.lib")
#include "C:\\Program Files\\Microsoft Visual Studio 8\\VC\\PlatformSDK\\Include\\GL\\gl.h"
#pragma comment(lib, "C:\\projects\\Edge\\lib\\ppc2006-arm\\opengl\\plugin1-0.lib")

///////////////////////////////////////////////////////////////////// 
// Class definition                                                // 
///////////////////////////////////////////////////////////////////// 
  
//The main class 
class ClassMain : public ClassEdge 
{ 
	private:
		E3DSurface block;
		E2DSurface block_tex;
		long zoom;
		unsigned short rotation;
		void DrawModels(ClassEDisplay *display);
    public: 
        ClassMain(void); 
        ~ClassMain(void); 
		ERESULT OnInit(ENATIVETYPE instance);
        ERESULT OnDisplayConfig(EDISPLAYCONFIG *config); 
        ERESULT OnNextFrame(ClassEDisplay *display, unsigned long timedelta); 
		ERESULT OnDisplayInit(ENATIVETYPE instance, ClassEDisplay *display);
        void OnButtonDown(unsigned long bnr, EBUTTONLIST *blist); 
        void OnStylusDown(POINT pnt); 
}; 
  
  
///////////////////////////////////////////////////////////////////// 
// ClassMain: public                                               // 
///////////////////////////////////////////////////////////////////// 
  
//ClassMain: constructor 
ClassMain::ClassMain(void) 
{ 
} 
  
//ClassMain: destructor 
ClassMain::~ClassMain(void) 
{ 
} 
  
//Configure display 
ERESULT ClassMain::OnDisplayConfig(EDISPLAYCONFIG *config) 
{ 
	config->width = 240;
	config->height = 320;
    ClassEStd::StrCpy(config->caption, "Hello World! OnDisplayConfig"); 
	config->orientation = DOR_AUTO;
	config->engineconsole = false;
	return(E_OK);
    //return(E_OK); 
} 
  
//Callback: Called every frame 
ERESULT ClassMain::OnNextFrame(ClassEDisplay *display, unsigned long timedelta) 
{ 
	DrawModels(display);
    display->buffer.DrawFont(0, 0, &display->fontinternal, "Hello World!  OnNextFrame"); 
	//display->Render(&block);
	display->Perspective2D(display->GetWidth(), display->GetHeight(), false);
	display->SetShading(E3D_TEXTURE);
	display->DrawFont(2, 2, &display->fontinternal, GetFPS());
	display->DrawFont(2, display->GetHeight() - display->fontinternal.GetFontHeight() * 2 - 2, &display->fontinternal, "Softkeys: Change shading", EFX_COLORKEY);
	display->DrawFont(2, display->GetHeight() - display->fontinternal.GetFontHeight() - 2, &display->fontinternal, "Model by: www.psionic3d.co.uk", EFX_COLORKEY);
    return(E_OK); 
} 
  
//Callback: Called when the user pressed a key or button 
void ClassMain::OnButtonDown(unsigned long bnr, EBUTTONLIST *blist) 
{ 
    Quit(); 
} 
  
//Callback: Called when the user points the stylus down or clicks the left mouse button 
void ClassMain::OnStylusDown(POINT pnt) 
{ 
    Quit(); 
} 
 
//Callback: Called when the display mode has changed, use this to initialize your surfaces, etc.
ERESULT ClassMain::OnDisplayInit(ENATIVETYPE instance, ClassEDisplay *display)
{
	if (display->CreateSurface(&block_tex, "block.png", EST_READONLYPATH) != E_OK)
		return(E_ERROR);
	display->UploadTexture(&block_tex);
	//Create block model
	if (display->CreateSurface(&block, 20, 10, EST_NOCOLORARRAY) == E_OK)
	{
		//Top
		block.SetPolygon(0, 0, 2, 1);
		block.SetPolygon(1, 1, 2, 3);
		block.SetVertex(0, -2048, 0, -2048); block.SetTexCoord(0, 0, 0);
		block.SetVertex(1,  2048, 0, -2048); block.SetTexCoord(1, 65536, 0);
		block.SetVertex(2, -2048, 0,  2048); block.SetTexCoord(2, 0, 65536);
		block.SetVertex(3,  2048, 0,  2048); block.SetTexCoord(3, 65536, 65536);

		//Front
		block.SetPolygon(2, 4, 6, 5);
		block.SetPolygon(3, 5, 6, 7);
		block.SetVertex(4, -2048, 0, 2048); block.SetTexCoord(4, 0, 0);
		block.SetVertex(5,  2048, 0, 2048); block.SetTexCoord(5, 65536, 0);
		block.SetVertex(6, -2048, 1024, 2048); block.SetTexCoord(6, 0, 32768);
		block.SetVertex(7,  2048, 1024, 2048); block.SetTexCoord(7, 65536, 32768);

		//Back
		block.SetPolygon(4, 8, 9, 10);
		block.SetPolygon(5, 9, 11, 10);
		block.SetVertex(8,  -2048, 0, -2048); block.SetTexCoord(8, 0, 0);
		block.SetVertex(9,   2048, 0, -2048); block.SetTexCoord(9, 65536, 0);
		block.SetVertex(10, -2048, -1024, -2048); block.SetTexCoord(10, 0, 32768);
		block.SetVertex(11,  2048, -1024, -2048); block.SetTexCoord(11, 65536, 32768);

		//Left
		block.SetPolygon(6, 12, 13, 14);
		block.SetPolygon(7, 13, 15, 14);
		block.SetVertex(12, -2048, 0, -2048); block.SetTexCoord(12, 0, 0);
		block.SetVertex(13, -2048, -2048, -2048); block.SetTexCoord(13, 0, 32768);
		block.SetVertex(14, -2048, 0,  2048); block.SetTexCoord(14, 65536, 0);
		block.SetVertex(15, -2048, -2048,  2048); block.SetTexCoord(15, 65536, 32768);

		//Right
		block.SetPolygon(8, 16, 18, 17);
		block.SetPolygon(9, 17, 18, 19);
		block.SetVertex(16, 2048, 0, -2048); block.SetTexCoord(16, 0, 0);
		block.SetVertex(17, 2048, -2024, -2048); block.SetTexCoord(17, 0, 32768);
		block.SetVertex(18, 2048, 0,  2048); block.SetTexCoord(18, 65536, 0);
		block.SetVertex(19, 2048, -1024,  2048); block.SetTexCoord(19, 65536, 32768);

		//Calculate lighting
		block.CalculateNormals();
	}
	else
		return(E_ERROR);

	return(E_OK);
}

//Draw 3D models
void ClassMain::DrawModels(ClassEDisplay *display)
{

	//zoom=zoom+10;
	display->Perspective3D(display->GetWidth(), display->GetHeight());
	display->WorldReset();
	display->WorldTranslate(0, 0, zoom);
	#if !defined(EGL_USEGL)
		display->WorldScale(65536 * 2, 65536 * 2, 65536 * 2);
	#endif
	display->WorldRotate(256, 0, 0);
	display->WorldRotate(0, rotation, 0);
	display->BindTexture(&block_tex);
	display->SetShading(E3D_GOURAUD | E3D_TEXTURE);
	display->Render(&block);
}

ERESULT ClassMain::OnInit(ENATIVETYPE instance)
{
	zoom = -15000;
	return(E_OK);
}

  
///////////////////////////////////////////////////////////////////// 
// The program entry point                                         // 
///////////////////////////////////////////////////////////////////// 
  
ClassEdge *EdgeMain(EDGESTARTUP *data){ return(new ClassMain); } 

