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 ZoomEdit {
namespace Data { 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) { 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) { for(xmlpp::Node::NodeList::iterator t = triangleList.begin(); t != triangleList.end(); ++t) {
xmlpp::Element *tNode = dynamic_cast<xmlpp::Element*>(*t); xmlpp::Element *tNode = dynamic_cast<xmlpp::Element*>(*t);
@ -44,20 +72,7 @@ Room::~Room() {
Triangle* Room::addTriangle() { Triangle* Room::addTriangle() {
xmlpp::Element *tNode = roomNode->add_child("triangle"); xmlpp::Element *tNode = roomNode->add_child("triangle");
xmlpp::Element *node = tNode->add_child("vertex"); populateTriangle(tNode);
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");
Triangle *t = new Triangle(tNode); Triangle *t = new Triangle(tNode);
triangles.push_back(t); triangles.push_back(t);
@ -71,5 +86,22 @@ void Room::removeTriangle(Triangle *t) {
delete 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; std::list<Triangle*> triangles;
xmlpp::Element *roomNode; xmlpp::Element *roomNode;
std::list<Triangle*> floor;
xmlpp::Element *floorNode;
Glib::ustring id; Glib::ustring id;
void populateTriangle(xmlpp::Element *tNode);
// Prevent shallow copy // Prevent shallow copy
Room(const Room &o); Room(const Room &o);
Room& operator=(const Room &o); Room& operator=(const Room &o);
@ -50,6 +55,13 @@ class Room {
Triangle* addTriangle(); Triangle* addTriangle();
void removeTriangle(Triangle *t); void removeTriangle(Triangle *t);
const std::list<Triangle*>& getFloorTriangles() const {
return floor;
}
Triangle* addFloorTriangle();
void removeFloorTriangle(Triangle *t);
const Glib::ustring& getId() const { const Glib::ustring& getId() const {
return id; return id;
} }

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -25,6 +25,7 @@
namespace ZoomEdit { namespace ZoomEdit {
namespace Data { namespace Data {
class Level;
class Room; class Room;
} }
@ -32,12 +33,17 @@ namespace View {
class TopView : public View { class TopView : public View {
private: private:
Data::Level *level;
void renderRoom(Data::Room *room); void renderRoom(Data::Room *room);
public: 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_ #define ZOOMEDIT_VIEW_H_
namespace ZoomEdit { namespace ZoomEdit {
namespace Data {
class Level;
}
namespace View { namespace View {
class View { class View {
protected:
Data::Level *level;
public: public:
View(Data::Level *level0) : level(level0) {}
virtual ~View() {} virtual ~View() {}
virtual Data::Level* getLevel() {return level;}
virtual void setLevel(Data::Level *level0) {level = level0;}
virtual void render() = 0; virtual void render() = 0;
}; };