ShaderMirror
From SimsWiki
version 4 set reflectionRenderTarget "ScreenReflection" set mvAspect 1 define SimpleMirrorReflection() material if (viewerRenderType = $kRenderTypeShadow) create StandardShaderShadow() else if (viewerRenderType = $kRenderTypeThumbnail) create BlankMirrorMaterial($kRenderTypeThumbnail) else if (not $mirrorReflectionsEnabled) set currentType (viewerRenderType) create BlankMirrorMaterial($currentType) else create MirrorReflectionMaterial() endif endif endif end enddef define BlankMirrorMaterial(renderType) shader validateRenderShaderContext -viewerRenderType &renderType pass shaderProgram -target vertexProgram -method assemble bindConstants 0 -bindingID geomToClip -constantCount 4 shaderSource vs_1_1 dcl_position v0 m4x4 oPos, v0, c0 endShaderSource end colorScalar (0.5,0.6,0.75, 1) stage textureBlend select(colorScalar) select(colorScalar) end end end enddef define MirrorReflectionMaterial() shader -layer -9998 # this material must render first validateRenderShaderContext -viewerRenderType $kRenderTypeMirror # reflection render pass -renderEachFrame renderTarget $reflectionRenderTarget -setViewport viewportFromParentRenderContext depthTest true -enableDepthWrite true applyStencilStateForOverlappingReflections alphaBlend srcFactor(zero) add dstFactor(one) cullmode none shaderProgram -target vertexProgram -method assemble bindConstants 0 -bindingID geomToClipFromParentView -constantCount 4 shaderSource vs_1_1 dcl_position v0 def c5, 1,0,0,1 m4x4 r0, v0, c0 mov oPos.x, -r0 mov oPos.yzw, r0 endShaderSource end end end shader -layer 6 validateRenderShaderContext -viewerRenderType $kRenderTypeNormal pass -modifiedEachFrameHint shaderProgram -target vertexProgram -method assemble bindConstants 0 -bindingID geomToClip -constantCount 4 bindConstants 4 -bindingID clipToViewTarget -constantCount 4 shaderSource vs_1_1 dcl_position v0 def c8, -0.5, -0.5, 1, 1 def c9, 0.5, 0.5, 0, 0 def c10, 0.25, 0.25, 0, 0 m4x4 r0, v0, c0 mov oPos, r0 mul r2, c9, r0.w mad r4, r0, c8, r2 rcp r3.x, c4.x rcp r3.y, c5.y mov r3.zw, c9.zw mul r3, r3, c10 mad r6, r0, r3, r4 mov oT0, r6.xyww endShaderSource end stage textureTransformType vector3 homogeneous textureAddressing clamp clamp texture $reflectionRenderTarget textureBlend select(texture) select(texture) end end end shader -layer 6 validateRenderShaderContext -viewerRenderType $kRenderTypeNormal pass -modifiedEachFrameHint shaderProgram -target vertexProgram -method assemble bindConstants 0 -bindingID geomToClip -constantCount 4 bindConstants 4 -bindingID clipToViewTarget -constantCount 4 shaderSource vs_1_1 dcl_position v0 def c8, -0.5, -0.5, 1, 1 def c9, 0.5, 0.5, 0, 0 def c10, 0.25, 0.25, 0, 0 m4x4 r0, v0, c0 mov oPos, r0 mul r2, c9, r0.w mad r4, r0, c8, r2 rcp r3.x, c4.x rcp r3.y, c5.y mov r3.zw, c9.zw mul r3, r3, c10 mad r1, r0, r3, r4 rcp r1.w, r1.w mul oT0.xy, r1.w, r1.xy endShaderSource end stage textureAddressing clamp clamp texture $reflectionRenderTarget textureBlend select(texture) select(texture) end end end enddef define SetSpecifiedZOnMirrorRTT(zValue) material shader pass renderClipSpaceRect renderTarget $reflectionRenderTarget -setViewport fullRenderTargetViewport stencil false depthTest true -enableDepthWrite true depthTestFunction accept alphaBlend srcFactor(zero) add dstFactor(one) shaderProgram -target vertexProgram -method compile -version 1_1 bindConstants 0 -bindingID immediateData -data (0,0,&zValue, 0) shaderSource float4 zValue : register(c0); void VertexMain(float4 position : POSITION, out float4 oPosition : POSITION) { oPosition = position; oPosition.z = zValue.z; // set specified z value } endShaderSource end end end end enddef define SetNearZOnMirrorRTT() create SetSpecifiedZOnMirrorRTT(0) enddef define SetFarZOnMirrorRTT() create SetSpecifiedZOnMirrorRTT(1) enddef define SetStencilOnCensorRTT() material shader pass renderClipSpaceRect stencil true stencilFunction accept -refValue 1 stencilOperation -onPass writeRef depthTest false -enableDepthWrite false depthTestFunction accept alphaBlend srcFactor(zero) add dstFactor(one) shaderProgram -target vertexProgram -method assemble shaderSource vs_1_1 dcl_position v0 mov oPos, v0 endShaderSource end stage textureBlend select(colorScalar) select(colorScalar) end end end end enddef defaultState $kRenderTypeMirror stencil true stencilFunction acceptIfEqual -refValue 1 stencilOperation -onPass noWrite end defaultState $kRenderTypeNormal stencil true stencilFunction acceptIfEqual -refValue 0 stencilOperation -onPass noWrite end #---------------------------------------------------------------------------------------------------------------# define TransparentMirrorReflection() material if (viewerRenderType = $kRenderTypeShadow) create StandardShaderShadow() else if (viewerRenderType = $kRenderTypeThumbnail) create TransparentBlankMirrorMaterial($kRenderTypeThumbnail) else if (not $mirrorReflectionsEnabled) set currentType (viewerRenderType) create TransparentBlankMirrorMaterial($currentType) else create TransparentMirrorReflectionMaterial() endif endif endif end enddef define TransparentBlankMirrorMaterial(renderType) shader validateRenderShaderContext -viewerRenderType &renderType pass shaderProgram -target vertexProgram -method assemble bindConstants 0 -bindingID geomToClip -constantCount 4 shaderSource vs_1_1 dcl_position v0 m4x4 oPos, v0, c0 endShaderSource end colorScalar (0,0,0) 0.5 stage textureBlend select(colorScalar) select(colorScalar) end end end enddef define TransparentMirrorReflectionMaterial() shader -layer -9998 # this material must render first validateRenderShaderContext -viewerRenderType $kRenderTypeMirror # reflection render pass -renderEachFrame renderTarget $reflectionRenderTarget -setViewport viewportFromParentRenderContext depthTest true -enableDepthWrite true applyStencilStateForOverlappingReflections alphaBlend srcFactor(zero) add dstFactor(one) cullmode none shaderProgram -target vertexProgram -method assemble bindConstants 0 -bindingID geomToClipFromParentView -constantCount 4 shaderSource vs_1_1 dcl_position v0 def c5, 1,0,0,1 m4x4 r0, v0, c0 mov oPos.x, -r0 mov oPos.yzw, r0 endShaderSource end end end shader -layer 6 validateRenderShaderContext -viewerRenderType $kRenderTypeNormal pass -modifiedEachFrameHint shaderProgram -target vertexProgram -method assemble bindConstants 0 -bindingID geomToClip -constantCount 4 bindConstants 4 -bindingID clipToViewTarget -constantCount 4 shaderSource vs_1_1 dcl_position v0 def c8, -0.5, -0.5, 1, 1 def c9, 0.5, 0.5, 0, 0 def c10, 0.25, 0.25, 0, 0 m4x4 r0, v0, c0 mov oPos, r0 mul r2, c9, r0.w mad r4, r0, c8, r2 rcp r3.x, c4.x rcp r3.y, c5.y mov r3.zw, c9.zw mul r3, r3, c10 mad r6, r0, r3, r4 mov oT0, r6.xyww endShaderSource end alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha) depthTest true -enableDepthWrite false colorScalar (0,0,0) 0.25 stage textureTransformType vector3 homogeneous textureAddressing clamp clamp texture $reflectionRenderTarget textureBlend select(texture) select(colorScalar) end end end shader -layer 6 validateRenderShaderContext -viewerRenderType $kRenderTypeNormal pass -modifiedEachFrameHint shaderProgram -target vertexProgram -method assemble bindConstants 0 -bindingID geomToClip -constantCount 4 bindConstants 4 -bindingID clipToViewTarget -constantCount 4 shaderSource vs_1_1 dcl_position v0 def c8, -0.5, -0.5, 1, 1 def c9, 0.5, 0.5, 0, 0 def c10, 0.25, 0.25, 0, 0 m4x4 r0, v0, c0 mov oPos, r0 mul r2, c9, r0.w mad r4, r0, c8, r2 rcp r3.x, c4.x rcp r3.y, c5.y mov r3.zw, c9.zw mul r3, r3, c10 mad r1, r0, r3, r4 rcp r1.w, r1.w mul oT0.xy, r1.w, r1.xy endShaderSource end alphaBlend srcFactor(srcAlpha) add dstFactor(invSrcAlpha) depthTest true -enableDepthWrite false colorScalar (0,0,0) 0.25 stage textureAddressing clamp clamp texture $reflectionRenderTarget textureBlend select(texture) select(colorScalar) end end end enddef #---------------------------------------------------------------------------------------------------------------# materialDefinition transparent_mirror_reflection setDefinition TransparentMirrorReflection end #---------------------------------------------------------------------------------------------------------------# materialDefinition simple_mirror_reflection setDefinition SimpleMirrorReflection end materialDefinition MirrorBackPostReflectionRenderMaterial setDefinition MirrorBackClearStencilAndSetDepth end # bound to the bounding mesh around the mirror plane that prevents the mirror from being # undesirably culled materialDefinition MirrorBoundingBoxMaterial setDefinition Null end # used to clear the mirror render target to z = 0 wherever the stencil has been set to 1 materialDefinition ZClearToNearPlaneMaterial setDefinition SetNearZOnMirrorRTT end # used to clear the mirror render target to z = 0 wherever the stencil has been set to 1 materialDefinition ZClearToFarPlaneMaterial setDefinition SetFarZOnMirrorRTT end # bound to a compositing pass geometry that preps the stencil buffer for rendering into # the censor render target from the mirror view materialDefinition CensorInMirrorStencilPrepMaterial setDefinition SetStencilOnCensorRTT end # End DO NOT MODIFY THIS BLOCK