#include "StdAfx.h"
#include "../eterlib/Camera.h"
#include "../EterLib/TextBar.h"

#include <shlobj.h>

PyObject* grpCreateTextBar(PyObject* poSelf, PyObject* poArgs)
{
	int iWidth;
	if (!PyTuple_GetInteger(poArgs, 0, &iWidth))
		return Py_BuildException();
	int iHeight;
	if (!PyTuple_GetInteger(poArgs, 1, &iHeight))
		return Py_BuildException();

	CTextBar * pTextBar = new CTextBar(12, false);
	if (!pTextBar->Create(NULL, iWidth, iHeight))
	{
		delete pTextBar;
		return Py_BuildValue("i", NULL);
	}

	return Py_BuildValue("i", pTextBar);
}

PyObject* grpCreateBigTextBar(PyObject* poSelf, PyObject* poArgs)
{
	int iWidth;
	if (!PyTuple_GetInteger(poArgs, 0, &iWidth))
		return Py_BuildException();
	int iHeight;
	if (!PyTuple_GetInteger(poArgs, 1, &iHeight))
		return Py_BuildException();

	int iFontSize;
	if (!PyTuple_GetInteger(poArgs, 2, &iFontSize))
		return Py_BuildException();

	CTextBar * pTextBar = new CTextBar(iFontSize, true);
	if (!pTextBar->Create(NULL, iWidth, iHeight))
	{
		delete pTextBar;
		return Py_BuildValue("i", NULL);
	}

	return Py_BuildValue("i", pTextBar);
}

PyObject* grpDestroyTextBar(PyObject* poSelf, PyObject* poArgs)
{
	int iHandle;
	if (!PyTuple_GetInteger(poArgs, 0, &iHandle))
		return Py_BuildException();

	CTextBar * pTextBar = (CTextBar *)iHandle;
	delete pTextBar;

	return Py_BuildNone();
}

PyObject* grpRenderTextBar(PyObject* poSelf, PyObject* poArgs)
{
	int iHandle;
	if (!PyTuple_GetInteger(poArgs, 0, &iHandle))
		return Py_BuildException();
	int ix;
	if (!PyTuple_GetInteger(poArgs, 1, &ix))
		return Py_BuildException();
	int iy;
	if (!PyTuple_GetInteger(poArgs, 2, &iy))
		return Py_BuildException();

	CTextBar * pTextBar = (CTextBar *)iHandle;
	if (pTextBar)
		pTextBar->Render(ix, iy);

	return Py_BuildNone();
}

PyObject* grpTextBarSetTextColor(PyObject* poSelf, PyObject* poArgs)
{
	int iHandle;
	if (!PyTuple_GetInteger(poArgs, 0, &iHandle))
		return Py_BuildException();
	int r;
	if (!PyTuple_GetInteger(poArgs, 1, &r))
		return Py_BuildException();
	int g;
	if (!PyTuple_GetInteger(poArgs, 2, &g))
		return Py_BuildException();
	int b;
	if (!PyTuple_GetInteger(poArgs, 3, &b))
		return Py_BuildException();
	
	CTextBar * pTextBar = (CTextBar *)iHandle;
	if (pTextBar)
		pTextBar->SetTextColor(r, g, b);

	return Py_BuildNone();
}

PyObject* grpTextBarGetTextExtent(PyObject* poSelf, PyObject* poArgs)
{
	int iHandle;
	if (!PyTuple_GetInteger(poArgs, 0, &iHandle))
		return Py_BuildException();
	char * szText;
	if (!PyTuple_GetString(poArgs, 1, &szText))
		return Py_BuildException();

	SIZE size = {0, 0};
	CTextBar * pTextBar = (CTextBar *)iHandle;
	if (pTextBar)
		pTextBar->GetTextExtent(szText, &size);

	return Py_BuildValue("ii", size.cx, size.cy);
}

PyObject* grpTextBarTextOut(PyObject* poSelf, PyObject* poArgs)
{
	int iHandle;
	if (!PyTuple_GetInteger(poArgs, 0, &iHandle))
		return Py_BuildException();
	int ix;
	if (!PyTuple_GetInteger(poArgs, 1, &ix))
		return Py_BuildException();
	int iy;
	if (!PyTuple_GetInteger(poArgs, 2, &iy))
		return Py_BuildException();
	char * szText;
	if (!PyTuple_GetString(poArgs, 3, &szText))
		return Py_BuildException();

	CTextBar * pTextBar = (CTextBar *)iHandle;
	if (pTextBar)
		pTextBar->TextOut(ix, iy, szText);

	return Py_BuildNone();
}

PyObject* grpClearTextBar(PyObject* poSelf, PyObject* poArgs)
{
	int iHandle;
	if (!PyTuple_GetInteger(poArgs, 0, &iHandle))
		return Py_BuildException();

	CTextBar * pTextBar = (CTextBar *)iHandle;
	if (pTextBar)
		pTextBar->ClearBar();

	return Py_BuildNone();
}

PyObject* grpSetTextBarClipRect(PyObject* poSelf, PyObject* poArgs)
{
	int iHandle;
	if (!PyTuple_GetInteger(poArgs, 0, &iHandle))
		return Py_BuildException();
	int isx;
	if (!PyTuple_GetInteger(poArgs, 1, &isx))
		return Py_BuildException();
	int isy;
	if (!PyTuple_GetInteger(poArgs, 2, &isy))
		return Py_BuildException();
	int iex;
	if (!PyTuple_GetInteger(poArgs, 3, &iex))
		return Py_BuildException();
	int iey;
	if (!PyTuple_GetInteger(poArgs, 4, &iey))
		return Py_BuildException();

	CTextBar * pTextBar = (CTextBar *)iHandle;
	if (pTextBar)
	{
		RECT rect;
		rect.left = isx;
		rect.top = isy;
		rect.right = iex;
		rect.bottom = iey;

		pTextBar->SetClipRect(rect);
	}

	return Py_BuildNone();
}

PyObject* grpCulling(PyObject* poSelf, PyObject* poArgs)
{
	CCullingManager::Instance().Process();
	return Py_BuildNone();
}

PyObject* grpInitScreenEffect(PyObject* poSelf, PyObject* poArgs)
{
	CPythonGraphic::Instance().InitScreenEffect();
	return Py_BuildNone();
}

PyObject* grpClearDepthBuffer(PyObject* poSelf, PyObject* poArgs)
{
	CPythonGraphic::Instance().ClearDepthBuffer();
	return Py_BuildNone();
}

PyObject* grpPushState(PyObject* poSelf, PyObject* poArgs)
{
	CPythonGraphic::Instance().PushState();
	return Py_BuildNone();
}

PyObject* grpPopState(PyObject* poSelf, PyObject* poArgs)
{
	CPythonGraphic::Instance().PopState();
	return Py_BuildNone();
}

PyObject* grpPushMatrix(PyObject* poSelf, PyObject* poArgs)
{
	CPythonGraphic::Instance().PushMatrix();
	return Py_BuildNone();
}

PyObject* grpPopMatrix(PyObject* poSelf, PyObject* poArgs)
{
	CPythonGraphic::Instance().PopMatrix();
	return Py_BuildNone();
}

PyObject* grpTranslate(PyObject* poSelf, PyObject* poArgs)
{
	float x;
	if (!PyTuple_GetFloat(poArgs, 0, &x))
		return Py_BuildException("grp.Translate:Wrong X");

	float y;
	if (!PyTuple_GetFloat(poArgs, 1, &y))
		return Py_BuildException("grp.Translate:Wrong Y");

	float z;
	if (!PyTuple_GetFloat(poArgs, 2, &z))
		return Py_BuildException("grp.Translate:Wrong Z");

	CPythonGraphic::Instance().Translate(x, y, z);

	return Py_BuildNone();
}

PyObject* grpRotate(PyObject* poSelf, PyObject* poArgs)
{
	float Degree;
	if (!PyTuple_GetFloat(poArgs, 0, &Degree))
		return Py_BuildException();

	float x;
	if (!PyTuple_GetFloat(poArgs, 1, &x))
		return Py_BuildException();

	float y;
	if (!PyTuple_GetFloat(poArgs, 2, &y))
		return Py_BuildException();

	float z;
	if (!PyTuple_GetFloat(poArgs, 3, &z))
		return Py_BuildException();

	CPythonGraphic::Instance().Rotate(Degree, x, y, z);

	return Py_BuildNone();
}

PyObject * grpSetColorRenderState(PyObject* poSelf, PyObject* poArgs)
{
	return Py_BuildNone();
}

PyObject* grpSetAroundCamera(PyObject* poSelf, PyObject* poArgs)
{
	float distance;
	if (!PyTuple_GetFloat(poArgs, 0, &distance))
		return Py_BuildException();

	float pitch;	
	if (!PyTuple_GetFloat(poArgs, 1, &pitch))
		return Py_BuildException();

	float roll;
	if (!PyTuple_GetFloat(poArgs, 2, &roll))
		return Py_BuildException();
	
	float lookAtZ;
	if (!PyTuple_GetFloat(poArgs, 3, &lookAtZ))
		return Py_BuildException();

	CPythonGraphic::Instance().SetAroundCamera(distance, pitch, roll, lookAtZ);
	return Py_BuildNone();
}

PyObject* grpSetPositionCamera(PyObject* poSelf, PyObject* poArgs)
{
	float fx;
	if (!PyTuple_GetFloat(poArgs, 0, &fx))
		return Py_BuildException();

	float fy;	
	if (!PyTuple_GetFloat(poArgs, 1, &fy))
		return Py_BuildException();

	float fz;
	if (!PyTuple_GetFloat(poArgs, 2, &fz))
		return Py_BuildException();
	
	float distance;
	if (!PyTuple_GetFloat(poArgs, 3, &distance))
		return Py_BuildException();

	float pitch;
	if (!PyTuple_GetFloat(poArgs, 4, &pitch))
		return Py_BuildException();
	
	float roll;
	if (!PyTuple_GetFloat(poArgs, 5, &roll))
		return Py_BuildException();

	CPythonGraphic::Instance().SetPositionCamera(fx, fy, fz, distance, pitch, roll);
	return Py_BuildNone();
}

PyObject* grpSetEyeCamera(PyObject* poSelf, PyObject* poArgs)
{
	float xEye;
	if (!PyTuple_GetFloat(poArgs, 0, &xEye))
		return Py_BuildException();

	float yEye;	
	if (!PyTuple_GetFloat(poArgs, 1, &yEye))
		return Py_BuildException();

	float zEye;
	if (!PyTuple_GetFloat(poArgs, 2, &zEye))
		return Py_BuildException();
	
	float xCenter;
	if (!PyTuple_GetFloat(poArgs, 3, &xCenter))
		return Py_BuildException();

	float yCenter;	
	if (!PyTuple_GetFloat(poArgs, 4, &yCenter))
		return Py_BuildException();

	float zCenter;
	if (!PyTuple_GetFloat(poArgs, 5, &zCenter))
		return Py_BuildException();
	
	float xUp;
	if (!PyTuple_GetFloat(poArgs, 6, &xUp))
		return Py_BuildException();

	float yUp;
	if (!PyTuple_GetFloat(poArgs, 7, &yUp))
		return Py_BuildException();

	float zUp;
	if (!PyTuple_GetFloat(poArgs, 8, &zUp))
		return Py_BuildException();

	CPythonGraphic::Instance().SetEyeCamera(xEye, yEye, zEye, xCenter, yCenter, zCenter, xUp, yUp, zUp);
	return Py_BuildNone();
}


PyObject* grpSetPerspective(PyObject* poSelf, PyObject* poArgs)
{
	float fov;
	if (!PyTuple_GetFloat(poArgs, 0, &fov))
		return Py_BuildException();

	float aspect;	
	if (!PyTuple_GetFloat(poArgs, 1, &aspect))
		return Py_BuildException();

	float zNear;
	if (!PyTuple_GetFloat(poArgs, 2, &zNear))
		return Py_BuildException();

	float zFar;
	if (!PyTuple_GetFloat(poArgs, 3, &zFar))
		return Py_BuildException();
	
	CPythonGraphic::Instance().SetPerspective(fov, aspect, zNear, zFar);
	return Py_BuildNone();
}


PyObject* grpSetOrtho2D(PyObject* poSelf, PyObject* poArgs)
{
	float width;
	if (!PyTuple_GetFloat(poArgs, 0, &width))
		return Py_BuildException();

	float height;
	if (!PyTuple_GetFloat(poArgs, 1, &height))
		return Py_BuildException();

	float length;
	if (!PyTuple_GetFloat(poArgs, 2, &length))
		return Py_BuildException();

	CPythonGraphic::Instance().SetOrtho2D(width, height, length);
	return Py_BuildNone();
}


PyObject* grpSetOrtho3D(PyObject* poSelf, PyObject* poArgs)
{
	float width;
	if (!PyTuple_GetFloat(poArgs, 0, &width))
		return Py_BuildException();

	float height;
	if (!PyTuple_GetFloat(poArgs, 1, &height))
		return Py_BuildException();

	float zmin;
	if (!PyTuple_GetFloat(poArgs, 2, &zmin))
		return Py_BuildException();

	float zmax;
	if (!PyTuple_GetFloat(poArgs, 3, &zmax))
		return Py_BuildException();

	CPythonGraphic::Instance().SetOrtho3D(width, height, zmin, zmax);
	return Py_BuildNone();
}


PyObject* grpGenerateColor(PyObject* poSelf, PyObject* poArgs)
{
	float r;
	if (!PyTuple_GetFloat(poArgs, 0, &r))
		return Py_BuildException();

	float g;
	if (!PyTuple_GetFloat(poArgs, 1, &g))
		return Py_BuildException();

	float b;
	if (!PyTuple_GetFloat(poArgs, 2, &b))
		return Py_BuildException();

	float a;
	if (!PyTuple_GetFloat(poArgs, 3, &a))
		return Py_BuildException();
	
	return Py_BuildValue("l", CPythonGraphic::Instance().GenerateColor(r, g, b, a));
}

PyObject* grpSetColor(PyObject* poSelf, PyObject* poArgs)
{
	int color;
	if (!PyTuple_GetInteger(poArgs, 0, &color))
		return Py_BuildException();

	CPythonGraphic::Instance().SetDiffuseColor(DWORD(color));
	return Py_BuildNone();
}

PyObject* grpSetAlpha(PyObject* poSelf, PyObject* poArgs)
{
	float Alpha;
	if (!PyTuple_GetFloat(poArgs, 0, &Alpha))
		return Py_BuildException();

	//CPythonGraphic::Instance().SetAlpha(Alpha);
	return Py_BuildNone();
}

PyObject* grpGetCursorPosition3d(PyObject * poSelf, PyObject * poArgs)
{
	float x, y, z;
	CPythonGraphic::Instance().GetCursorPosition(&x, &y, &z);
	return Py_BuildValue("(fff)", x, y, z);
}

PyObject* grpSetCursorPosition(PyObject * poSelf, PyObject * poArgs)
{
	int ix;
	if (!PyTuple_GetInteger(poArgs, 0, &ix))
		return Py_BuildException();
	int iy;
	if (!PyTuple_GetInteger(poArgs, 1, &iy))
		return Py_BuildException();

	CPythonGraphic::Instance().SetCursorPosition(ix, iy);
	return Py_BuildNone();
}

PyObject* grpRenderLine(PyObject* poSelf, PyObject* poArgs)
{
	int x;
	if (!PyTuple_GetInteger(poArgs, 0, &x))
		return Py_BuildException();

	int y;
	if (!PyTuple_GetInteger(poArgs, 1, &y))
		return Py_BuildException();

	int width;
	if (!PyTuple_GetInteger(poArgs, 2, &width))
		return Py_BuildException();

	int height;
	if (!PyTuple_GetInteger(poArgs, 3, &height))
		return Py_BuildException();

	CPythonGraphic::Instance().RenderLine2d((float) x, (float) y, (float) x+width, (float) y+height);
	return Py_BuildNone();
}

PyObject* grpRenderRoundBox(PyObject* poSelf, PyObject* poArgs)
{
	int x;
	if (!PyTuple_GetInteger(poArgs, 0, &x))
		return Py_BuildException();

	int y;
	if (!PyTuple_GetInteger(poArgs, 1, &y))
		return Py_BuildException();

	int width;
	if (!PyTuple_GetInteger(poArgs, 2, &width))
		return Py_BuildException();

	int height;
	if (!PyTuple_GetInteger(poArgs, 3, &height))
		return Py_BuildException();

	float fx = float(x);
	float fy = float(y);
	float fWidth = float(width);
	float fHeight = float(height);

	CPythonGraphic::Instance().RenderLine2d(fx+2.0f, fy, fx+2.0f + (fWidth-3.0f), fy);
	CPythonGraphic::Instance().RenderLine2d(fx+2.0f, fy+fHeight, fx+2.0f + (fWidth-3.0f), fy+fHeight);
	CPythonGraphic::Instance().RenderLine2d(fx, fy+2.0f, fx, fy+2.0f + fHeight-4.0f);
	CPythonGraphic::Instance().RenderLine2d(fx+fWidth, fy+1.0f, fx+fWidth, fy+1.0f + fHeight-3.0f);
	CPythonGraphic::Instance().RenderLine2d(fx, fy+2.0f, fx+2.0f, fy);
	CPythonGraphic::Instance().RenderLine2d(fx, fy+fHeight-2.0f, fx+2.0f, fy+fHeight);
	CPythonGraphic::Instance().RenderLine2d(fx+fWidth-2.0f, fy, fx+fWidth, fy+2.0f);
	CPythonGraphic::Instance().RenderLine2d(fx+fWidth-2.0f, fy+fHeight, fx+fWidth, fy+fHeight-2.0f);
	return Py_BuildNone();
}

PyObject* grpRenderBox(PyObject* poSelf, PyObject* poArgs)
{
	int x;
	if (!PyTuple_GetInteger(poArgs, 0, &x))
		return Py_BuildException();

	int y;
	if (!PyTuple_GetInteger(poArgs, 1, &y))
		return Py_BuildException();

	int width;
	if (!PyTuple_GetInteger(poArgs, 2, &width))
		return Py_BuildException();

	int height;
	if (!PyTuple_GetInteger(poArgs, 3, &height))
		return Py_BuildException();

	CPythonGraphic::Instance().RenderBox2d((float) x, (float) y, (float) x+width, (float) y+height);
	return Py_BuildNone();
}

PyObject* grpRenderBar(PyObject* poSelf, PyObject* poArgs)
{
	int x;
	if (!PyTuple_GetInteger(poArgs, 0, &x))
		return Py_BuildException();

	int y;
	if (!PyTuple_GetInteger(poArgs, 1, &y))
		return Py_BuildException();

	int width;
	if (!PyTuple_GetInteger(poArgs, 2, &width))
		return Py_BuildException();

	int height;
	if (!PyTuple_GetInteger(poArgs, 3, &height))
		return Py_BuildException();

	CPythonGraphic::Instance().RenderBar2d((float) x, (float) y, (float) x+width, (float) y+height);
	return Py_BuildNone();
}

PyObject* grpRenderCube(PyObject* poSelf, PyObject* poArgs)
{
	float sx;
	if (!PyTuple_GetFloat(poArgs, 0, &sx))
		return Py_BuildException();

	float sy;
	if (!PyTuple_GetFloat(poArgs, 1, &sy))
		return Py_BuildException();

	float sz;
	if (!PyTuple_GetFloat(poArgs, 2, &sz))
		return Py_BuildException();

	float ex;
	if (!PyTuple_GetFloat(poArgs, 3, &ex))
		return Py_BuildException();

	float ey;
	if (!PyTuple_GetFloat(poArgs, 4, &ey))
		return Py_BuildException();

	float ez;
	if (!PyTuple_GetFloat(poArgs, 5, &ez))
		return Py_BuildException();

	CPythonGraphic::Instance().RenderCube(sx, sy, sz, ex, ey, ez);
	return Py_BuildNone();
}

PyObject* grpRenderBar3d(PyObject* poSelf, PyObject* poArgs)
{
	int sx;
	if (!PyTuple_GetInteger(poArgs, 0, &sx))
		return Py_BuildException();

	int sy;
	if (!PyTuple_GetInteger(poArgs, 1, &sy))
		return Py_BuildException();

	int sz;
	if (!PyTuple_GetInteger(poArgs, 2, &sz))
		return Py_BuildException();

	int ex;
	if (!PyTuple_GetInteger(poArgs, 3, &ex))
		return Py_BuildException();

	int ey;
	if (!PyTuple_GetInteger(poArgs, 4, &ey))
		return Py_BuildException();

	int ez;
	if (!PyTuple_GetInteger(poArgs, 5, &ez))
		return Py_BuildException();

	CPythonGraphic::Instance().RenderBar3d(sx, sy, sz, ex, ey, ez);
	return Py_BuildNone();
}

PyObject * grpRenderGradationBar(PyObject* poSelf, PyObject* poArgs)
{
	int x;
	if (!PyTuple_GetInteger(poArgs, 0, &x))
		return Py_BadArgument();

	int y;
	if (!PyTuple_GetInteger(poArgs, 1, &y))
		return Py_BadArgument();

	int width;
	if (!PyTuple_GetInteger(poArgs, 2, &width))
		return Py_BadArgument();

	int height;
	if (!PyTuple_GetInteger(poArgs, 3, &height))
		return Py_BadArgument();

	int iStartColor;
	if (!PyTuple_GetInteger(poArgs, 4, &iStartColor))
		return Py_BadArgument();

	int iEndColor;
	if (!PyTuple_GetInteger(poArgs, 5, &iEndColor))
		return Py_BadArgument();

	CPythonGraphic::Instance().RenderGradationBar2d((float)x, (float)y, (float)x+width, (float)y+height, iStartColor, iEndColor);
	return Py_BuildNone();
}

PyObject* grpRenderDownButton(PyObject* poSelf, PyObject* poArgs)
{
	int x;
	if (!PyTuple_GetInteger(poArgs, 0, &x))
		return Py_BuildException();

	int y;
	if (!PyTuple_GetInteger(poArgs, 1, &y))
		return Py_BuildException();

	int width;
	if (!PyTuple_GetInteger(poArgs, 2, &width))
		return Py_BuildException();

	int height;
	if (!PyTuple_GetInteger(poArgs, 3, &height))
		return Py_BuildException();

	CPythonGraphic::Instance().RenderDownButton((float) x, (float) y, (float) x+width, (float) y+height);
	return Py_BuildNone();
}

PyObject* grpRenderUpButton(PyObject* poSelf, PyObject* poArgs)
{
	int x;
	if (!PyTuple_GetInteger(poArgs, 0, &x))
		return Py_BuildException();

	int y;
	if (!PyTuple_GetInteger(poArgs, 1, &y))
		return Py_BuildException();

	int width;
	if (!PyTuple_GetInteger(poArgs, 2, &width))
		return Py_BuildException();

	int height;
	if (!PyTuple_GetInteger(poArgs, 3, &height))
		return Py_BuildException();

	CPythonGraphic::Instance().RenderUpButton((float) x, (float) y, (float) x+width, (float) y+height);
	return Py_BuildNone();
}

PyObject* grpRenderBox3d(PyObject* poSelf, PyObject* poArgs)
{
	float sx;
	if (!PyTuple_GetFloat(poArgs, 0, &sx))
		return Py_BuildException();

	float sy;
	if (!PyTuple_GetFloat(poArgs, 1, &sy))
		return Py_BuildException();

	float sz;
	if (!PyTuple_GetFloat(poArgs, 2, &sz))
		return Py_BuildException();

	float ex;
	if (!PyTuple_GetFloat(poArgs, 3, &ex))
		return Py_BuildException();

	float ey;
	if (!PyTuple_GetFloat(poArgs, 4, &ey))
		return Py_BuildException();

	float ez;
	if (!PyTuple_GetFloat(poArgs, 5, &ez))
		return Py_BuildException();

	CPythonGraphic::Instance().RenderBox3d((float) sx, (float) sy, (float) sz, (float) ex, (float) ey, (float) ez);
	return Py_BuildNone();
}

PyObject * grpSetClearColor(PyObject * poSelf, PyObject * poArgs)
{
	float fr;
	if (!PyTuple_GetFloat(poArgs, 0, &fr))
		return Py_BuildException();

	float fg;
	if (!PyTuple_GetFloat(poArgs, 1, &fg))
		return Py_BuildException();

	float fb;
	if (!PyTuple_GetFloat(poArgs, 2, &fb))
		return Py_BuildException();

	CPythonGraphic::Instance().SetClearColor(fr, fg, fb, 1.0f);
	return Py_BuildNone();
}

PyObject * grpSetDiffuseColor(PyObject * poSelf, PyObject * poArgs)
{
	float r;
	if (!PyTuple_GetFloat(poArgs, 0, &r))
		return Py_BuildException();

	float g;
	if (!PyTuple_GetFloat(poArgs, 1, &g))
		return Py_BuildException();

	float b;
	if (!PyTuple_GetFloat(poArgs, 2, &b))
		return Py_BuildException();

	float a;
	if (!PyTuple_GetFloat(poArgs, 3, &a))
		return Py_BuildException();

	CPythonGraphic::Instance().SetDiffuseColor(r, g, b, a);
	return Py_BuildNone();
}

PyObject * grpIdentity(PyObject * poSelf, PyObject * poArgs)
{
	CPythonGraphic::Instance().Identity();
	return Py_BuildNone();
}

PyObject * grpGetAvailableMemory(PyObject * poSelf, PyObject * poArgs)
{
	int iValue = CPythonGraphic::Instance().GetAvailableMemory();
	return Py_BuildValue("i", iValue);
}

// SCREENSHOT_CWDSAVE
PyObject * grpSaveScreenShotToPath(PyObject * poSelf, PyObject * poArgs)
{
	char * szBasePath;
	if (!PyTuple_GetString(poArgs, 0, &szBasePath))
		return Py_BuildException();

	struct tm * tmNow;
	time_t ct;

	ct = time(0);
	tmNow = localtime(&ct);

	char szPath[MAX_PATH + 256];
	snprintf(szPath, sizeof(szPath), "%s%02d%02d_%02d%02d%02d.jpg", 
			szBasePath,
			tmNow->tm_mon + 1,
			tmNow->tm_mday,
			tmNow->tm_hour,
			tmNow->tm_min,
			tmNow->tm_sec);

	BOOL bResult = CPythonGraphic::Instance().SaveScreenShot(szPath);
	return Py_BuildValue("(is)", bResult, szPath);
}
// END_OF_SCREENSHOT_CWDSAVE

PyObject * grpSaveScreenShot(PyObject * poSelf, PyObject * poArgs)
{
	struct tm * tmNow;
	time_t ct;

	ct = time(0);
	tmNow = localtime(&ct);

	char szPath[MAX_PATH + 256];
	SHGetSpecialFolderPath(NULL, szPath, CSIDL_PERSONAL, TRUE);
	//GetTempPath();
	strcat(szPath, "\\METIN2\\");

	if (-1 == _access(szPath, 0))
		if (!CreateDirectory(szPath, NULL))
		{
			TraceError("Failed to create directory [%s]\n", szPath);
			return Py_BuildValue("(is)", FALSE, "");
		}

	sprintf(szPath + strlen(szPath), "%02d%02d_%02d%02d%02d.jpg", 
			tmNow->tm_mon + 1,
			tmNow->tm_mday,
			tmNow->tm_hour,
			tmNow->tm_min,
			tmNow->tm_sec);

	BOOL bResult = CPythonGraphic::Instance().SaveScreenShot(szPath);
	return Py_BuildValue("(is)", bResult, szPath);
}

PyObject * grpSetGamma(PyObject * poSelf, PyObject * poArgs)
{
	float gamma;

	if (!PyTuple_GetFloat(poArgs, 0, &gamma))
		return Py_BuildException();

	CPythonGraphic::Instance().SetGamma(gamma);
	return Py_BuildNone();
}

PyObject * grpSetInterfaceRenderState(PyObject * poSelf, PyObject * poArgs)
{
	CPythonGraphic::Instance().SetInterfaceRenderState();
	return Py_BuildNone();
}

PyObject * grpSetGameRenderState(PyObject * poSelf, PyObject * poArgs)
{
	CPythonGraphic::Instance().SetGameRenderState();
	return Py_BuildNone();
}

PyObject * grpSetViewport(PyObject * poSelf, PyObject * poArgs)
{
	float fx;
	if (!PyTuple_GetFloat(poArgs, 0, &fx))
		return Py_BuildException();
	float fy;
	if (!PyTuple_GetFloat(poArgs, 1, &fy))
		return Py_BuildException();

	float fWidth;
	if (!PyTuple_GetFloat(poArgs, 2, &fWidth))
		return Py_BuildException();
	float fHeight;
	if (!PyTuple_GetFloat(poArgs, 3, &fHeight))
		return Py_BuildException();

	UINT uWidth;
	UINT uHeight;
	CPythonGraphic::Instance().GetBackBufferSize(&uWidth, &uHeight);
	CPythonGraphic::Instance().SetViewport(fx*uWidth, fy*uHeight, fWidth*uWidth, fHeight*uHeight);
	return Py_BuildNone();
}

PyObject * grpRestoreViewport(PyObject * poSelf, PyObject * poArgs)
{
	CPythonGraphic::Instance().RestoreViewport();
	return Py_BuildNone();
}

PyObject * grpSetOmniLight(PyObject * poSelf, PyObject * poArgs)
{
	CPythonGraphic::Instance().SetOmniLight();
	return Py_BuildNone();
}

PyObject * grpGetCameraPosition(PyObject * poSelf, PyObject * poArgs)
{
	D3DXVECTOR3 v3Eye = CCameraManager::Instance().GetCurrentCamera()->GetEye();
	return Py_BuildValue("fff", v3Eye.x, v3Eye.y, v3Eye.z);
}

PyObject * grpGetTargetPosition(PyObject * poSelf, PyObject * poArgs)
{
	D3DXVECTOR3 v3Target = CCameraManager::Instance().GetCurrentCamera()->GetTarget();
	return Py_BuildValue("fff", v3Target.x, v3Target.y, v3Target.z);
}

void initgrp()
{
	static PyMethodDef s_methods[] =
	{
		{ "InitScreenEffect",			grpInitScreenEffect,			METH_VARARGS },
		{ "Culling",					grpCulling,						METH_VARARGS },
		{ "ClearDepthBuffer",			grpClearDepthBuffer,			METH_VARARGS },
		{ "Identity",					grpIdentity,					METH_VARARGS },
		{ "GenerateColor",				grpGenerateColor,				METH_VARARGS },
		{ "PopState",					grpPopState,					METH_VARARGS },
		{ "PushState",					grpPushState,					METH_VARARGS },
		{ "PushMatrix",					grpPushMatrix,					METH_VARARGS },
		{ "PopMatrix",					grpPopMatrix,					METH_VARARGS },
		{ "Translate",					grpTranslate,					METH_VARARGS },
		{ "Rotate",						grpRotate,						METH_VARARGS },
		{ "SetColorRenderState",		grpSetColorRenderState,			METH_VARARGS },
		{ "SetAroundCamera",			grpSetAroundCamera,				METH_VARARGS },
		{ "SetPositionCamera",			grpSetPositionCamera,			METH_VARARGS },
		{ "SetEyeCamera",				grpSetEyeCamera,				METH_VARARGS },
		{ "SetPerspective",				grpSetPerspective,				METH_VARARGS },
		{ "SetOrtho2d",					grpSetOrtho2D,					METH_VARARGS },
		{ "SetOrtho3d",					grpSetOrtho3D,					METH_VARARGS },
		{ "SetColor",					grpSetColor,					METH_VARARGS },
		{ "SetAlpha",					grpSetAlpha,					METH_VARARGS },
		{ "SetDiffuseColor",			grpSetDiffuseColor,				METH_VARARGS },
		{ "SetClearColor",				grpSetClearColor,				METH_VARARGS },
		{ "GetCursorPosition3d",		grpGetCursorPosition3d,			METH_VARARGS },
		{ "SetCursorPosition",			grpSetCursorPosition,			METH_VARARGS },
		{ "RenderLine",					grpRenderLine,					METH_VARARGS },
		{ "RenderBox",					grpRenderBox,					METH_VARARGS },
		{ "RenderRoundBox",				grpRenderRoundBox,				METH_VARARGS },
		{ "RenderBox3d",				grpRenderBox3d,					METH_VARARGS },
		{ "RenderBar",					grpRenderBar,					METH_VARARGS },
		{ "RenderBar3d",				grpRenderBar3d,					METH_VARARGS },
		{ "RenderGradationBar",			grpRenderGradationBar,			METH_VARARGS },
		{ "RenderCube",					grpRenderCube,					METH_VARARGS },
		{ "RenderDownButton",			grpRenderDownButton,			METH_VARARGS },
		{ "RenderUpButton",				grpRenderUpButton,				METH_VARARGS },
		{ "GetAvailableMemory",			grpGetAvailableMemory,			METH_VARARGS },
		{ "SaveScreenShot",				grpSaveScreenShot,				METH_VARARGS },
		{ "SaveScreenShotToPath",		grpSaveScreenShotToPath,		METH_VARARGS },
		{ "SetGamma",					grpSetGamma,					METH_VARARGS },
		{ "SetInterfaceRenderState",	grpSetInterfaceRenderState,		METH_VARARGS },
		{ "SetGameRenderState",			grpSetGameRenderState,			METH_VARARGS },
		{ "SetViewport",				grpSetViewport,					METH_VARARGS },
		{ "RestoreViewport",			grpRestoreViewport,				METH_VARARGS },
		{ "SetOmniLight",				grpSetOmniLight,				METH_VARARGS },
		{ "GetCameraPosition",			grpGetCameraPosition,			METH_VARARGS },
		{ "GetTargetPosition",			grpGetTargetPosition,			METH_VARARGS },

		{ "CreateTextBar",				grpCreateTextBar,				METH_VARARGS },
		{ "CreateBigTextBar",			grpCreateBigTextBar,			METH_VARARGS },
		{ "DestroyTextBar",				grpDestroyTextBar,				METH_VARARGS },
		{ "RenderTextBar",				grpRenderTextBar,				METH_VARARGS },
		{ "TextBarTextOut",				grpTextBarTextOut,				METH_VARARGS },
		{ "TextBarSetTextColor",		grpTextBarSetTextColor,			METH_VARARGS },
		{ "TextBarGetTextExtent",		grpTextBarGetTextExtent,		METH_VARARGS },
		{ "ClearTextBar",				grpClearTextBar,				METH_VARARGS },
		{ "SetTextBarClipRect",			grpSetTextBarClipRect,			METH_VARARGS },

		{ NULL,							NULL,							NULL		},
	};

	Py_InitModule("grp", s_methods);
}
