internal UniformBinding <T> GetUniformBinding <T> (Material material, TypedUniform <T> uniform) where T : unmanaged { if (IsDisposed) { throw new ObjectDisposedException("MaterialSetBase"); } IUniformBinding existing; if (material.UniformBindings.TryGetValue(uniform.ID, out existing)) { return(existing.Cast <T>()); } var result = GetUniformBindingSlow <T>(material, uniform); material.UniformBindings.Add(uniform.ID, result); return(result); }
private UniformBinding <T> GetUniformBindingSlow <T> (Material material, TypedUniform <T> uniform) where T : unmanaged { var effect = material.Effect; if (effect == null) { return(null); } IUniformBinding existing; var key = uniform.KeyTemplate; key.Effect = effect; lock (UniformBindings) { if (UniformBindings.TryGetValue(key, out existing)) { return(existing.Cast <T>()); } #if FNA // This is fine :-) #else if (material.OwningThread != Thread.CurrentThread) { throw new UniformBindingException( "Uniform bindings must be allocated on the thread that owns the material. An attempt was made to allocate a binding for '" + uniform.Name + "' on '" + material.Effect.CurrentTechnique.Name + "'" ); } #endif var result = UniformBinding <T> .TryCreate(effect, uniform.Name); UniformBindings.Add(key, result); material.UniformBindings.Add(uniform.ID, result); return(result); } }