// GLUtility.cpp: implementation of the CPGLUtility class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "PGL/PGLUtility.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

CString CPGLUtility::ColorMap2String(PGL_COLORMAP cm)
{
    switch (cm)
    {
    case pglCmHsv:
        return CString("HSV");
    case pglCmJet:
        return CString("Jet");
    case pglCmGray:
        return CString("Gray");
    case pglCmPink:
        return CString("Pink");
    case pglCmCool:
        return CString("Cool");
    case pglCmBone:
        return CString("Bone");
    case pglCmCopper:
        return CString("Copper");
    case pglCmHot:
        return CString("Hot");
    case pglCmAutumn:
        return CString("Autumn");
    case pglCmWinter:
        return CString("Winter");
    case pglCmSpring:
        return CString("Spring");
    case pglCmSummer:
        return CString("Summer");
    default:
        return CString("HSV");
    }
}

PGL_COLORMAP CPGLUtility::String2ColorMap(CString str)
{
    if (str=="HSV")
        return pglCmHsv;

    if (str=="Jet")
        return pglCmJet;
    
    if (str=="Gray")
        return pglCmGray;
    
    if (str=="Pink")
        return pglCmPink;

    if (str=="Cool")
        return pglCmCool;

    if (str=="Bone")
        return pglCmBone;

    if (str=="Copper")
        return pglCmCopper;

    if (str=="Hot")
        return pglCmHot;

    if (str=="Autumn")
        return pglCmAutumn;

    if (str=="Winter")
        return pglCmWinter;

    if (str=="Spring")
        return pglCmSpring;

    if (str=="Summer")
        return pglCmSummer;
    
    return pglCmHsv;
}

#pragma optimize( "", off )

void CPGLUtility::DrawColorMap(gfxinterface::CGfxInterface& gfx, PGL_COLORMAP eCM, CPGLView* pView)
{
    CPGLColor col;
    float w,h;
    float x,y;
    
    x=(float)(pView->GetWidth()-20);
    w=10;
    if (x<1)
        return;

    y=(float)(pView->GetHeight()*0.25);
    h=(float)(pView->GetHeight()*0.5);
/*    
    // drawing colormap
    switch(eCM)
    {
    case pglCmHsv:
        glBegin(GL_QUAD_STRIP);
        // line 0
        HSV(0,col);
        col.MakeCurrent(gfx);
        glVertex2f(x,y);
        glVertex2f(x+w,y);
        // line 1
        HSV(1.0/6.0,col);
        col.MakeCurrent();
        glVertex2f(x,y+h/6.0f);
        glVertex2f(x+w,y+h/6.0f);
        // line 1
        HSV(1.0/3.0,col);
        col.MakeCurrent();
        glVertex2f(x,y+h/3.0f);
        glVertex2f(x+w,y+h/3.0f);
        // line 1
        HSV(0.5f,col);
        col.MakeCurrent();
        glVertex2f(x,y+h*0.5f);
        glVertex2f(x+w,y+h*0.5f);
        // line 1
        HSV(2.0/3.0,col);
        col.MakeCurrent();
        glVertex2f(x,y+h*2.0f/3.0f);
        glVertex2f(x+w,y+h*2.0f/3.0f);
        // line 1
        HSV(5.0/6.0,col);
        col.MakeCurrent();
        glVertex2f(x,y+h*5.0f/6.0f);
        glVertex2f(x+w,y+h*5.0f/6.0f);
        // line 1
        HSV(1.0,col);
        col.MakeCurrent();
        glVertex2f(x,y+h);
        glVertex2f(x+w,y+h);
        glEnd();
        // drawing little triangle...
        HSV(0.5,col);
        col.MakeCurrent();
        glBegin(GL_TRIANGLES);
        glVertex2f(x,y+h*0.5f);
        glVertex2f(x-(float)(w/sqrt(2.0)),y+h*0.5f+w*0.5f);
        glVertex2f(x-(float)(w/sqrt(2.0)),y+h*0.5f-w*0.5f);
        
        glVertex2f(x+w,y+h*0.5f);
        glVertex2f(x+w+(float)(w/sqrt(2.0)),y+h*0.5f-w*0.5f);
        glVertex2f(x+w+(float)(w/sqrt(2.0)),y+h*0.5f+w*0.5f);
        glEnd();
        break;
    case pglCmJet:
        glBegin(GL_QUAD_STRIP);
        // first line
        Jet(0,col);
        col.MakeCurrent();
        glVertex2f(x,y);
        glVertex2f(x+w,y);
        // second line
        Jet(0.125,col);
        col.MakeCurrent();
        glVertex2f(x,y+0.125f*h);
        glVertex2f(x+w,y+0.125f*h);
        // third line
        Jet(0.375,col);
        col.MakeCurrent();
        glVertex2f(x,y+0.375f*h);
        glVertex2f(x+w,y+0.375f*h);
        // fourth line
        Jet(0.625,col);
        col.MakeCurrent();
        glVertex2f(x,y+0.625f*h);
        glVertex2f(x+w,y+0.625f*h);
        // fifth line
        Jet(0.875,col);
        col.MakeCurrent();
        glVertex2f(x,y+0.875f*h);
        glVertex2f(x+w,y+0.875f*h);
        // sixth line
        Jet(1.0,col);
        col.MakeCurrent();
        glVertex2f(x,y+h);
        glVertex2f(x+w,y+h);
        glEnd();
        // drawing little triangle...
        Jet(0.5,col);
        col.MakeCurrent();
        glBegin(GL_TRIANGLES);
        glVertex2f(x,y+h*0.5f);
        glVertex2f(x-(float)(w/sqrt(2.0)),y+h*0.5f+w*0.5f);
        glVertex2f(x-(float)(w/sqrt(2.0)),y+h*0.5f-w*0.5f);
        
        glVertex2f(x+w,y+h*0.5f);
        glVertex2f(x+w+(float)(w/sqrt(2.0)),y+h*0.5f-w*0.5f);
        glVertex2f(x+w+(float)(w/sqrt(2.0)),y+h*0.5f+w*0.5f);
        glEnd();
        break;
    case pglCmGray:
        glBegin(GL_QUAD_STRIP);
        // first line
        Gray(0,col);
        col.MakeCurrent();
        glVertex2f(x,y);
        glVertex2f(x+w,y);
        // second line
        Gray(1.0,col);
        col.MakeCurrent();
        glVertex2f(x,y+h);
        glVertex2f(x+w,y+h);
        glEnd();
        // drawing little triangle...
        Gray(0.5,col);
        col.MakeCurrent();
        glBegin(GL_TRIANGLES);
        glVertex2f(x,y+h*0.5f);
        glVertex2f(x-(float)(w/sqrt(2.0)),y+h*0.5f+w*0.5f);
        glVertex2f(x-(float)(w/sqrt(2.0)),y+h*0.5f-w*0.5f);
        
        glVertex2f(x+w,y+h*0.5f);
        glVertex2f(x+w+(float)(w/sqrt(2.0)),y+h*0.5f-w*0.5f);
        glVertex2f(x+w+(float)(w/sqrt(2.0)),y+h*0.5f+w*0.5f);
        glEnd();
        break;
    case pglCmPink:
        glBegin(GL_QUAD_STRIP);
        // first line
        Pink(0,col);
        col.MakeCurrent();
        glVertex2f(x,y);
        glVertex2f(x+w,y);
        // second line
        Pink(3.0/8.0,col);
        col.MakeCurrent();
        glVertex2f(x,y+3.0f/8.0f*h);
        glVertex2f(x+w,y+3.0f/8.0f*h);
        // line 3
        Pink(3.0/4.0,col);
        col.MakeCurrent();
        glVertex2f(x,y+3.0f/4.0f*h);
        glVertex2f(x+w,y+3.0f/4.0f*h);
        // line 4
        Pink(1.0,col);
        col.MakeCurrent();
        glVertex2f(x,y+h);
        glVertex2f(x+w,y+h);
        glEnd();
        // drawing little triangle...
        Pink(0.5,col);
        col.MakeCurrent();
        glBegin(GL_TRIANGLES);
        glVertex2f(x,y+h*0.5f);
        glVertex2f(x-(float)(w/sqrt(2.0)),y+h*0.5f+w*0.5f);
        glVertex2f(x-(float)(w/sqrt(2.0)),y+h*0.5f-w*0.5f);
        
        glVertex2f(x+w,y+h*0.5f);
        glVertex2f(x+w+(float)(w/sqrt(2.0)),y+h*0.5f-w*0.5f);
        glVertex2f(x+w+(float)(w/sqrt(2.0)),y+h*0.5f+w*0.5f);
        glEnd();
        break;
    case pglCmCool:
        glBegin(GL_QUAD_STRIP);
        // first line
        Cool(0,col);
        col.MakeCurrent();
        glVertex2f(x,y);
        glVertex2f(x+w,y);
        // second line
        Cool(1.0,col);
        col.MakeCurrent();
        glVertex2f(x,y+h);
        glVertex2f(x+w,y+h);
        glEnd();
        // drawing little triangle...
        Cool(0.5,col);
        col.MakeCurrent();
        glBegin(GL_TRIANGLES);
        glVertex2f(x,y+h*0.5f);
        glVertex2f(x-(float)(w/sqrt(2.0)),y+h*0.5f+w*0.5f);
        glVertex2f(x-(float)(w/sqrt(2.0)),y+h*0.5f-w*0.5f);
        
        glVertex2f(x+w,y+h*0.5f);
        glVertex2f(x+w+(float)(w/sqrt(2.0)),y+h*0.5f-w*0.5f);
        glVertex2f(x+w+(float)(w/sqrt(2.0)),y+h*0.5f+w*0.5f);
        glEnd();
        break;
    case pglCmBone:
        glBegin(GL_QUAD_STRIP);
        // first line
        Bone(0,col);
        col.MakeCurrent();
        glVertex2f(x,y);
        glVertex2f(x+w,y);
        // second line
        Bone(3.0/8.0,col);
        col.MakeCurrent();
        glVertex2f(x,y+3.0f/8.0f*h);
        glVertex2f(x+w,y+3.0f/8.0f*h);
        // line 3
        Bone(3.0/4.0,col);
        col.MakeCurrent();
        glVertex2f(x,y+3.0f/4.0f*h);
        glVertex2f(x+w,y+3.0f/4.0f*h);
        // line 4
        Bone(1.0,col);
        col.MakeCurrent();
        glVertex2f(x,y+h);
        glVertex2f(x+w,y+h);
        glEnd();
        // drawing little triangle...
        Bone(0.5,col);
        col.MakeCurrent();
        glBegin(GL_TRIANGLES);
        glVertex2f(x,y+h*0.5f);
        glVertex2f(x-(float)(w/sqrt(2.0)),y+h*0.5f+w*0.5f);
        glVertex2f(x-(float)(w/sqrt(2.0)),y+h*0.5f-w*0.5f);
        
        glVertex2f(x+w,y+h*0.5f);
        glVertex2f(x+w+(float)(w/sqrt(2.0)),y+h*0.5f-w*0.5f);
        glVertex2f(x+w+(float)(w/sqrt(2.0)),y+h*0.5f+w*0.5f);
        glEnd();
        break;
    case pglCmCopper:
        glBegin(GL_QUAD_STRIP);
        // first line
        Copper(0,col);
        col.MakeCurrent();
        glVertex2f(x,y);
        glVertex2f(x+w,y);
        // second line
        Copper(1.0,col);
        col.MakeCurrent();
        glVertex2f(x,y+h);
        glVertex2f(x+w,y+h);
        glEnd();
        // drawing little triangle...
        Copper(0.5,col);
        col.MakeCurrent();
        glBegin(GL_TRIANGLES);
        glVertex2f(x,y+h*0.5f);
        glVertex2f(x-(float)(w/sqrt(2.0)),y+h*0.5f+w*0.5f);
        glVertex2f(x-(float)(w/sqrt(2.0)),y+h*0.5f-w*0.5f);
        
        glVertex2f(x+w,y+h*0.5f);
        glVertex2f(x+w+(float)(w/sqrt(2.0)),y+h*0.5f-w*0.5f);
        glVertex2f(x+w+(float)(w/sqrt(2.0)),y+h*0.5f+w*0.5f);
        glEnd();
        break;
    case pglCmHot:
        glBegin(GL_QUAD_STRIP);
        // first line
        Hot(0,col);
        col.MakeCurrent();
        glVertex2f(x,y);
        glVertex2f(x+w,y);
        // second line
        Hot(3.0/8.0,col);
        col.MakeCurrent();
        glVertex2f(x,y+3.0f/8.0f*h);
        glVertex2f(x+w,y+3.0f/8.0f*h);
        // line 3
        Hot(3.0/4.0,col);
        col.MakeCurrent();
        glVertex2f(x,y+3.0f/4.0f*h);
        glVertex2f(x+w,y+3.0f/4.0f*h);
        // line 4
        Hot(1.0,col);
        col.MakeCurrent();
        glVertex2f(x,y+h);
        glVertex2f(x+w,y+h);
        glEnd();
        // drawing little triangle...
        Hot(0.5,col);
        col.MakeCurrent();
        glBegin(GL_TRIANGLES);
        glVertex2f(x,y+h*0.5f);
        glVertex2f(x-(float)(w/sqrt(2.0)),y+h*0.5f+w*0.5f);
        glVertex2f(x-(float)(w/sqrt(2.0)),y+h*0.5f-w*0.5f);
        
        glVertex2f(x+w,y+h*0.5f);
        glVertex2f(x+w+(float)(w/sqrt(2.0)),y+h*0.5f-w*0.5f);
        glVertex2f(x+w+(float)(w/sqrt(2.0)),y+h*0.5f+w*0.5f);
        glEnd();
        break;
    case pglCmAutumn:
        glBegin(GL_QUAD_STRIP);
        // first line
        Autumn(0,col);
        col.MakeCurrent();
        glVertex2f(x,y);
        glVertex2f(x+w,y);
        // second line
        Autumn(1.0,col);
        col.MakeCurrent();
        glVertex2f(x,y+h);
        glVertex2f(x+w,y+h);
        glEnd();
        // drawing little triangle...
        Autumn(0.5,col);
        col.MakeCurrent();
        glBegin(GL_TRIANGLES);
        glVertex2f(x,y+h*0.5f);
        glVertex2f(x-(float)(w/sqrt(2.0)),y+h*0.5f+w*0.5f);
        glVertex2f(x-(float)(w/sqrt(2.0)),y+h*0.5f-w*0.5f);
        
        glVertex2f(x+w,y+h*0.5f);
        glVertex2f(x+w+(float)(w/sqrt(2.0)),y+h*0.5f-w*0.5f);
        glVertex2f(x+w+(float)(w/sqrt(2.0)),y+h*0.5f+w*0.5f);
        glEnd();
        break;
    case pglCmWinter:
        glBegin(GL_QUAD_STRIP);
        // first line
        Winter(0,col);
        col.MakeCurrent();
        glVertex2f(x,y);
        glVertex2f(x+w,y);
        // second line
        Winter(1.0,col);
        col.MakeCurrent();
        glVertex2f(x,y+h);
        glVertex2f(x+w,y+h);
        glEnd();
        // drawing little triangle...
        Winter(0.5,col);
        col.MakeCurrent();
        glBegin(GL_TRIANGLES);
        glVertex2f(x,y+h*0.5f);
        glVertex2f(x-(float)(w/sqrt(2.0)),y+h*0.5f+w*0.5f);
        glVertex2f(x-(float)(w/sqrt(2.0)),y+h*0.5f-w*0.5f);
        
        glVertex2f(x+w,y+h*0.5f);
        glVertex2f(x+w+(float)(w/sqrt(2.0)),y+h*0.5f-w*0.5f);
        glVertex2f(x+w+(float)(w/sqrt(2.0)),y+h*0.5f+w*0.5f);
        glEnd();
        break;
    case pglCmSpring:
        glBegin(GL_QUAD_STRIP);
        // first line
        Spring(0,col);
        col.MakeCurrent();
        glVertex2f(x,y);
        glVertex2f(x+w,y);
        // second line
        Spring(1.0,col);
        col.MakeCurrent();
        glVertex2f(x,y+h);
        glVertex2f(x+w,y+h);
        glEnd();

        // drawing little triangle...
        Spring(0.5,col);
        col.MakeCurrent();
        glBegin(GL_TRIANGLES);
        glVertex2f(x,y+h*0.5f);
        glVertex2f(x-(float)(w/sqrt(2.0)),y+h*0.5f+w*0.5f);
        glVertex2f(x-(float)(w/sqrt(2.0)),y+h*0.5f-w*0.5f);
        
        glVertex2f(x+w,y+h*0.5f);
        glVertex2f(x+w+(float)(w/sqrt(2.0)),y+h*0.5f-w*0.5f);
        glVertex2f(x+w+(float)(w/sqrt(2.0)),y+h*0.5f+w*0.5f);
        glEnd();
        break;

    case pglCmSummer:
        glBegin(GL_QUAD_STRIP);
        // first line
        Summer(0,col);
        col.MakeCurrent();
        glVertex2f(x,y);
        glVertex2f(x+w,y);
        // second line
        Summer(1.0,col);
        col.MakeCurrent();
        glVertex2f(x,y+h);
        glVertex2f(x+w,y+h);
        glEnd();
        // drawing little triangle...
        Summer(0.5,col);
        col.MakeCurrent();
        glBegin(GL_TRIANGLES);
        glVertex2f(x,y+h*0.5f);
        glVertex2f(x-(float)(w/sqrt(2.0)),y+h*0.5f+w*0.5f);
        glVertex2f(x-(float)(w/sqrt(2.0)),y+h*0.5f-w*0.5f);
        
        glVertex2f(x+w,y+h*0.5f);
        glVertex2f(x+w+(float)(w/sqrt(2.0)),y+h*0.5f-w*0.5f);
        glVertex2f(x+w+(float)(w/sqrt(2.0)),y+h*0.5f+w*0.5f);
        glEnd();
        break;
        }
*/
        // drawing rectangle
        gfx.DrawRect(x,y,x+w,y+h);

        // drawing middle
        gfx.DrawLine(x,y+h*0.5f,x+w,y+h*0.5f);
}