if(!(sdr_ltmap_notex = create_program_load("sdr/lightmap.v.glsl", "sdr/lightmap-notex.p.glsl"))) {
return false;
}
+ set_uniform_int(sdr_ltmap_notex, "texmap", MTL_TEX_DIFFUSE);
+ set_uniform_int(sdr_ltmap_notex, "lightmap", MTL_TEX_LIGHTMAP);
if(!(sdr_ltmap = create_program_load("sdr/lightmap.v.glsl", "sdr/lightmap-tex.p.glsl"))) {
return false;
}
- set_uniform_int(sdr_ltmap, "texmap", 0);
- set_uniform_int(sdr_ltmap, "lightmap", 1);
+ set_uniform_int(sdr_ltmap, "texmap", MTL_TEX_DIFFUSE);
+ set_uniform_int(sdr_ltmap, "lightmap", MTL_TEX_LIGHTMAP);
if(!fb_srgb) {
sdr_post_gamma = create_program_load("sdr/post_gamma.v.glsl", "sdr/post_gamma.p.glsl");
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, ks);
glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, shininess);
+ /*
int ntex = std::min((int)textures.size(), 8); // TODO: use max texture units
for(int i=0; i<ntex; i++) {
bind_texture(textures[i], i);
}
+ */
+ for(int i=0; i<NUM_MTL_TEXTURES; i++) {
+ if(stdtex[i]) {
+ bind_texture(stdtex[i], i);
+ }
+ }
if(stdtex[MTL_TEX_LIGHTMAP]) {
bind_program(stdtex[MTL_TEX_DIFFUSE] ? sdr_ltmap : sdr_ltmap_notex);
+#include <assert.h>
#include <string>
#include <regex>
#include "metascene.h"
int nobj = scn->objects.size();
for(int i=0; i<nobj; i++) {
Object *obj = scn->objects[i];
- if(std::regex_match(obj->get_name(), med.name_re)) {
+ if(std::regex_match(obj->mtl.name, med.name_re)) {
apply_mtledit(&obj->mtl, med);
}
}
nodes = 0;
walk_mesh = 0;
+
+ texset = 0;
+ loader_data = 0;
}
Scene::~Scene()
void Scene::destroy()
{
+ clear();
+
+ metascn = 0;
+ texset = 0;
+ loader_data = 0;
+
+ datamap.clear();
+}
+
+void Scene::clear()
+{
destroy_node_tree(nodes);
nodes = 0;
Mesh *walk_mesh;
- TextureSet *texset; // only owned by Scene if own_texset is true
+ TextureSet *texset;
void *loader_data;
explicit Scene();
Scene &operator =(const Scene &rhs) = delete;
void destroy();
+ void clear(); // clear all contents (meshes, objects, and nodes)
bool load(const char *fname, unsigned int flags = 0);
*dptr++ = *sptr == '\\' ? '/' : *sptr;
} while(*sptr++);
+ if(!fname || !*fname) continue;
+
int textype = assimp_textype(aitype);
Texture *tex = texman.get_texture(fname, TEX_2D, &scn->datamap);
bool SceneSet::load_scene(Scene *scn, const char *fname)
{
+ scn->clear();
return scn->load(fname, SCNLOAD_FLIPTEX | SCNLOAD_STAGE_IO);
}