Skip to content
OE_interfaceDisplay.cpp 4.38 KiB
Newer Older
/*
 * Copyright (c) 2015 Tricoire Sebastien 3dsman@free.fr
 *
 * This software is provided 'as-is', without any express or implied
 * warranty.  In no event will the authors be held liable for any damages
 * arising from the use of this software.
 *
 * Permission is granted to anyone to use this software for any purpose,
 * including commercial applications, and to alter it and redistribute it
 * freely, subject to the following restrictions:
 *
 * 1. The origin of this software must not be misrepresented; you must not
 * claim that you wrote the original software. If you use this software
 * in a product, an acknowledgment in the product documentation would be
 * appreciated but is not required.
 * 2. Altered source versions must be plainly marked as such, and must not be
 * misrepresented as being the original software.
 * 3. This notice may not be removed or altered from any source distribution.
 *
 */

#include "OE_interfaceDisplay.h"
#include "OE_utils.h"

#include "OE_controller.h"

#include <iostream>

#include <GL/gl.h>
#include <cstdlib>
#include <math.h>
#include <cstdio>
#include <cstring>
#include <algorithm> 

OE_interfaceDisplay::OE_interfaceDisplay()
{
    editDisplay = new OE_editDisplay();
    commandDisplay = new OE_commandDisplay();

    curDisplay = editDisplay;
}

OE_interfaceDisplay::OE_interfaceDisplay(OE_document document)
{
    editDisplay = new OE_editDisplay();
    editDisplay->setDocument(&document);
    commandDisplay = new OE_commandDisplay();
    commandDisplay->setDocument(&document);

    curDisplay = editDisplay;
}

OE_interfaceDisplay::~OE_interfaceDisplay()
{
    delete editDisplay;
    delete commandDisplay;
}


bool OE_interfaceDisplay::setDocument(OE_document * document)
{

    this->document = document;
    if(document)
    {
        editDisplay->setDocument(document);
        commandDisplay->setDocument(document);
    }
    return true;
}


bool OE_interfaceDisplay::setController(OE_controller* controller)
{
    this->controller = controller;
    if(controller)
    {
        if (editDisplay) editDisplay->setController(controller);
        if (commandDisplay) commandDisplay->setController(controller);
    }
    return true;
}

void OE_interfaceDisplay::showAll()
{
    if (curDisplay) curDisplay->showAll();
}

void OE_interfaceDisplay::mouse_Pos(double x, double y)
{
    if (curDisplay) curDisplay->mouse_Pos(x, y);
}

void OE_interfaceDisplay::mouse_Button(int button, int action, int mods)
{
    if (curDisplay) curDisplay->mouse_Button(button, action, mods);
}

void OE_interfaceDisplay::scroll(double xoffset, double yoffset)
{
    if (curDisplay) curDisplay->scroll(xoffset, yoffset);
}

void OE_interfaceDisplay::resize(int width, int height)
{
    if (curDisplay) curDisplay->resize(width, height);
}

void OE_interfaceDisplay::key(int key, int scancode, int action, int mods)
{
    if((action == GLFW_PRESS)&&(curDisplay == editDisplay))
    {
        if ((key == GLFW_KEY_Z)&&(mods == GLFW_MOD_CONTROL))
        {
            if (controller) controller->undoAction();
        }

        if ((key == GLFW_KEY_Z)&&(mods == GLFW_MOD_CONTROL+GLFW_MOD_SHIFT))
        {
            if (controller) controller->redoAction();
        }
    }
    if((action == GLFW_RELEASE)&&(key == GLFW_KEY_F5))
    {
        if(curDisplay == editDisplay)
        {
            if (controller) controller->generateInstructions();
            curDisplay = commandDisplay;
        }
        else
            curDisplay = editDisplay;
    }
}

/** \brief draw the document on screen
 *
 * \return true if all is ok
 *
 */

bool OE_interfaceDisplay::draw()
{
    draw(false);
}

/** \brief draw the document on screen
 *
 * \return true if all is ok
 *
 */

bool OE_interfaceDisplay::draw(bool select)
{
	float wzoom, hzoom;
	
	glViewport(0, 0, width, height);
    glClearColor(220.0f/255.0f, 220.0f/255.0f, 220.0f/255.0f, 1.0f);

	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
	glEnable(GL_BLEND);
	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
	glDisable(GL_TEXTURE_2D);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();

	wzoom = (float)width*zoom;
	hzoom = (float)height*zoom;

	glEnd();
	
	glOrtho(cx-wzoom, cx+wzoom, cy+hzoom, cy-hzoom, -1, 1);
	

	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	glDisable(GL_DEPTH_TEST);
	glColor4ub(255,255,255,255);
	glEnable(GL_BLEND);
	glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
	
	if (document)
	{
        if (curDisplay) curDisplay->draw();
    }
	return true;
}