lms-video/Gem/plugins/modelOBJ/modelOBJ.cpp
Santi Noreña e85d191b46 - Reestructuración de ficheros y directorios general
- merge v0.01 --> Añadido fileselector
- Añadidas fuentes de Gem y Pure Data
- pix2jpg incluído en Gem. Archivos de construcción de Gem modificados.
- Añadido fichero ompiling.txt con instrucciones de compilación
2013-02-04 18:00:17 +01:00

193 lines
4 KiB
C++

////////////////////////////////////////////////////////
//
// GEM - Graphics Environment for Multimedia
//
// zmoelnig@iem.kug.ac.at
//
// Implementation file
//
// Copyright (c) 2001-2012 IOhannes m zmölnig. forum::für::umläute. IEM. zmoelnig@iem.at
// For information on usage and redistribution, and for a DISCLAIMER OF ALL
// WARRANTIES, see the file, "GEM.LICENSE.TERMS" in this distribution.
//
/////////////////////////////////////////////////////////
#include "modelOBJ.h"
#include "plugins/PluginFactory.h"
#include "Gem/RTE.h"
#include "Gem/Exception.h"
#include "Gem/Properties.h"
#include <string>
using namespace gem::plugins;
REGISTER_MODELLOADERFACTORY("OBJ", modelOBJ);
modelOBJ :: modelOBJ(void) :
m_model(NULL), m_dispList(0),
m_material(0),
m_flags(GLM_SMOOTH | GLM_TEXTURE),
m_group(0),
m_rebuild(false),
m_currentH(1.f), m_currentW(1.f),
m_textype(GLM_TEX_DEFAULT),
m_reverse(false)
{
}
modelOBJ ::~modelOBJ(void) {
destroy();
}
bool modelOBJ :: open(const std::string&name, const gem::Properties&requestprops) {
destroy();
#if 0
std::vector<std::string>keys=requestprops.keys();
unsigned int i;
for(i=0; i<keys.size(); i++) {
post("key[%d]=%s", i, keys[i].c_str());
}
#endif
m_model = glmReadOBJ(name.c_str());
if (!m_model){
return false;
}
m_reverse=false;
double d=1;
requestprops.get("rescale", d);
if(d)glmUnitize(m_model);
glmFacetNormals (m_model);
gem::Properties props=requestprops;
if(gem::Properties::UNSET==requestprops.type("smooth")) {
props.set("smooth", 0.5);
}
setProperties(props);
glmTexture(m_model, m_textype, 1,1);
m_rebuild=true;
return true;
}
bool modelOBJ :: render(void) {
if(m_rebuild) {
glmTexture(m_model, m_textype, 1,1);
compile();
}
if(m_dispList)
glCallList(m_dispList);
return (0!=m_dispList);
}
void modelOBJ :: close(void) {
destroy();
}
bool modelOBJ :: enumProperties(gem::Properties&readable,
gem::Properties&writeable) {
readable.clear();
writeable.clear();
return false;
}
void modelOBJ :: setProperties(gem::Properties&props) {
double d;
if(props.get("smooth", d)) {
if(d<0.)d=0.;
if(d>1.)d=1.;
if(m_model)
glmVertexNormals(m_model, d*180.);
m_rebuild=true;
}
if(props.get("texwidth", d)) {
if(d!=m_currentW)
m_rebuild=true;
m_currentW=d;
}
if(props.get("texheight", d)) {
if(d!=m_currentH)
m_rebuild=true;
m_currentH=d;
}
if(props.get("usematerials", d)) {
int flags=GLM_SMOOTH | GLM_TEXTURE;
if(d)
flags |= GLM_MATERIAL;
if(flags!=m_flags)
m_rebuild=true;
m_flags=flags;
}
std::string s;
if(props.get("textype", s)) {
if("UV"==s)
m_textype= GLM_TEX_UV;
else if("linear"==s)
m_textype= GLM_TEX_LINEAR;
else if("spheremap"==s)
m_textype= GLM_TEX_SPHEREMAP;
m_rebuild=true;
}
if(props.get("group", d)) {
m_group=d;
m_rebuild=true;
}
if(props.get("reverse", d)) {
// LATER:move this to compile()
bool reverse=d;
if((reverse!=m_reverse) && m_model) {
glmReverseWinding(m_model);
m_rebuild=true;
}
m_reverse=reverse;
}
}
void modelOBJ :: getProperties(gem::Properties&props) {
props.clear();
}
bool modelOBJ :: compile(void) {
if(!m_model) return false;
if(!(GLEW_VERSION_1_1)) {
// verbose(1, "cannot build display-list now...do you have a window?");
return false;
}
if (m_dispList) {
glDeleteLists(m_dispList, 1);
m_dispList=0;
}
if (!m_group){
m_dispList = glmList(m_model, m_flags);
} else {
m_dispList = glmListGroup(m_model, m_flags, m_group);
}
bool res = (0 != m_dispList);
if(res) m_rebuild=false;
return res;
}
void modelOBJ :: destroy(void) {
/* LATER: check valid contexts (remove glDelete from here) */
if (m_dispList) {
// destroy display list
glDeleteLists(m_dispList, 1);
m_dispList = 0;
}
if(m_model) {
glmDelete(m_model);
m_model=NULL;
}
}