예제 #1
0
        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);
        }
예제 #2
0
        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);
            }
        }