public LCC3ShaderUniform AddUniformOverrideForUniform(LCC3ShaderUniform uniform) { if (uniform != null) { LCC3ShaderUniform newUniform = uniform.CloneVariable<LCC3ShaderUniformOverride>(); _uniformsByName[newUniform.Name] = newUniform; _uniforms.Add(newUniform); return newUniform; } return null; }
public bool PopulateUniformWithVisitor(LCC3ShaderUniform uniform, LCC3NodeDrawingVisitor visitor) { if (uniform.Program != _program) { return false; } foreach(LCC3ShaderUniform currentUniform in _uniforms) { if (currentUniform.Location == uniform.Location) { uniform.SetValueFromUniform(currentUniform); return true; } } return false; }
public void SetValueFromUniform(LCC3ShaderUniform uniform) { _varValue = uniform.VarValue; }
public void PopulateFrom(LCC3ShaderUniform uniform) { base.PopulateFrom(uniform); }
public bool PopulateUniformWithVisitor(LCC3ShaderUniform uniform, LCC3NodeDrawingVisitor visitor) { LCC3Semantic semantic = uniform.Semantic; uint semanticIndex = uniform.SemanticIndex; LCC3Material material; uint numOfTextures = (uint)visitor.CurrentMaterial.TextureCount(); bool isInverted; switch (semantic) { #region Attribute Qualifiers case LCC3Semantic.SemanticVertexNormal: uniform.SetValue(visitor.CurrentMesh.HasVertexNormals); return true; case LCC3Semantic.SemanticShouldNormalizeVertexNormal: uniform.SetValue(visitor.CurrentMeshNode.EffectiveNormalScalingMethod == LCC3NormalScaling.CC3NormalScalingNormalize); return true; case LCC3Semantic.SemanticShouldRescaleVertexNormal: uniform.SetValue(visitor.CurrentMeshNode.EffectiveNormalScalingMethod == LCC3NormalScaling.CC3NormalScalingRescale); return true; case LCC3Semantic.SemanticHasVertexTangent: uniform.SetValue(visitor.CurrentMesh.HasVertexTangents); return true; case LCC3Semantic.SemanticHasVertexBitangent: uniform.SetValue(visitor.CurrentMesh.HasVertexBitangents); return true; case LCC3Semantic.SemanticHasVertexColor: uniform.SetValue(visitor.CurrentMesh.HasVertexColors); return true; case LCC3Semantic.SemanticHasVertexWeight: uniform.SetValue(visitor.CurrentMesh.HasVertexWeights); return true; case LCC3Semantic.SemanticHasVertexMatrixIndex: uniform.SetValue(visitor.CurrentMesh.HasVertexMatrixIndices); return true; case LCC3Semantic.SemanticHasVertexTextureCoordinate: uniform.SetValue(visitor.CurrentMesh.HasVertexTextureCoordinates); return true; case LCC3Semantic.SemanticHasVertexPointSize: uniform.SetValue(visitor.CurrentMesh.HasVertexPointSizes); return true; case LCC3Semantic.SemanticIsDrawingPoints: uniform.SetValue(false); // XNA doesn't support drawing mode by points return true; #endregion Attribute Qualifiers #region Environment semantics case LCC3Semantic.SemanticEyePosition: uniform.SetValue(visitor.ViewMatrix.Inverse().TranslationOfTransformMatrix()); return true; case LCC3Semantic.SemanticModelMatrix: uniform.SetValue(visitor.ModelMatrix); return true; case LCC3Semantic.SemanticModelViewMatrix: uniform.SetValue(visitor.ModelViewMatrix); return true; case LCC3Semantic.SemanticModelViewProjMatrix: uniform.SetValue(visitor.ModelViewProjMatrix); return true; case LCC3Semantic.SemanticViewMatrix: uniform.SetValue(visitor.ViewMatrix); return true; case LCC3Semantic.SemanticProjMatrix: uniform.SetValue(visitor.ProjMatrix); return true; case LCC3Semantic.SemanticModelViewMatrixInvTran: uniform.SetValue(visitor.ModelViewMatrix.InverseAdjointTranspose()); return true; case LCC3Semantic.SemanticModelMatrixInvTran: uniform.SetValue(visitor.ModelMatrix.Transpose().Inverse()); return true; #endregion Environment semantics #region Setting material semantics case LCC3Semantic.SemanticColor: uniform.SetValue(visitor.CurrentColor.ToVector4()); return true; case LCC3Semantic.SemanticMaterialColorAmbient: uniform.SetValue(visitor.CurrentMaterial.EffectiveAmbientColor.ToVector4()); return true; case LCC3Semantic.SemanticMaterialColorDiffuse: uniform.SetValue(visitor.CurrentMaterial.EffectiveDiffuseColor.ToVector4()); return true; case LCC3Semantic.SemanticMaterialColorSpecular: uniform.SetValue(visitor.CurrentMaterial.EffectiveSpecularColor.ToVector4()); return true; case LCC3Semantic.SemanticMaterialColorEmission: uniform.SetValue(visitor.CurrentMaterial.EffectiveEmissionColor.ToVector4()); return true; case LCC3Semantic.SemanticMaterialOpacity: uniform.SetValue(visitor.CurrentMaterial.EffectiveDiffuseColor.A); return true; case LCC3Semantic.SemanticMaterialShininess: uniform.SetValue(visitor.CurrentMaterial.Shininess); return true; case LCC3Semantic.SemanticMaterialReflectivity: uniform.SetValue(visitor.CurrentMaterial.Reflectivity); return true; case LCC3Semantic.SemanticMinimumDrawnAlpha: material = visitor.CurrentMaterial; uniform.SetValue(material.ShouldDrawLowAlpha ? 0.0f : material.AlphaTestReference); return true; #endregion Setting material semantics #region Textures case LCC3Semantic.SemanticTextureCount: uniform.SetValue(visitor.CurrentMaterial.TextureCount()); return true; case LCC3Semantic.SemanticTexUnitMode: if(semanticIndex < numOfTextures) { LCC3TextureUnitMode texUnitMode = visitor.CurrentMaterial.TextureForTextureUnit(semanticIndex).TextureUnitMode; uniform.SetValue((int)texUnitMode); } else { uniform.SetValue(0); } return true; case LCC3Semantic.SemanticVertexTexture: if(semanticIndex < numOfTextures) { LCC3Texture texture = visitor.CurrentMaterial.TextureForTextureUnit(semanticIndex); LCC3GraphicsTexture2D tex2D = texture.GraphicsTexture as LCC3GraphicsTexture2D; uniform.SetValue(tex2D); } else { uniform.SetValue(null); } return true; case LCC3Semantic.SemanticTexUnitConstantColor: if(semanticIndex < numOfTextures) { LCC3Texture texture = visitor.CurrentMaterial.TextureForTextureUnit(semanticIndex); uniform.SetValue(texture.TextureUnitConstantColor.ToVector4()); } else { uniform.SetValue(LCC3Vector4.CC3Vector4One); } return true; #endregion Textures #region Light semantics case LCC3Semantic.SemanticIsUsingLighting: uniform.SetValue(visitor.CurrentNode.ShouldUseLighting); return true; case LCC3Semantic.SemanticSceneLightColorAmbient: uniform.SetValue(visitor.Scene.AmbientLight.ToVector4()); return true; case LCC3Semantic.SemanticLightIsEnabled: for (uint i = 0; i < uniform.Size; i++) { LCC3Light light = visitor.LightAtIndex(uniform.SemanticIndex + i); uniform.SetValueAtIndex(light.Visible, i); } return true; case LCC3Semantic.SemanticLightInvertedPositionEyeSpace: isInverted = true; goto case LCC3Semantic.SemanticLightPositionEyeSpace; case LCC3Semantic.SemanticLightPositionEyeSpace: for (uint i = 0; i < uniform.Size; i++) { LCC3Light light = visitor.LightAtIndex(uniform.SemanticIndex + i); LCC3Vector4 ltPos = light.GlobalHomogeneousPosition; if (isInverted == true) { ltPos = ltPos.HomogeneousNegate(); } // Transform global position/direction to eye space and normalize if direction ltPos = visitor.ViewMatrix.TransformCC3Vector4(ltPos); if (light.IsDirectionalOnly == true) { ltPos = ltPos.NormalizedVector(); } uniform.SetValueAtIndex(ltPos, i); } return true; case LCC3Semantic.SemanticLightDirection: for (uint i = 0; i < uniform.Size; i++) { LCC3Light light = visitor.LightAtIndex(uniform.SemanticIndex + i); uniform.SetValueAtIndex(light.Location, i); } return true; case LCC3Semantic.SemanticLightColorDiffuse: for (uint i = 0; i < uniform.Size; i++) { LCC3Light light = visitor.LightAtIndex(uniform.SemanticIndex + i); CCColor4F ltColor = light.Visible ? light.DiffuseColor : LCC3ColorUtil.CCC4FBlackTransparent; uniform.SetValueAtIndex(ltColor.ToVector4(), i); } return true; case LCC3Semantic.SemanticLightColorAmbient: for (uint i = 0; i < uniform.Size; i++) { LCC3Light light = visitor.LightAtIndex(uniform.SemanticIndex + i); CCColor4F ltColor = light.Visible ? light.AmbientColor : LCC3ColorUtil.CCC4FBlackTransparent; uniform.SetValueAtIndex(ltColor.ToVector4(), i); } return true; case LCC3Semantic.SemanticLightColorSpecular: for (uint i = 0; i < uniform.Size; i++) { LCC3Light light = visitor.LightAtIndex(uniform.SemanticIndex + i); CCColor4F ltColor = light.Visible ? light.SpecularColor : LCC3ColorUtil.CCC4FBlackTransparent; uniform.SetValueAtIndex(ltColor.ToVector4(), i); } return true; #endregion Light semantics } return false; }
public bool PopulateUniformWithVisitor(LCC3ShaderUniform uniform, LCC3NodeDrawingVisitor visitor) { return false; }
internal void UpdateUniformValue(LCC3ShaderUniform uniform) { EffectParameter _xnaEffectParam = _xnaShaderEffect.Parameters[uniform.Name]; if (_xnaEffectParam != null && uniform.VarValue != null) { switch (uniform.Type) { case LCC3ElementType.Float3x3: case LCC3ElementType.Float4x4: _xnaEffectParam.SetValue(uniform.XnaMatrix); break; case LCC3ElementType.Texture2D: _xnaEffectParam.SetValue(uniform.XnaTexture2D); break; case LCC3ElementType.Vector4: _xnaEffectParam.SetValue(uniform.XnaVector4); break; case LCC3ElementType.Vector3: _xnaEffectParam.SetValue(uniform.XnaVector3); break; case LCC3ElementType.Float: _xnaEffectParam.SetValue(uniform.FloatValue); break; case LCC3ElementType.Int: _xnaEffectParam.SetValue(uniform.IntValue); break; case LCC3ElementType.Boolean: _xnaEffectParam.SetValue(uniform.BoolValue); break; case LCC3ElementType.BooleanArray: bool[] boolArray = uniform.BoolArrayValue; for (int i = 0; i < boolArray.Length; i++) { _xnaEffectParam.Elements[i].SetValue(boolArray[i]); } break; case LCC3ElementType.FloatArray: float[] floatArray = uniform.FloatArrayValue; for (int i = 0; i < floatArray.Length; i++) { _xnaEffectParam.Elements[i].SetValue(floatArray[i]); } break; case LCC3ElementType.Vector4Array: _xnaEffectParam.SetValue(uniform.XnaVector4Array); break; } } }
public void AddUniform(LCC3ShaderUniform uniform) { switch (uniform.Scope) { case LCC3ShaderVariableScope.ScopeScene: _uniformsSceneScope.Add(uniform); break; case LCC3ShaderVariableScope.ScopeDraw: _uniformsDrawScope.Add(uniform); break; default: _uniformsNodeScope.Add(uniform); break; } }
public void RemoveUniformOverride(LCC3ShaderUniform uniform) { _uniforms.Remove(uniform); _uniformsByName.Remove(uniform.Name); if (_uniforms.Count == 0) { this.RemoveAllOverrides(); } }