From 9bd888d9a1a6572222bfa5f1a29e3cf840590b58 Mon Sep 17 00:00:00 2001 From: scrawl Date: Thu, 5 Jul 2012 00:39:25 +0200 Subject: [PATCH] transparency --- components/nifogre/ogre_nif_loader.cpp | 27 ++++++++++ extern/shiny | 2 +- files/materials/atmosphere.shader | 0 files/materials/atmosphere.shaderset | 0 files/materials/clouds.shader | 0 files/materials/clouds.shaderset | 0 files/materials/moon.shader | 0 files/materials/moon.shaderset | 0 files/materials/objects.mat | 7 +++ files/materials/objects.shader | 12 ++--- files/materials/sky.mat | 73 ++++++++++++++++++++++++++ files/materials/sun.shader | 0 files/materials/sun.shaderset | 0 files/materials/water.mat | 30 +++++++++++ files/materials/water.shader | 0 files/materials/water.shaderset | 0 16 files changed, 144 insertions(+), 7 deletions(-) create mode 100644 files/materials/atmosphere.shader create mode 100644 files/materials/atmosphere.shaderset create mode 100644 files/materials/clouds.shader create mode 100644 files/materials/clouds.shaderset create mode 100644 files/materials/moon.shader create mode 100644 files/materials/moon.shaderset create mode 100644 files/materials/sky.mat create mode 100644 files/materials/sun.shader create mode 100644 files/materials/sun.shaderset create mode 100644 files/materials/water.mat create mode 100644 files/materials/water.shader create mode 100644 files/materials/water.shaderset diff --git a/components/nifogre/ogre_nif_loader.cpp b/components/nifogre/ogre_nif_loader.cpp index 26a18b6b4..d1102087d 100644 --- a/components/nifogre/ogre_nif_loader.cpp +++ b/components/nifogre/ogre_nif_loader.cpp @@ -246,6 +246,33 @@ void NIFLoader::createMaterial(const String &name, instance->setProperty ("diffuseMap", sh::makeProperty(texName)); + // Add transparency if NiAlphaProperty was present + if (alphaFlags != -1) + { + // The 237 alpha flags are by far the most common. Check + // NiAlphaProperty in nif/property.h if you need to decode + // other values. 237 basically means normal transparencly. + if (alphaFlags == 237) + { + NifOverrides::TransparencyResult result = NifOverrides::Overrides::getTransparencyOverride(texName); + if (result.first) + { + instance->setProperty("alpha_rejection_func", sh::makeProperty(new sh::StringValue("greater_equal"))); + instance->setProperty("alpha_rejection_value", sh::makeProperty(new sh::IntValue(result.second))); + } + else + { + // Enable transparency + instance->setProperty("scene_blend", sh::makeProperty(new sh::StringValue("alpha_blend"))); + instance->setProperty("depth_write", sh::makeProperty(new sh::BooleanValue(false))); + } + } + else + warn("Unhandled alpha setting for texture " + texName); + + } + + /* if (!texName.empty()) { diff --git a/extern/shiny b/extern/shiny index 6080431c8..3a1b8e2ae 160000 --- a/extern/shiny +++ b/extern/shiny @@ -1 +1 @@ -Subproject commit 6080431c8ce37c6044dd7d1e319de3c7b8adfd69 +Subproject commit 3a1b8e2aefa746ef0922e78f4be3ff736ce92fc3 diff --git a/files/materials/atmosphere.shader b/files/materials/atmosphere.shader new file mode 100644 index 000000000..e69de29bb diff --git a/files/materials/atmosphere.shaderset b/files/materials/atmosphere.shaderset new file mode 100644 index 000000000..e69de29bb diff --git a/files/materials/clouds.shader b/files/materials/clouds.shader new file mode 100644 index 000000000..e69de29bb diff --git a/files/materials/clouds.shaderset b/files/materials/clouds.shaderset new file mode 100644 index 000000000..e69de29bb diff --git a/files/materials/moon.shader b/files/materials/moon.shader new file mode 100644 index 000000000..e69de29bb diff --git a/files/materials/moon.shaderset b/files/materials/moon.shaderset new file mode 100644 index 000000000..e69de29bb diff --git a/files/materials/objects.mat b/files/materials/objects.mat index 69b89a7e5..3fcc12d62 100644 --- a/files/materials/objects.mat +++ b/files/materials/objects.mat @@ -7,7 +7,11 @@ material openmw_objects_base has_vertex_colour false diffuseMap black.png fog true + is_transparent false // real transparency, alpha rejection doesn't count here + scene_blend default + alpha_rejection_value default + alpha_rejection_func default pass { @@ -24,6 +28,9 @@ material openmw_objects_base has_vertex_colour $has_vertex_colour is_transparent $is_transparent + scene_blend $scene_blend + alpha_rejection_value $alpha_rejection_value + alpha_rejection_func $alpha_rejection_func texture_unit diffuseMap { diff --git a/files/materials/objects.shader b/files/materials/objects.shader index 08e9913d9..9ec09840d 100644 --- a/files/materials/objects.shader +++ b/files/materials/objects.shader @@ -20,17 +20,17 @@ shOutput(float2, UV) shNormalInput(float4) shOutput(float4, normalPassthrough) - #ifdef NEED_DEPTH +#ifdef NEED_DEPTH shOutput(float, depthPassthrough) - #endif +#endif SH_START_PROGRAM { shOutputPosition = shMatrixMult(wvp, shInputPosition); UV = uv0; normalPassthrough = normal; - #ifdef NEED_DEPTH +#ifdef NEED_DEPTH depthPassthrough = shOutputPosition.z; - #endif +#endif } #else @@ -41,9 +41,9 @@ shDeclareMrtOutput(1) shInput(float4, normalPassthrough) - #ifdef NEED_DEPTH +#ifdef NEED_DEPTH shInput(float, depthPassthrough) - #endif +#endif shUniform(float far) @shAutoConstant(far, far_clip_distance) diff --git a/files/materials/sky.mat b/files/materials/sky.mat new file mode 100644 index 000000000..a82816438 --- /dev/null +++ b/files/materials/sky.mat @@ -0,0 +1,73 @@ +material openmw_moon +{ + pass + { + vertex_program moon_vertex + fragment_program moon_fragment + + texture_unit diffuseMap + { + texture $diffuseMap + create_in_ffp true + } + } +} + +material openmw_clouds +{ + pass + { + vertex_program clouds_vertex + fragment_program clouds_fragment + + // second diffuse map is used for weather transitions + texture_unit diffuseMap1 + { + texture $diffuseMap1 + create_in_ffp true + } + + texture_unit diffuseMap2 + { + texture $diffuseMap2 + } + } +} + +material openmw_atmosphere +{ + pass + { + vertex_program atmosphere_vertex + fragment_program atmosphere_fragment + } +} + +material openmw_stars +{ + pass + { + vertex_program stars_vertex + fragment_program stars_fragment + + texture_unit diffuseMap + { + diffuseMap $diffuseMap + } + } +} + +// used for both sun and sun glare +material openmw_sun +{ + pass + { + vertex_program sun_vertex + fragment_program sun_fragment + + texture unit diffuseMap + { + diffuseMap $diffuseMap + } + } +} diff --git a/files/materials/sun.shader b/files/materials/sun.shader new file mode 100644 index 000000000..e69de29bb diff --git a/files/materials/sun.shaderset b/files/materials/sun.shaderset new file mode 100644 index 000000000..e69de29bb diff --git a/files/materials/water.mat b/files/materials/water.mat new file mode 100644 index 000000000..c701e5ffe --- /dev/null +++ b/files/materials/water.mat @@ -0,0 +1,30 @@ +// note: the fixed function water is created manually, not here + +material openmw_water +{ + pass + { + vertex_program water_vertex + fragment_program water_fragment + + texture_unit reflectionMap + { + texture_alias WaterReflection + } + + texture_unit refractionMap + { + texture_alias WaterRefraction + } + + texture_unit depthMap + { + + } + + texture_unit normalMap + { + texture + } + } +} diff --git a/files/materials/water.shader b/files/materials/water.shader new file mode 100644 index 000000000..e69de29bb diff --git a/files/materials/water.shaderset b/files/materials/water.shaderset new file mode 100644 index 000000000..e69de29bb