⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 daewmaterials.cpp

📁 最新osg包
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/* * 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 "ReaderWriterDAE.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"#endifusing 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" ) );        std::string fileURI = ReaderWriterDAE::ConvertFilePathToColladaCompatibleURI(osgDB::findDataFile(osgimg->getFileName()));       daeURI dd(*dae, fileURI);//fileURI.c_str() );        imgif->setValue( dd );        // The document URI should contain the canonical path it was created with        imgif->getValue().makeRelativeTo(doc->getDocumentURI());#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:        case osg::Texture::CLAMP_TO_EDGE:            wrap_s->setValue( FX_SAMPLER_WRAP_COMMON_CLAMP );            break;        case osg::Texture::CLAMP_TO_BORDER:            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:        case osg::Texture::CLAMP_TO_EDGE:            wrap_t->setValue( FX_SAMPLER_WRAP_COMMON_CLAMP );            break;        case osg::Texture::CLAMP_TO_BORDER:            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:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -