diff --git a/components/nifogre/ogre_nif_loader.cpp b/components/nifogre/ogre_nif_loader.cpp index 26a18b6b44..d1102087d8 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 6080431c8c..3a1b8e2aef 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 0000000000..e69de29bb2 diff --git a/files/materials/atmosphere.shaderset b/files/materials/atmosphere.shaderset new file mode 100644 index 0000000000..e69de29bb2 diff --git a/files/materials/clouds.shader b/files/materials/clouds.shader new file mode 100644 index 0000000000..e69de29bb2 diff --git a/files/materials/clouds.shaderset b/files/materials/clouds.shaderset new file mode 100644 index 0000000000..e69de29bb2 diff --git a/files/materials/moon.shader b/files/materials/moon.shader new file mode 100644 index 0000000000..e69de29bb2 diff --git a/files/materials/moon.shaderset b/files/materials/moon.shaderset new file mode 100644 index 0000000000..e69de29bb2 diff --git a/files/materials/objects.mat b/files/materials/objects.mat index 69b89a7e51..3fcc12d62b 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 08e9913d98..9ec09840d4 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 0000000000..a828164389 --- /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 0000000000..e69de29bb2 diff --git a/files/materials/sun.shaderset b/files/materials/sun.shaderset new file mode 100644 index 0000000000..e69de29bb2 diff --git a/files/materials/water.mat b/files/materials/water.mat new file mode 100644 index 0000000000..c701e5ffe1 --- /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 0000000000..e69de29bb2 diff --git a/files/materials/water.shaderset b/files/materials/water.shaderset new file mode 100644 index 0000000000..e69de29bb2