bool fb_srgb;
bool opt_gear_wireframe;
+TextureSet texman;
+SceneSet sceneman;
+
unsigned int sdr_ltmap, sdr_ltmap_notex;
static float cam_dist = 0.0;
static float joy_deadzone = 0.01;
static Mat4 view_matrix, mouse_view_matrix, proj_matrix;
-static TextureSet texman;
-static SceneSet sceneman;
static MetaScene *mscn;
static unsigned int sdr_post_gamma;
glClearColor(0.2, 0.2, 0.2, 1.0);
- mscn = new MetaScene(&sceneman, &texman);
+ mscn = new MetaScene;
if(!mscn->load(opt.scenefile ? opt.scenefile : "data/museum.scene")) {
return false;
}
#ifndef APP_H_
#define APP_H_
+#include "texture.h"
+#include "scene.h"
+
extern long time_msec;
extern int win_width, win_height;
extern float win_aspect;
extern bool opt_gear_wireframe;
extern bool fb_srgb;
+extern TextureSet texman;
+extern SceneSet sceneman;
+
extern unsigned int sdr_ltmap, sdr_ltmap_notex;
enum {
#ifndef IMAGE_H_
#define IMAGE_H_
+#include <string>
+
class Image {
public:
enum Format {
void *pixels;
public:
+ std::string name;
+
Image();
~Image();
#include "scene.h"
#include "treestore.h"
#include "logger.h"
+#include "app.h"
#ifdef WIN32
#include <malloc.h>
static bool proc_node(MetaScene *mscn, struct ts_node *node);
static bool proc_scenefile(MetaScene *mscn, struct ts_node *node);
-static bool proc_mtledit(MetaScene *mscn, MaterialEdit *med, struct ts_node *node, TextureSet *texset);
+static bool proc_mtledit(MetaScene *mscn, MaterialEdit *med, struct ts_node *node);
static void apply_mtledit(Scene *scn, const MaterialEdit &med);
static void apply_mtledit(Material *mtl, const MaterialEdit &med);
static struct ts_attr *attr_inscope(struct ts_node *node, const char *name);
static void print_scene_graph(SceneNode *n, int level);
-MetaScene::MetaScene(SceneSet *sman, TextureSet *tman)
+MetaScene::MetaScene()
{
- sceneman = sman;
- texman = tman;
walk_mesh = 0;
}
struct ts_node *child = node->child_list;
while(child) {
MaterialEdit medit;
- if(proc_mtledit(mscn, &medit, child, mscn->texman)) {
+ if(proc_mtledit(mscn, &medit, child)) {
sdat->mtledit.push_back(medit);
}
child = child->next;
}
- Scene *newscn = mscn->sceneman->get(fname);
+ Scene *newscn = sceneman.get(fname);
/* NOTE: setting all these after get() is not a race condition, because
* scene_loaded() which uses this, will only run in our main loop during
* SceneSet::update() on the main thread.
return true;
}
-static bool proc_mtledit(MetaScene *mscn, MaterialEdit *med, struct ts_node *node, TextureSet *texset)
+static bool proc_mtledit(MetaScene *mscn, MaterialEdit *med, struct ts_node *node)
{
if(strcmp(node->name, "mtledit") != 0) {
return false;
// remove
med->tex = 0;
} else {
- med->tex = texset->get_texture(afile->val.str, TEX_2D, &mscn->datamap);
+ med->tex = texman.get_texture(afile->val.str, TEX_2D, &mscn->datamap);
}
}
// TODO add more edit modes
class MetaScene {
public:
- SceneSet *sceneman;
- TextureSet *texman;
DataMap datamap;
std::vector<Scene*> scenes;
std::map<Scene*, void*> scndata;
- MetaScene(SceneSet *sman, TextureSet *tman);
+ MetaScene();
~MetaScene();
bool load(const char *fname);
#include <regex>
#include "scene.h"
#include "objmesh.h"
+#include "app.h"
static void destroy_node_tree(SceneNode *n);
-Scene::Scene(TextureSet *tset)
+Scene::Scene()
{
metascn = 0;
nodes = 0;
walk_mesh = 0;
-
- if(tset) {
- texset = tset;
- own_texset = false;
- } else {
- texset = new TextureSet;
- own_texset = true;
- }
}
Scene::~Scene()
delete objects[i];
}
objects.clear();
-
- if(own_texset) {
- delete texset;
- }
- texset = 0;
}
static void destroy_node_tree(SceneNode *n)
bool Scene::merge(Scene *scn)
{
- if(texset != scn->texset) {
- // TODO handle this properly
- error_log("for now only able to merge scenes using the same texture set\n");
- return false;
- }
-
if(walk_mesh) {
if(scn->walk_mesh) {
walk_mesh->append(*scn->walk_mesh);
return 0;
}
- Scene *res = new Scene(texset);
+ Scene *res = new Scene;
for(SceneNode *n : nodelist) {
class MetaScene;
class Scene {
-private:
- bool own_texset;
-
public:
MetaScene *metascn;
DataMap datamap;
TextureSet *texset; // only owned by Scene if own_texset is true
void *loader_data;
- explicit Scene(TextureSet *tset = 0);
+ explicit Scene();
~Scene();
Scene(const Scene &rhs) = delete;
#include <assimp/vector3.h>
#include <assimp/matrix4x4.h>
#include <assimp/quaternion.h>
+#include "app.h"
#include "scene.h"
#include "objmesh.h"
#include "datamap.h"
/*static const char *mprop_semantic(int x);
static int count_textures(const aiMaterial *aimat);*/
static int assimp_textype(aiTextureType type);
-static const char *assimp_textypestr(aiTextureType type);
+//static const char *assimp_textypestr(aiTextureType type);
static Mat4 assimp_matrix(const aiMatrix4x4 &aim);
} while(*sptr++);
int textype = assimp_textype(aitype);
- info_log("loading %s texture: %s\n", assimp_textypestr(aitype), fname);
- Texture *tex = scn->texset->get_texture(fname, TEX_2D, &scn->datamap);
+ Texture *tex = texman.get_texture(fname, TEX_2D, &scn->datamap);
assert(tex);
mat->textures.push_back(tex);
return MTL_TEX_UNKNOWN;
}
-static const char *assimp_textypestr(aiTextureType type)
+/*static const char *assimp_textypestr(aiTextureType type)
{
switch(type) {
case aiTextureType_DIFFUSE:
break;
}
return "unknown";
-}
+}*/
static Mat4 assimp_matrix(const aiMatrix4x4 &aim)
{
if(nsize) {
fname = (char*)alloca(nsize);
dmap->lookup(name, fname, nsize);
+ //debug_log("texture lookup: %s -> %s\n", name, fname);
} else {
fname = (char*)name;
+ //debug_log("texture lookup failed, using: %s\n", fname);
}
std::map<std::string, Texture*>::const_iterator iter = data.find(fname);
bool TextureSet::load_tex(Texture *tex, const char *fname)
{
Image *img = new Image;
+ img->name = fname;
if(!img->load(fname)) {
delete img;
return false;
bool TextureSet::done_tex(Texture *tex)
{
+ //debug_log("TextureSet::done_tex [%s]\n", tex->img->name.c_str());
if(!tex->img) {
return false;
}