zoomedit:

* Connected TopView to RenderArea
This commit is contained in:
neoraider 2008-04-15 01:04:02 +00:00
parent 7df8aa74c6
commit 85e58bd658
11 changed files with 131 additions and 54 deletions

View file

@ -23,8 +23,36 @@
namespace ZoomEdit {
namespace Data {
void Room::populateTriangle(xmlpp::Element *tNode) {
xmlpp::Element *node = tNode->add_child("vertex");
node->set_attribute("x", "0.0");
node->set_attribute("y", "0.0");
node->set_attribute("z", "0.0");
node = tNode->add_child("vertex");
node->set_attribute("x", "0.0");
node->set_attribute("y", "0.0");
node->set_attribute("z", "0.0");
node = tNode->add_child("vertex");
node->set_attribute("x", "0.0");
node->set_attribute("y", "0.0");
node->set_attribute("z", "0.0");
}
Room::Room(xmlpp::Element *node) : roomNode(node) {
xmlpp::Node::NodeList triangleList = node->get_children("triangle");
floorNode = dynamic_cast<xmlpp::Element*>(node->get_children("floor").front());
xmlpp::Node::NodeList triangleList = floorNode->get_children("triangle");
for(xmlpp::Node::NodeList::iterator t = triangleList.begin(); t != triangleList.end(); ++t) {
xmlpp::Element *tNode = dynamic_cast<xmlpp::Element*>(*t);
if(tNode)
floor.push_back(new Triangle(tNode));
}
triangleList = node->get_children("triangle");
for(xmlpp::Node::NodeList::iterator t = triangleList.begin(); t != triangleList.end(); ++t) {
xmlpp::Element *tNode = dynamic_cast<xmlpp::Element*>(*t);
@ -44,20 +72,7 @@ Room::~Room() {
Triangle* Room::addTriangle() {
xmlpp::Element *tNode = roomNode->add_child("triangle");
xmlpp::Element *node = tNode->add_child("vertex");
node->set_attribute("x", "0.0");
node->set_attribute("y", "0.0");
node->set_attribute("z", "0.0");
node = tNode->add_child("vertex");
node->set_attribute("x", "0.0");
node->set_attribute("y", "0.0");
node->set_attribute("z", "0.0");
node = tNode->add_child("vertex");
node->set_attribute("x", "0.0");
node->set_attribute("y", "0.0");
node->set_attribute("z", "0.0");
populateTriangle(tNode);
Triangle *t = new Triangle(tNode);
triangles.push_back(t);
@ -71,5 +86,22 @@ void Room::removeTriangle(Triangle *t) {
delete t;
}
Triangle* Room::addFloorTriangle() {
xmlpp::Element *tNode = floorNode->add_child("triangle");
populateTriangle(tNode);
Triangle *t = new Triangle(tNode);
floor.push_back(t);
return t;
}
void Room::removeFloorTriangle(Triangle *t) {
floorNode->remove_child(t->getNode());
floor.remove(t);
delete t;
}
}
}

View file

@ -33,8 +33,13 @@ class Room {
std::list<Triangle*> triangles;
xmlpp::Element *roomNode;
std::list<Triangle*> floor;
xmlpp::Element *floorNode;
Glib::ustring id;
void populateTriangle(xmlpp::Element *tNode);
// Prevent shallow copy
Room(const Room &o);
Room& operator=(const Room &o);
@ -50,6 +55,13 @@ class Room {
Triangle* addTriangle();
void removeTriangle(Triangle *t);
const std::list<Triangle*>& getFloorTriangles() const {
return floor;
}
Triangle* addFloorTriangle();
void removeFloorTriangle(Triangle *t);
const Glib::ustring& getId() const {
return id;
}

View file

@ -18,7 +18,7 @@
*/
#include "Triangle.h"
#include "../Util/Xml.h"
#include <Util/Xml.h>
#include <cstdlib>
namespace ZoomEdit {

View file

@ -18,6 +18,7 @@
*/
#include "RenderArea.h"
#include <View/View.h>
#include <iostream>
#include <cstdlib>
#include <cmath>
@ -31,7 +32,7 @@ namespace Gui {
GdkGLConfig *RenderArea::glconfig = 0;
RenderArea::RenderArea(BaseObjectType *cobject, const Glib::RefPtr<Gnome::Glade::Xml> &xml)
: Gtk::DrawingArea(cobject), xCenter(0), yCenter(0), zoomLevel(0), scale(100) {
: Gtk::DrawingArea(cobject), view(0), xCenter(0), yCenter(0), zoomLevel(0), scale(100) {
if(!glconfig) {
glconfig = gdk_gl_config_new_by_mode((GdkGLConfigMode)(GDK_GL_MODE_RGB | GDK_GL_MODE_DOUBLE));
if(!glconfig) glconfig = gdk_gl_config_new_by_mode(GDK_GL_MODE_RGB); // Hmm, can't find double buffered config
@ -101,12 +102,13 @@ bool RenderArea::onExposeEvent(GdkEventExpose*) {
glScalef(scale, scale, 1);
glTranslatef(-xCenter, -yCenter, 0);
drawGrid();
if(view)
view->render();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
gdkSwapBuffers();
gdkGLEnd();

View file

@ -26,18 +26,31 @@
#include <gtk/gtkgl.h>
namespace ZoomEdit {
namespace View {
class View;
}
namespace Gui {
class RenderArea : public Gtk::DrawingArea {
public:
RenderArea(BaseObjectType *cobject, const Glib::RefPtr<Gnome::Glade::Xml> &xml);
View::View* getView() const {return view;}
void setView(View::View *view0) {
view = view0;
queue_draw();
}
private:
static GdkGLConfig *glconfig;
Gtk::HScrollbar *hScrollbar;
Gtk::VScrollbar *vScrollbar;
View::View *view;
float xCenter, yCenter;
int zoomLevel;

View file

@ -35,6 +35,8 @@ class Window : public Gtk::Window {
public:
Window(BaseObjectType *cobject, const Glib::RefPtr<Gnome::Glade::Xml> &xml);
virtual ~Window();
RenderArea* getRenderArea() const {return renderArea;}
};
}

View file

@ -17,18 +17,20 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "Instance.h"
#include <iostream>
#include <libxml++/validators/dtdvalidator.h>
#include <libxml/tree.h>
#include "Instance.h"
#include "Gui/Window.h"
#include "Data/Level.h"
#include <Gui/Window.h>
#include <Gui/RenderArea.h>
#include <Data/Level.h>
#include <View/TopView.h>
namespace ZoomEdit {
guint Instance::instances = 0;
Instance::Instance(const Glib::ustring &file) : window(0), levelXml(0), level(0) {
Instance::Instance(const Glib::ustring &file) : window(0), levelXml(0), level(0), view(0) {
instances++;
#ifdef GLIBMM_EXCEPTIONS_ENABLED
@ -59,6 +61,9 @@ Instance::Instance(const Glib::ustring &file) : window(0), levelXml(0), level(0)
window->signal_hide().connect(sigc::mem_fun(this, &Instance::destroy));
view = new View::TopView();
window->getRenderArea()->setView(view);
if(file.empty())
createLevel();
else
@ -71,6 +76,9 @@ Instance::~Instance() {
if(window)
delete window;
if(view)
delete view;
if(level)
delete level;
@ -83,8 +91,10 @@ Instance::~Instance() {
}
void Instance::createLevel() {
if(level)
if(level) {
view->setLevel(0);
delete level;
}
if(levelXml)
delete levelXml;
@ -109,10 +119,13 @@ void Instance::createLevel() {
root->add_child("textures");
level = new Data::Level(root);
view->setLevel(level);
}
bool Instance::loadLevel(const Glib::ustring &file) {
if(level) {
view->setLevel(0);
delete level;
level = 0;
}
@ -131,7 +144,9 @@ bool Instance::loadLevel(const Glib::ustring &file) {
level = new Data::Level(doc->get_root_node());
return (level != 0);
view->setLevel(level);
return true;
}
bool Instance::saveLevel(const Glib::ustring &file) {

View file

@ -34,6 +34,10 @@ namespace Data {
class Level;
}
namespace View {
class TopView;
}
class Instance {
public:
virtual ~Instance();
@ -53,6 +57,8 @@ class Instance {
xmlpp::DomParser *levelXml;
Data::Level *level;
View::TopView *view;
Instance(const Glib::ustring &file);
void destroy();

View file

@ -18,28 +18,29 @@
*/
#include "TopView.h"
#include "../Data/Level.h"
#include "../Data/Room.h"
#include "../Data/Triangle.h"
#include <cmath>
#include <Data/Level.h>
#include <Data/Room.h>
#include <Data/Triangle.h>
#include <GL/gl.h>
namespace ZoomEdit {
namespace View {
void TopView::renderRoom(Data::Room *room) {
const std::list<Data::Triangle*> &triangles = room->getTriangles();
std::list<Data::Triangle*> floor;
const std::list<Data::Triangle*> &floor = room->getFloorTriangles();
for(std::list<Data::Triangle*>::const_iterator t = triangles.begin(); t != triangles.end(); ++t) {
Data::Vector v1 = (*t)->getVertex(1) - (*t)->getVertex(0);
Data::Vector v2 = (*t)->getVertex(2) - (*t)->getVertex(0);
Data::Vector n = (v1 % v2);
n.normalize();
if(n*Data::Vector(0, 1, 0) > std::cos(45))
floor.push_back(*t);
glColor4f(0.0f, 0.7f, 1.0f, 0.3f);
glBegin(GL_TRIANGLES);
for(std::list<Data::Triangle*>::const_iterator t = floor.begin(); t != floor.end(); ++t) {
for(int i = 0; i < 3; ++i) {
const Data::Vertex &v = (*t)->getVertex(i);
glVertex2f(v.getX(), v.getZ());
}
}
glEnd();
}
void TopView::render() {

View file

@ -25,6 +25,7 @@
namespace ZoomEdit {
namespace Data {
class Level;
class Room;
}
@ -32,12 +33,17 @@ namespace View {
class TopView : public View {
private:
Data::Level *level;
void renderRoom(Data::Room *room);
public:
TopView(Data::Level *level0 = 0) : View(level0) {}
TopView(Data::Level *level0 = 0) : level(level0) {}
void render();
Data::Level* getLevel() {return level;}
void setLevel(Data::Level *level0) {level = level0;}
virtual void render();
};
}

View file

@ -21,24 +21,12 @@
#define ZOOMEDIT_VIEW_H_
namespace ZoomEdit {
namespace Data {
class Level;
}
namespace View {
class View {
protected:
Data::Level *level;
public:
View(Data::Level *level0) : level(level0) {}
virtual ~View() {}
virtual Data::Level* getLevel() {return level;}
virtual void setLevel(Data::Level *level0) {level = level0;}
virtual void render() = 0;
};