Gary, I currently build against a fairly recent SVN checkout of collada. I had to modify some of the 3rd party paths to get it to build, but nothing too serious.
As far as the OSG plugin is concerned I modified the additional include directories, and additional library search directories to point directly at where I had the collada source installed. I have attached a copy of my VC7.1 project file for you to look at. I have yet another version of daeWMaterials.cpp just about ready. I hope this fixes the outstanding issues on windows path names without requiring the collada people to change anything. I have attached this as well. Roger > -----Original Message----- > From: [EMAIL PROTECTED] [mailto:osg-users- > [EMAIL PROTECTED] On Behalf Of Robert Osfield > Sent: 11 December 2006 09:43 > To: osg users > Subject: Re: [osg-users] The collada compile > > Hi Garry, > > There has be a number of bug fixes to COLLADA DOM and the OSG's > COLLADA plugin of late so I'd recommend using the 1.4.1 version of the > DOM and the CVS version of the OSG. > > Robert. > > On 12/11/06, Garry Keltie <[EMAIL PROTECTED]> wrote: > > Hi list, > > > > I'd really like it if someone could share the (perhaps obvious) secret > > to get the collada plugin to compile :) > > > > Having some, well lots, of link errors with the released OSG 1.2 I have > > grabbed the nightly snapshot(s). Noting that there are fair differences > > from the released OSG 1.2, I am using the snapshot as my current test > > environment (on windows). > > > > I believe I have a clean compile of COLLADA-DOM (1.4.1/1.2.0) and have > > all the libs/headers in place in the 3rd party dirs. The plugin > > generates code without errors/warnings but on linking goes berserko > > (LNK2019) with the libcollada_dom.lib and probably every object in > there. > > > > I'm hoping its a simple VS lib dependency thing. > > > > - Can anyone tell me what (if any) project dependencies they are using > > please? > > - Does the COLLADA-DOM solution compile out of the box for the plugin's > > requirements? (Release DLL, with dae set to static linking?) > > - Does the plugin compile ok at the moment? > > > > Thanks > > > > Garry > > > > -- > > Garry Keltie > > > > garry. @rmit. .au > > keltie edu > > VR Centre - Research & Innovation > > RMIT University > > > > / ... .... .. - / .... .- .--. .--. . -. . -.. > > _______________________________________________ > > osg-users mailing list > > [email protected] > > http://openscenegraph.net/mailman/listinfo/osg-users > > http://www.openscenegraph.org/ > > > _______________________________________________ > osg-users mailing list > [email protected] > http://openscenegraph.net/mailman/listinfo/osg-users > http://www.openscenegraph.org/
dae.vcproj
Description: application/xml
/* * Copyright 2006 Sony Computer Entertainment Inc. * * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this * file except in compliance with the License. You may obtain a copy of the License at: * http://research.scea.com/scea_shared_source_license.html * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or * implied. See the License for the specific language governing permissions and limitations under the * License. */ #include "daeWriter.h" #include <dae/domAny.h> #include <dom/domCOLLADA.h> #include <dom/domConstants.h> #include <dom/domProfile_COMMON.h> #include <sstream> //#include <dom/domLibrary_effects.h> //#include <dom/domLibrary_materials.h> #ifdef WIN32 #include "windows.h" #endif using namespace osgdae; void daeWriter::processMaterial( osg::StateSet *ss, domInstance_geometry *ig, const std::string &geoName ) { osg::ref_ptr<osg::StateSet> ssClean = CleanStateSet(ss); // Need to hold a ref to this or the materialMap.find() will delete it domBind_material *bm = daeSafeCast< domBind_material >( ig->createAndPlace( COLLADA_ELEMENT_BIND_MATERIAL ) ); domBind_material::domTechnique_common *tc = daeSafeCast< domBind_material::domTechnique_common >( bm->createAndPlace( "technique_common" ) ); domInstance_material *im = daeSafeCast< domInstance_material >( tc->createAndPlace( COLLADA_ELEMENT_INSTANCE_MATERIAL ) ); std::string symbol = geoName + "_material"; im->setSymbol( symbol.c_str() ); MaterialMap::iterator iter = materialMap.find( ssClean ); if ( iter != materialMap.end() ) { std::string url = "#" + std::string( iter->second->getId() ); im->setTarget( url.c_str() ); return; } if ( lib_mats == NULL ) { lib_mats = daeSafeCast< domLibrary_materials >( dom->createAndPlace( COLLADA_ELEMENT_LIBRARY_MATERIALS ) ); } domMaterial *mat = daeSafeCast< domMaterial >( lib_mats->createAndPlace( COLLADA_ELEMENT_MATERIAL ) ); std::string name = ssClean->getName(); if ( name.empty() ) { name = "material"; } name = uniquify( name ); mat->setId( name.c_str() ); std::string url = "#" + name; im->setTarget( url.c_str() ); domInstance_effect *ie = daeSafeCast<domInstance_effect>( mat->createAndPlace( "instance_effect" ) ); if ( lib_effects == NULL ) { lib_effects = daeSafeCast< domLibrary_effects >( dom->createAndPlace( COLLADA_ELEMENT_LIBRARY_EFFECTS ) ); } domEffect *effect = daeSafeCast< domEffect >( lib_effects->createAndPlace( COLLADA_ELEMENT_EFFECT ) ); std::string efName = name + "_effect"; effect->setId( efName.c_str() ); url = "#" + efName; ie->setUrl( url.c_str() ); domProfile_COMMON *pc = daeSafeCast< domProfile_COMMON >( effect->createAndPlace( COLLADA_ELEMENT_PROFILE_COMMON ) ); domProfile_COMMON::domTechnique *pc_teq = daeSafeCast< domProfile_COMMON::domTechnique >( pc->createAndPlace( "technique" ) ); pc_teq->setSid( "t0" ); domProfile_COMMON::domTechnique::domPhong *phong = daeSafeCast< domProfile_COMMON::domTechnique::domPhong >( pc_teq->createAndPlace( "phong" ) ); osg::Texture *tex = static_cast<osg::Texture*>(ssClean->getTextureAttribute( 0, osg::StateAttribute::TEXTURE )); if ( ssClean->getTextureAttribute( 1, osg::StateAttribute::TEXTURE ) != NULL ) { tex = static_cast<osg::Texture*>(ssClean->getTextureAttribute( 1, osg::StateAttribute::TEXTURE )); } if ( tex != NULL && tex->getImage( 0 ) != NULL ) { //TODO: Export all of the texture Attributes like wrap mode and all that jazz domImage *img = daeSafeCast< domImage >( pc->createAndPlace( COLLADA_ELEMENT_IMAGE ) ); std::string iName = efName + "-image"; img->setId( iName.c_str() ); osg::Image *osgimg = tex->getImage( 0 ); domImage::domInit_from *imgif = daeSafeCast< domImage::domInit_from >( img->createAndPlace( "init_from" ) ); #ifdef WIN32 char path1[ MAX_PATH + 1 ]; char path2[ MAX_PATH + 1 ]; LPTSTR pFileName; std::string imageFileName = osgDB::findDataFile( osgimg->getFileName() ); GetFullPathName( imageFileName.c_str(), MAX_PATH + 1, path1, &pFileName ); GetShortPathName( path1, path2, MAX_PATH + 1 ); GetLongPathName( path2, path1, MAX_PATH + 1 ); imageFileName = osgDB::convertFileNameToUnixStyle(path1); if ((imageFileName.length() > 3) && (isalpha(imageFileName[0])) && (imageFileName[1] == ':') && (imageFileName[2] == '/')) { if (islower(imageFileName[0])) imageFileName[0] = (char)_toupper(imageFileName[0]); imageFileName = '/' + imageFileName; } daeURI imageFileUri( imageFileName.c_str() ); imageFileUri.validate(); std::string docFileName = doc->getDocumentURI()->getFilepath(); docFileName += doc->getDocumentURI()->getFile(); if ((docFileName.length() > 3) && (docFileName[0] == '/') && (isalpha(docFileName[1])) && (docFileName[2] == ':') && (docFileName[3] == '/')) GetFullPathName( docFileName.c_str() + 1, MAX_PATH + 1, path1, &pFileName ); else GetFullPathName( docFileName.c_str(), MAX_PATH + 1, path1, &pFileName ); GetShortPathName( path1, path2, MAX_PATH + 1 ); GetLongPathName( path2, path1, MAX_PATH + 1 ); docFileName = osgDB::convertFileNameToUnixStyle(path1); if ((docFileName.length() > 3) && (isalpha(docFileName[0])) && (docFileName[1] == ':') && (docFileName[2] == '/')) { if (islower(docFileName[0])) docFileName[0] = (char)_toupper(docFileName[0]); docFileName = '/' + docFileName; } daeURI docFileUri( docFileName.c_str() ); docFileUri.validate(); imgif->setValue( imageFileUri.getURI() ); imgif->getValue().makeRelativeTo( &docFileUri ); #else std::string imgstr = osgDB::convertFileNameToUnixStyle( osgDB::findDataFile( osgimg->getFileName() ) ); daeURI uri( imgstr.c_str() ); uri.validate(); // This returns an absolute URI imgif->setValue( uri.getURI() ); imgif->getValue().makeRelativeTo( doc->getDocumentURI() ); #endif #ifndef EARTH_TEX domCommon_newparam_type *np = daeSafeCast< domCommon_newparam_type >( pc->createAndPlace( "newparam" ) ); std::string surfName = efName + "-surface"; np->setSid( surfName.c_str() ); domFx_surface_common *surface = daeSafeCast< domFx_surface_common >( np->createAndPlace( "surface" ) ); domFx_surface_init_from_common *sif = daeSafeCast< domFx_surface_init_from_common >( surface->createAndPlace("init_from") ); sif->setValue( iName.c_str() ); surface->setType( FX_SURFACE_TYPE_ENUM_2D ); np = daeSafeCast< domCommon_newparam_type >( pc->createAndPlace( "newparam" ) ); std::string sampName = efName + "-sampler"; np->setSid( sampName.c_str() ); domFx_sampler2D_common *sampler = daeSafeCast< domFx_sampler2D_common >( np->createAndPlace( "sampler2D" ) ); domFx_sampler2D_common_complexType::domSource *source = daeSafeCast< domFx_sampler2D_common_complexType::domSource >( sampler->createAndPlace( "source" ) ); source->setValue( surfName.c_str() ); //set sampler state domFx_sampler2D_common_complexType::domWrap_s *wrap_s = daeSafeCast< domFx_sampler2D_common_complexType::domWrap_s >( sampler->createAndPlace( "wrap_s" ) ); osg::Texture::WrapMode wrap = tex->getWrap( osg::Texture::WRAP_S ); switch( wrap ) { case osg::Texture::CLAMP: wrap_s->setValue( FX_SAMPLER_WRAP_COMMON_CLAMP ); break; case osg::Texture::CLAMP_TO_BORDER: case osg::Texture::CLAMP_TO_EDGE: wrap_s->setValue( FX_SAMPLER_WRAP_COMMON_BORDER ); break; case osg::Texture::REPEAT: wrap_s->setValue( FX_SAMPLER_WRAP_COMMON_WRAP ); break; case osg::Texture::MIRROR: wrap_s->setValue( FX_SAMPLER_WRAP_COMMON_MIRROR ); break; default: wrap_s->setValue( FX_SAMPLER_WRAP_COMMON_NONE ); break; } domFx_sampler2D_common_complexType::domWrap_t *wrap_t = daeSafeCast< domFx_sampler2D_common_complexType::domWrap_t >( sampler->createAndPlace( "wrap_t" ) ); wrap = tex->getWrap( osg::Texture::WRAP_T ); switch( wrap ) { case osg::Texture::CLAMP: wrap_t->setValue( FX_SAMPLER_WRAP_COMMON_CLAMP ); break; case osg::Texture::CLAMP_TO_BORDER: case osg::Texture::CLAMP_TO_EDGE: wrap_t->setValue( FX_SAMPLER_WRAP_COMMON_BORDER ); break; case osg::Texture::REPEAT: wrap_t->setValue( FX_SAMPLER_WRAP_COMMON_WRAP ); break; case osg::Texture::MIRROR: wrap_t->setValue( FX_SAMPLER_WRAP_COMMON_MIRROR ); break; default: wrap_t->setValue( FX_SAMPLER_WRAP_COMMON_NONE ); break; } const osg::Vec4 &bcol = tex->getBorderColor(); domFx_sampler2D_common_complexType::domBorder_color *dbcol = daeSafeCast< domFx_sampler2D_common_complexType::domBorder_color >( sampler->createAndPlace( "border_color" ) ); dbcol->getValue().append( bcol.r() ); dbcol->getValue().append( bcol.g() ); dbcol->getValue().append( bcol.b() ); dbcol->getValue().append( bcol.a() ); domFx_sampler2D_common_complexType::domMinfilter *minfilter = daeSafeCast< domFx_sampler2D_common_complexType::domMinfilter >( sampler->createAndPlace( "minfilter" ) ); osg::Texture::FilterMode mode = tex->getFilter( osg::Texture::MIN_FILTER ); switch( mode ) { case osg::Texture::LINEAR: minfilter->setValue( FX_SAMPLER_FILTER_COMMON_LINEAR ); break; case osg::Texture::LINEAR_MIPMAP_LINEAR: minfilter->setValue( FX_SAMPLER_FILTER_COMMON_LINEAR_MIPMAP_LINEAR ); break; case osg::Texture::LINEAR_MIPMAP_NEAREST: minfilter->setValue( FX_SAMPLER_FILTER_COMMON_LINEAR_MIPMAP_NEAREST ); break; case osg::Texture::NEAREST: minfilter->setValue( FX_SAMPLER_FILTER_COMMON_NEAREST ); break; case osg::Texture::NEAREST_MIPMAP_LINEAR: minfilter->setValue( FX_SAMPLER_FILTER_COMMON_NEAREST_MIPMAP_LINEAR ); break; case osg::Texture::NEAREST_MIPMAP_NEAREST: minfilter->setValue( FX_SAMPLER_FILTER_COMMON_NEAREST_MIPMAP_NEAREST ); break; } domFx_sampler2D_common_complexType::domMagfilter *magfilter = daeSafeCast< domFx_sampler2D_common_complexType::domMagfilter >( sampler->createAndPlace( "magfilter" ) ); mode = tex->getFilter( osg::Texture::MAG_FILTER ); switch( mode ) { case osg::Texture::LINEAR: magfilter->setValue( FX_SAMPLER_FILTER_COMMON_LINEAR ); break; case osg::Texture::LINEAR_MIPMAP_LINEAR: magfilter->setValue( FX_SAMPLER_FILTER_COMMON_LINEAR_MIPMAP_LINEAR ); break; case osg::Texture::LINEAR_MIPMAP_NEAREST: magfilter->setValue( FX_SAMPLER_FILTER_COMMON_LINEAR_MIPMAP_NEAREST ); break; case osg::Texture::NEAREST: magfilter->setValue( FX_SAMPLER_FILTER_COMMON_NEAREST ); break; case osg::Texture::NEAREST_MIPMAP_LINEAR: magfilter->setValue( FX_SAMPLER_FILTER_COMMON_NEAREST_MIPMAP_LINEAR ); break; case osg::Texture::NEAREST_MIPMAP_NEAREST: magfilter->setValue( FX_SAMPLER_FILTER_COMMON_NEAREST_MIPMAP_NEAREST ); break; } domCommon_color_or_texture_type *cot = daeSafeCast< domCommon_color_or_texture_type >( phong->createAndPlace( "diffuse" ) ); domCommon_color_or_texture_type_complexType::domTexture *dtex = daeSafeCast< domCommon_color_or_texture_type_complexType::domTexture >( cot->createAndPlace( "texture" ) ); dtex->setTexture( sampName.c_str() ); dtex->setTexcoord( "texcoord0" ); #else domCommon_color_or_texture_type *cot = daeSafeCast< domCommon_color_or_texture_type >( phong->createAndPlace( "diffuse" ) ); domCommon_color_or_texture_type_complexType::domTexture *dtex = daeSafeCast< domCommon_color_or_texture_type_complexType::domTexture >( cot->createAndPlace( "texture" ) ); dtex->setTexture( iName.c_str() ); dtex->setTexcoord( "texcoord0" ); #endif domInstance_material::domBind_vertex_input *bvi = daeSafeCast< domInstance_material::domBind_vertex_input >( im->createAndPlace( "bind_vertex_input" ) ); bvi->setSemantic( "texcoord0" ); bvi->setInput_semantic( "TEXCOORD" ); bvi->setInput_set( 0 ); //take care of blending if any osg::BlendFunc *bf = static_cast< osg::BlendFunc * >( ssClean->getAttribute( osg::StateAttribute::BLENDFUNC ) ); osg::BlendColor *bc = static_cast< osg::BlendColor * >( ssClean->getAttribute( osg::StateAttribute::BLENDCOLOR ) ); if ( bc != NULL ) { domCommon_transparent_type *ctt = daeSafeCast< domCommon_transparent_type >( phong->createAndPlace( "transparent" ) ); ctt->setOpaque( FX_OPAQUE_ENUM_RGB_ZERO ); domCommon_color_or_texture_type_complexType::domColor *tcol = daeSafeCast< domCommon_color_or_texture_type_complexType::domColor >( ctt->createAndPlace( "color" ) ); tcol->getValue().append( bc->getConstantColor().r() ); tcol->getValue().append( bc->getConstantColor().r() ); tcol->getValue().append( bc->getConstantColor().r() ); tcol->getValue().append( bc->getConstantColor().r() ); } else if ( bf != NULL ) { domCommon_transparent_type *ctt = daeSafeCast< domCommon_transparent_type >( phong->createAndPlace( "transparent" ) ); ctt->setOpaque( FX_OPAQUE_ENUM_A_ONE ); dtex = daeSafeCast< domCommon_color_or_texture_type_complexType::domTexture >( ctt->createAndPlace( "texture" ) ); #ifndef EARTH_TEX dtex->setTexture( sampName.c_str() ); #else dtex->setTexture( iName.c_str() ); #endif dtex->setTexcoord( "texcoord0" ); } } osg::Material *osgmat = static_cast<osg::Material*>(ssClean->getAttribute( osg::StateAttribute::MATERIAL )); if ( osgmat != NULL ) { const osg::Vec4 &eCol = osgmat->getEmissionFrontAndBack()?osgmat->getEmission( osg::Material::FRONT_AND_BACK ):osgmat->getEmission( osg::Material::FRONT ); const osg::Vec4 &aCol = osgmat->getAmbientFrontAndBack()?osgmat->getAmbient( osg::Material::FRONT_AND_BACK ):osgmat->getAmbient( osg::Material::FRONT ); const osg::Vec4 &dCol = osgmat->getDiffuseFrontAndBack()?osgmat->getDiffuse( osg::Material::FRONT_AND_BACK ):osgmat->getDiffuse( osg::Material::FRONT ); const osg::Vec4 &sCol = osgmat->getSpecularFrontAndBack()?osgmat->getSpecular( osg::Material::FRONT_AND_BACK ):osgmat->getSpecular( osg::Material::FRONT ); float shininess = osgmat->getShininessFrontAndBack()?osgmat->getShininess( osg::Material::FRONT_AND_BACK ):osgmat->getShininess( osg::Material::FRONT ); domCommon_color_or_texture_type *cot = daeSafeCast< domCommon_color_or_texture_type >( phong->createAndPlace( "emission" ) ); domCommon_color_or_texture_type_complexType::domColor *col = daeSafeCast< domCommon_color_or_texture_type_complexType::domColor >( cot->createAndPlace( "color" ) ); col->getValue().append( eCol.r() ); col->getValue().append( eCol.g() ); col->getValue().append( eCol.b() ); col->getValue().append( eCol.a() ); cot = daeSafeCast< domCommon_color_or_texture_type >( phong->createAndPlace( "ambient" ) ); col = daeSafeCast< domCommon_color_or_texture_type_complexType::domColor >( cot->createAndPlace( "color" ) ); col->getValue().append( aCol.r() ); col->getValue().append( aCol.g() ); col->getValue().append( aCol.b() ); col->getValue().append( aCol.a() ); //### check if we really have a texture if ( phong->getDiffuse() == NULL ) { cot = daeSafeCast< domCommon_color_or_texture_type >( phong->createAndPlace( "diffuse" ) ); col = daeSafeCast< domCommon_color_or_texture_type_complexType::domColor >( cot->createAndPlace( "color" ) ); col->getValue().append( dCol.r() ); col->getValue().append( dCol.g() ); col->getValue().append( dCol.b() ); col->getValue().append( dCol.a() ); } else { cot = phong->getDiffuse(); domCommon_color_or_texture_type_complexType::domTexture *dtex = cot->getTexture(); domExtra *extra = daeSafeCast< domExtra >( dtex->createAndPlace( COLLADA_ELEMENT_EXTRA ) ); extra->setType( "color" ); domTechnique *teq = daeSafeCast< domTechnique >( extra->createAndPlace( COLLADA_ELEMENT_TECHNIQUE ) ); teq->setProfile( "SCEI" ); domAny *any = (domAny*)(daeElement*)teq->createAndPlace( "color" ); std::ostringstream colVal; colVal << dCol.r() << " " << dCol.g() << " " << dCol.b() << " " << dCol.a(); any->setValue( colVal.str().c_str() ); } cot = daeSafeCast< domCommon_color_or_texture_type >( phong->createAndPlace( "specular" ) ); col = daeSafeCast< domCommon_color_or_texture_type_complexType::domColor >( cot->createAndPlace( "color" ) ); col->getValue().append( sCol.r() ); col->getValue().append( sCol.g() ); col->getValue().append( sCol.b() ); col->getValue().append( sCol.a() ); domCommon_float_or_param_type *fop = daeSafeCast< domCommon_float_or_param_type >( phong->createAndPlace( "shininess" ) ); domCommon_float_or_param_type_complexType::domFloat *f = daeSafeCast< domCommon_float_or_param_type_complexType::domFloat >( fop->createAndPlace( "float" ) ); f->setValue( shininess ); } materialMap.insert( std::make_pair( ssClean, mat ) ); } osg::StateSet* daeWriter::CleanStateSet(osg::StateSet* pStateSet) const { // TODO - clean out all the the attributes and modes not used to define materials osg::StateSet* pCleanedStateSet = new osg::StateSet; pCleanedStateSet->setTextureAttributeList(pStateSet->getTextureAttributeList()); if (NULL != pStateSet->getAttribute(osg::StateAttribute::BLENDFUNC)) pCleanedStateSet->setAttribute(pStateSet->getAttribute(osg::StateAttribute::BLENDFUNC)); if (NULL != pStateSet->getAttribute(osg::StateAttribute::BLENDCOLOR)) pCleanedStateSet->setAttribute(pStateSet->getAttribute(osg::StateAttribute::BLENDCOLOR)); if (NULL != pStateSet->getAttribute(osg::StateAttribute::MATERIAL)) pCleanedStateSet->setAttribute(pStateSet->getAttribute(osg::StateAttribute::MATERIAL)); return pCleanedStateSet; }
_______________________________________________ osg-users mailing list [email protected] http://openscenegraph.net/mailman/listinfo/osg-users http://www.openscenegraph.org/
