More consistent indentation.
This commit is contained in:
+200
-202
@@ -121,218 +121,216 @@ SGMaterial::read_properties(const SGReaderWriterOptions* options,
|
|||||||
const SGPropertyNode *props,
|
const SGPropertyNode *props,
|
||||||
SGPropertyNode *prop_root)
|
SGPropertyNode *prop_root)
|
||||||
{
|
{
|
||||||
std::vector<bool> dds;
|
std::vector<bool> dds;
|
||||||
std::vector<SGPropertyNode_ptr> textures = props->getChildren("texture");
|
std::vector<SGPropertyNode_ptr> textures = props->getChildren("texture");
|
||||||
for (unsigned int i = 0; i < textures.size(); i++)
|
for (unsigned int i = 0; i < textures.size(); i++)
|
||||||
{
|
|
||||||
string tname = textures[i]->getStringValue();
|
|
||||||
|
|
||||||
if (tname.empty()) {
|
|
||||||
tname = "unknown.rgb";
|
|
||||||
}
|
|
||||||
|
|
||||||
SGPath tpath("Textures.high");
|
|
||||||
tpath.append(tname);
|
|
||||||
string fullTexPath = SGModelLib::findDataFile(tpath.str(), options);
|
|
||||||
if (fullTexPath.empty()) {
|
|
||||||
tpath = SGPath("Textures");
|
|
||||||
tpath.append(tname);
|
|
||||||
fullTexPath = SGModelLib::findDataFile(tpath.str(), options);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tpath.lower_extension() == "dds") {
|
|
||||||
dds.push_back(true);
|
|
||||||
} else {
|
|
||||||
dds.push_back(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!fullTexPath.empty() ) {
|
|
||||||
_internal_state st( NULL, fullTexPath, false, options );
|
|
||||||
_status.push_back( st );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<SGPropertyNode_ptr> texturesets = props->getChildren("texture-set");
|
|
||||||
for (unsigned int i = 0; i < texturesets.size(); i++)
|
|
||||||
{
|
|
||||||
_internal_state st( NULL, false, options );
|
|
||||||
std::vector<SGPropertyNode_ptr> textures = texturesets[i]->getChildren("texture");
|
|
||||||
for (unsigned int j = 0; j < textures.size(); j++)
|
|
||||||
{
|
{
|
||||||
string tname = textures[j]->getStringValue();
|
string tname = textures[i]->getStringValue();
|
||||||
if (tname.empty()) {
|
|
||||||
tname = "unknown.rgb";
|
|
||||||
}
|
|
||||||
|
|
||||||
SGPath tpath("Textures.high");
|
if (tname.empty()) {
|
||||||
tpath.append(tname);
|
tname = "unknown.rgb";
|
||||||
string fullTexPath = SGModelLib::findDataFile(tpath.str(), options);
|
}
|
||||||
if (fullTexPath.empty()) {
|
|
||||||
tpath = SGPath("Textures");
|
SGPath tpath("Textures.high");
|
||||||
tpath.append(tname);
|
tpath.append(tname);
|
||||||
fullTexPath = SGModelLib::findDataFile(tpath.str(), options);
|
string fullTexPath = SGModelLib::findDataFile(tpath.str(), options);
|
||||||
}
|
if (fullTexPath.empty()) {
|
||||||
|
tpath = SGPath("Textures");
|
||||||
if (j == 0) {
|
tpath.append(tname);
|
||||||
|
fullTexPath = SGModelLib::findDataFile(tpath.str(), options);
|
||||||
|
}
|
||||||
|
|
||||||
if (tpath.lower_extension() == "dds") {
|
if (tpath.lower_extension() == "dds") {
|
||||||
dds.push_back(true);
|
dds.push_back(true);
|
||||||
} else {
|
} else {
|
||||||
dds.push_back(false);
|
dds.push_back(false);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
st.add_texture(fullTexPath, textures[j]->getIndex());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!st.texture_paths.empty() ) {
|
|
||||||
_status.push_back( st );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (textures.size() == 0 && texturesets.size() == 0) {
|
|
||||||
SGPath tpath("Textures");
|
|
||||||
tpath.append("Terrain");
|
|
||||||
tpath.append("unknown.rgb");
|
|
||||||
_internal_state st( NULL, tpath.str(), true, options );
|
|
||||||
_status.push_back( st );
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<SGPropertyNode_ptr> masks = props->getChildren("object-mask");
|
|
||||||
for (unsigned int i = 0; i < masks.size(); i++)
|
|
||||||
{
|
|
||||||
string omname = masks[i]->getStringValue();
|
|
||||||
|
|
||||||
if (! omname.empty()) {
|
|
||||||
SGPath ompath("Textures.high");
|
|
||||||
ompath.append(omname);
|
|
||||||
string fullMaskPath = SGModelLib::findDataFile(ompath.str(), options);
|
|
||||||
|
|
||||||
if (fullMaskPath.empty()) {
|
|
||||||
ompath = SGPath("Textures");
|
|
||||||
ompath.append(omname);
|
|
||||||
fullMaskPath = SGModelLib::findDataFile(ompath.str(), options);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fullMaskPath.empty()) {
|
|
||||||
SG_LOG(SG_GENERAL, SG_ALERT, "Cannot find texture file \""
|
|
||||||
<< ompath.str() << "\"");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
osg::Image* image = osgDB::readImageFile(fullMaskPath, options);
|
|
||||||
if (image && image->valid())
|
|
||||||
{
|
|
||||||
osg::Texture2D* object_mask = new osg::Texture2D;
|
|
||||||
|
|
||||||
bool dds_mask = (ompath.lower_extension() == "dds");
|
|
||||||
|
|
||||||
if (dds[i] != dds_mask) {
|
|
||||||
// Texture format does not match mask format. This is relevant for
|
|
||||||
// the object mask, as DDS textures have an origin at the bottom
|
|
||||||
// left rather than top left, therefore we flip the object mask
|
|
||||||
// vertically.
|
|
||||||
image->flipVertical();
|
|
||||||
}
|
|
||||||
|
|
||||||
object_mask->setImage(image);
|
|
||||||
|
|
||||||
// We force the filtering to be nearest, as the red channel (rotation)
|
|
||||||
// in particular, doesn't make sense to be interpolated between pixels.
|
|
||||||
object_mask->setFilter(osg::Texture::MIN_FILTER, osg::Texture::NEAREST);
|
|
||||||
object_mask->setFilter(osg::Texture::MAG_FILTER, osg::Texture::NEAREST);
|
|
||||||
|
|
||||||
object_mask->setDataVariance(osg::Object::STATIC);
|
if (!fullTexPath.empty() ) {
|
||||||
object_mask->setWrap(osg::Texture::WRAP_S, osg::Texture::REPEAT);
|
_internal_state st( NULL, fullTexPath, false, options );
|
||||||
object_mask->setWrap(osg::Texture::WRAP_T, osg::Texture::REPEAT);
|
_status.push_back( st );
|
||||||
_masks.push_back(object_mask);
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
xsize = props->getDoubleValue("xsize", 0.0);
|
std::vector<SGPropertyNode_ptr> texturesets = props->getChildren("texture-set");
|
||||||
ysize = props->getDoubleValue("ysize", 0.0);
|
for (unsigned int i = 0; i < texturesets.size(); i++)
|
||||||
wrapu = props->getBoolValue("wrapu", true);
|
{
|
||||||
wrapv = props->getBoolValue("wrapv", true);
|
_internal_state st( NULL, false, options );
|
||||||
mipmap = props->getBoolValue("mipmap", true);
|
std::vector<SGPropertyNode_ptr> textures = texturesets[i]->getChildren("texture");
|
||||||
light_coverage = props->getDoubleValue("light-coverage", 0.0);
|
for (unsigned int j = 0; j < textures.size(); j++)
|
||||||
wood_coverage = props->getDoubleValue("wood-coverage", 0.0);
|
{
|
||||||
tree_height = props->getDoubleValue("tree-height-m", 0.0);
|
string tname = textures[j]->getStringValue();
|
||||||
tree_width = props->getDoubleValue("tree-width-m", 0.0);
|
if (tname.empty()) {
|
||||||
tree_range = props->getDoubleValue("tree-range-m", 0.0);
|
tname = "unknown.rgb";
|
||||||
tree_varieties = props->getIntValue("tree-varieties", 1);
|
}
|
||||||
|
|
||||||
const SGPropertyNode* treeTexNode = props->getChild("tree-texture");
|
SGPath tpath("Textures.high");
|
||||||
|
tpath.append(tname);
|
||||||
if (treeTexNode) {
|
string fullTexPath = SGModelLib::findDataFile(tpath.str(), options);
|
||||||
string treeTexPath = props->getStringValue("tree-texture");
|
if (fullTexPath.empty()) {
|
||||||
|
tpath = SGPath("Textures");
|
||||||
|
tpath.append(tname);
|
||||||
|
fullTexPath = SGModelLib::findDataFile(tpath.str(), options);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (j == 0) {
|
||||||
|
if (tpath.lower_extension() == "dds") {
|
||||||
|
dds.push_back(true);
|
||||||
|
} else {
|
||||||
|
dds.push_back(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
st.add_texture(fullTexPath, textures[j]->getIndex());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!st.texture_paths.empty() ) {
|
||||||
|
_status.push_back( st );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (textures.size() == 0 && texturesets.size() == 0) {
|
||||||
|
SGPath tpath("Textures");
|
||||||
|
tpath.append("Terrain");
|
||||||
|
tpath.append("unknown.rgb");
|
||||||
|
_internal_state st( NULL, tpath.str(), true, options );
|
||||||
|
_status.push_back( st );
|
||||||
|
}
|
||||||
|
|
||||||
if (! treeTexPath.empty()) {
|
std::vector<SGPropertyNode_ptr> masks = props->getChildren("object-mask");
|
||||||
SGPath treePath("Textures.high");
|
for (unsigned int i = 0; i < masks.size(); i++)
|
||||||
treePath.append(treeTexPath);
|
{
|
||||||
tree_texture = SGModelLib::findDataFile(treePath.str(), options);
|
string omname = masks[i]->getStringValue();
|
||||||
|
|
||||||
if (tree_texture.empty()) {
|
if (! omname.empty()) {
|
||||||
treePath = SGPath("Textures");
|
SGPath ompath("Textures.high");
|
||||||
treePath.append(treeTexPath);
|
ompath.append(omname);
|
||||||
tree_texture = SGModelLib::findDataFile(treePath.str(), options);
|
string fullMaskPath = SGModelLib::findDataFile(ompath.str(), options);
|
||||||
}
|
|
||||||
|
if (fullMaskPath.empty()) {
|
||||||
|
ompath = SGPath("Textures");
|
||||||
|
ompath.append(omname);
|
||||||
|
fullMaskPath = SGModelLib::findDataFile(ompath.str(), options);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fullMaskPath.empty()) {
|
||||||
|
SG_LOG(SG_GENERAL, SG_ALERT, "Cannot find texture file \""
|
||||||
|
<< ompath.str() << "\"");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
osg::Image* image = osgDB::readImageFile(fullMaskPath, options);
|
||||||
|
if (image && image->valid())
|
||||||
|
{
|
||||||
|
osg::Texture2D* object_mask = new osg::Texture2D;
|
||||||
|
|
||||||
|
bool dds_mask = (ompath.lower_extension() == "dds");
|
||||||
|
|
||||||
|
if (dds[i] != dds_mask) {
|
||||||
|
// Texture format does not match mask format. This is relevant for
|
||||||
|
// the object mask, as DDS textures have an origin at the bottom
|
||||||
|
// left rather than top left, therefore we flip the object mask
|
||||||
|
// vertically.
|
||||||
|
image->flipVertical();
|
||||||
|
}
|
||||||
|
|
||||||
|
object_mask->setImage(image);
|
||||||
|
|
||||||
|
// We force the filtering to be nearest, as the red channel (rotation)
|
||||||
|
// in particular, doesn't make sense to be interpolated between pixels.
|
||||||
|
object_mask->setFilter(osg::Texture::MIN_FILTER, osg::Texture::NEAREST);
|
||||||
|
object_mask->setFilter(osg::Texture::MAG_FILTER, osg::Texture::NEAREST);
|
||||||
|
|
||||||
|
object_mask->setDataVariance(osg::Object::STATIC);
|
||||||
|
object_mask->setWrap(osg::Texture::WRAP_S, osg::Texture::REPEAT);
|
||||||
|
object_mask->setWrap(osg::Texture::WRAP_T, osg::Texture::REPEAT);
|
||||||
|
_masks.push_back(object_mask);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// surface values for use with ground reactions
|
|
||||||
solid = props->getBoolValue("solid", true);
|
|
||||||
friction_factor = props->getDoubleValue("friction-factor", 1.0);
|
|
||||||
rolling_friction = props->getDoubleValue("rolling-friction", 0.02);
|
|
||||||
bumpiness = props->getDoubleValue("bumpiness", 0.0);
|
|
||||||
load_resistance = props->getDoubleValue("load-resistance", 1e30);
|
|
||||||
|
|
||||||
// Taken from default values as used in ac3d
|
xsize = props->getDoubleValue("xsize", 0.0);
|
||||||
ambient[0] = props->getDoubleValue("ambient/r", 0.2);
|
ysize = props->getDoubleValue("ysize", 0.0);
|
||||||
ambient[1] = props->getDoubleValue("ambient/g", 0.2);
|
wrapu = props->getBoolValue("wrapu", true);
|
||||||
ambient[2] = props->getDoubleValue("ambient/b", 0.2);
|
wrapv = props->getBoolValue("wrapv", true);
|
||||||
ambient[3] = props->getDoubleValue("ambient/a", 1.0);
|
mipmap = props->getBoolValue("mipmap", true);
|
||||||
|
light_coverage = props->getDoubleValue("light-coverage", 0.0);
|
||||||
|
wood_coverage = props->getDoubleValue("wood-coverage", 0.0);
|
||||||
|
tree_height = props->getDoubleValue("tree-height-m", 0.0);
|
||||||
|
tree_width = props->getDoubleValue("tree-width-m", 0.0);
|
||||||
|
tree_range = props->getDoubleValue("tree-range-m", 0.0);
|
||||||
|
tree_varieties = props->getIntValue("tree-varieties", 1);
|
||||||
|
|
||||||
diffuse[0] = props->getDoubleValue("diffuse/r", 0.8);
|
const SGPropertyNode* treeTexNode = props->getChild("tree-texture");
|
||||||
diffuse[1] = props->getDoubleValue("diffuse/g", 0.8);
|
|
||||||
diffuse[2] = props->getDoubleValue("diffuse/b", 0.8);
|
if (treeTexNode) {
|
||||||
diffuse[3] = props->getDoubleValue("diffuse/a", 1.0);
|
string treeTexPath = props->getStringValue("tree-texture");
|
||||||
|
|
||||||
specular[0] = props->getDoubleValue("specular/r", 0.0);
|
if (! treeTexPath.empty()) {
|
||||||
specular[1] = props->getDoubleValue("specular/g", 0.0);
|
SGPath treePath("Textures.high");
|
||||||
specular[2] = props->getDoubleValue("specular/b", 0.0);
|
treePath.append(treeTexPath);
|
||||||
specular[3] = props->getDoubleValue("specular/a", 1.0);
|
tree_texture = SGModelLib::findDataFile(treePath.str(), options);
|
||||||
|
|
||||||
emission[0] = props->getDoubleValue("emissive/r", 0.0);
|
if (tree_texture.empty()) {
|
||||||
emission[1] = props->getDoubleValue("emissive/g", 0.0);
|
treePath = SGPath("Textures");
|
||||||
emission[2] = props->getDoubleValue("emissive/b", 0.0);
|
treePath.append(treeTexPath);
|
||||||
emission[3] = props->getDoubleValue("emissive/a", 1.0);
|
tree_texture = SGModelLib::findDataFile(treePath.str(), options);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
shininess = props->getDoubleValue("shininess", 1.0);
|
// surface values for use with ground reactions
|
||||||
|
solid = props->getBoolValue("solid", true);
|
||||||
|
friction_factor = props->getDoubleValue("friction-factor", 1.0);
|
||||||
|
rolling_friction = props->getDoubleValue("rolling-friction", 0.02);
|
||||||
|
bumpiness = props->getDoubleValue("bumpiness", 0.0);
|
||||||
|
load_resistance = props->getDoubleValue("load-resistance", 1e30);
|
||||||
|
|
||||||
if (props->hasChild("effect"))
|
// Taken from default values as used in ac3d
|
||||||
effect = props->getStringValue("effect");
|
ambient[0] = props->getDoubleValue("ambient/r", 0.2);
|
||||||
|
ambient[1] = props->getDoubleValue("ambient/g", 0.2);
|
||||||
std::vector<SGPropertyNode_ptr> object_group_nodes =
|
ambient[2] = props->getDoubleValue("ambient/b", 0.2);
|
||||||
((SGPropertyNode *)props)->getChildren("object-group");
|
ambient[3] = props->getDoubleValue("ambient/a", 1.0);
|
||||||
for (unsigned int i = 0; i < object_group_nodes.size(); i++)
|
|
||||||
object_groups.push_back(new SGMatModelGroup(object_group_nodes[i]));
|
|
||||||
|
|
||||||
// read glyph table for taxi-/runway-signs
|
diffuse[0] = props->getDoubleValue("diffuse/r", 0.8);
|
||||||
std::vector<SGPropertyNode_ptr> glyph_nodes = props->getChildren("glyph");
|
diffuse[1] = props->getDoubleValue("diffuse/g", 0.8);
|
||||||
for (unsigned int i = 0; i < glyph_nodes.size(); i++) {
|
diffuse[2] = props->getDoubleValue("diffuse/b", 0.8);
|
||||||
const char *name = glyph_nodes[i]->getStringValue("name");
|
diffuse[3] = props->getDoubleValue("diffuse/a", 1.0);
|
||||||
if (name)
|
|
||||||
glyphs[name] = new SGMaterialGlyph(glyph_nodes[i]);
|
specular[0] = props->getDoubleValue("specular/r", 0.0);
|
||||||
}
|
specular[1] = props->getDoubleValue("specular/g", 0.0);
|
||||||
|
specular[2] = props->getDoubleValue("specular/b", 0.0);
|
||||||
// Read conditions node
|
specular[3] = props->getDoubleValue("specular/a", 1.0);
|
||||||
const SGPropertyNode *conditionNode = props->getChild("condition");
|
|
||||||
if (conditionNode) {
|
emission[0] = props->getDoubleValue("emissive/r", 0.0);
|
||||||
condition = sgReadCondition(prop_root, conditionNode);
|
emission[1] = props->getDoubleValue("emissive/g", 0.0);
|
||||||
}
|
emission[2] = props->getDoubleValue("emissive/b", 0.0);
|
||||||
|
emission[3] = props->getDoubleValue("emissive/a", 1.0);
|
||||||
|
|
||||||
|
shininess = props->getDoubleValue("shininess", 1.0);
|
||||||
|
|
||||||
|
if (props->hasChild("effect"))
|
||||||
|
effect = props->getStringValue("effect");
|
||||||
|
|
||||||
|
std::vector<SGPropertyNode_ptr> object_group_nodes =
|
||||||
|
((SGPropertyNode *)props)->getChildren("object-group");
|
||||||
|
for (unsigned int i = 0; i < object_group_nodes.size(); i++)
|
||||||
|
object_groups.push_back(new SGMatModelGroup(object_group_nodes[i]));
|
||||||
|
|
||||||
|
// read glyph table for taxi-/runway-signs
|
||||||
|
std::vector<SGPropertyNode_ptr> glyph_nodes = props->getChildren("glyph");
|
||||||
|
for (unsigned int i = 0; i < glyph_nodes.size(); i++) {
|
||||||
|
const char *name = glyph_nodes[i]->getStringValue("name");
|
||||||
|
if (name)
|
||||||
|
glyphs[name] = new SGMaterialGlyph(glyph_nodes[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read conditions node
|
||||||
|
const SGPropertyNode *conditionNode = props->getChild("condition");
|
||||||
|
if (conditionNode) {
|
||||||
|
condition = sgReadCondition(prop_root, conditionNode);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -406,9 +404,9 @@ osg::Texture2D* SGMaterial::get_object_mask(SGTexturedTriangleBin triangleBin)
|
|||||||
// so we index based on the texture index,
|
// so we index based on the texture index,
|
||||||
unsigned int i = triangleBin.getTextureIndex() % _status.size();
|
unsigned int i = triangleBin.getTextureIndex() % _status.size();
|
||||||
if (i < _masks.size()) {
|
if (i < _masks.size()) {
|
||||||
return _masks[i];
|
return _masks[i];
|
||||||
} else {
|
} else {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -459,12 +457,12 @@ void SGMaterial::buildEffectProperties(const SGReaderWriterOptions* options)
|
|||||||
|
|
||||||
SGMaterialGlyph* SGMaterial::get_glyph (const string& name) const
|
SGMaterialGlyph* SGMaterial::get_glyph (const string& name) const
|
||||||
{
|
{
|
||||||
map<string, SGSharedPtr<SGMaterialGlyph> >::const_iterator it;
|
map<string, SGSharedPtr<SGMaterialGlyph> >::const_iterator it;
|
||||||
it = glyphs.find(name);
|
it = glyphs.find(name);
|
||||||
if (it == glyphs.end())
|
if (it == glyphs.end())
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return it->second;
|
return it->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -480,10 +478,10 @@ SGMaterialGlyph::SGMaterialGlyph(SGPropertyNode *p) :
|
|||||||
|
|
||||||
void
|
void
|
||||||
SGSetTextureFilter( int max) {
|
SGSetTextureFilter( int max) {
|
||||||
SGSceneFeatures::instance()->setTextureFilter( max);
|
SGSceneFeatures::instance()->setTextureFilter( max);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
SGGetTextureFilter() {
|
SGGetTextureFilter() {
|
||||||
return SGSceneFeatures::instance()->getTextureFilter();
|
return SGSceneFeatures::instance()->getTextureFilter();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user