예제 #1
0
        /// <summary>
        /// Set the RenderEnvironment for usage
        /// </summary>
        /// <param name="environment"></param>
        /// <param name="usage"></param>
        public void SetBackground(RenderEnvironment environment, RenderEnvironment.Usage usage)
        {
            switch (usage)
            {
            case RenderEnvironment.Usage.Background:
                if (environment?.RenderHash == _cqBackground.BackgroundEnvironment?.RenderHash)
                {
                    return;
                }
                _cqBackground.Xml = "";
                var xmlenv = (environment?.TopLevelParent as Materials.ICyclesMaterial);
                if (xmlenv?.MaterialType == RhinoCyclesCore.ShaderBody.CyclesMaterial.XmlEnvironment || xmlenv?.MaterialType == RhinoCyclesCore.ShaderBody.CyclesMaterial.SimpleNoiseEnvironment)
                {
                    xmlenv.BakeParameters();
                    _cqBackground.Xml = xmlenv.MaterialXml;
                }
                _cqBackground.BackgroundEnvironment = environment;
                if (environment != null)
                {
                    var s    = environment.GetParameter("background-projection") as IConvertible;
                    var proj = Convert.ToString(s, CultureInfo.InvariantCulture);
                    _cqBackground.PlanarProjection = proj.Equals("planar");
                }
                else
                {
                    _cqBackground.PlanarProjection = false;
                }
                break;

            case RenderEnvironment.Usage.Skylighting:
                _cqBackground.SkylightEnvironment = environment;
                break;

            case RenderEnvironment.Usage.ReflectionAndRefraction:
                _cqBackground.ReflectionEnvironment = environment;
                break;
            }
            _cqBackground.Modified = true;
        }
예제 #2
0
        static private TextureEnvironmentMappingMode get_environment_mapping(RenderEnvironment rm, RenderTexture renderTexture)
        {
            var s    = rm.GetParameter("background-projection") as IConvertible;
            var proj = Convert.ToString(s, CultureInfo.InvariantCulture);

            switch (proj)
            {
            case "automatic":
                return(renderTexture.GetEnvironmentMappingMode());

            case "box":
                return(TextureEnvironmentMappingMode.Box);

            case "cubemap":
                return(TextureEnvironmentMappingMode.Cube);

            case "emap":
                return(TextureEnvironmentMappingMode.EnvironmentMap);

            case "horizontal-cross-cubemap":
                return(TextureEnvironmentMappingMode.HorizontalCrossCube);

            case "vertical-cross-cubemap":
                return(TextureEnvironmentMappingMode.VerticalCrossCube);

            case "hemispherical":
                return(TextureEnvironmentMappingMode.Hemispherical);

            case "lightprobe":
                return(TextureEnvironmentMappingMode.LightProbe);

            case "spherical":
                return(TextureEnvironmentMappingMode.Spherical);

            default:                     // default (non existing planar)
                return((TextureEnvironmentMappingMode)4);
            }
        }
예제 #3
0
        /// <summary>
        /// Get environment bitmap from texture evaluator
        /// </summary>
        /// <param name="rm"></param>
        /// <param name="teximg"></param>
        /// <param name="gamma"></param>
        /// <param name="floatAsByte"></param>
        /// <param name="planarProjection"></param>
        public static void EnvironmentBitmapFromEvaluator(RenderEnvironment rm, CyclesTextureImage teximg, float gamma, bool planarProjection)
        {
            RenderTexture renderTexture = null;

            if (rm != null)
            {
                renderTexture = rm.FindChild("texture") as RenderTexture;
            }

            if (renderTexture == null)
            {
                teximg.TexByte  = null;
                teximg.TexFloat = null;
                teximg.TexWidth = teximg.TexHeight = 0;
                teximg.Name     = "";
                return;
            }

            var rhinotfm  = renderTexture.LocalMappingTransform;
            var guid      = renderTexture.TypeId;
            var nm        = renderTexture.TypeName;
            var rot       = renderTexture.GetRotation();
            var rep       = renderTexture.GetRepeat();
            var tra       = renderTexture.GetOffset();
            var rId       = renderTexture.RenderHashExclude(TextureRenderHashFlags.ExcludeLocalMapping, "azimuth;altitude;multiplier;rdk-texture-repeat;rdk-texture-offset;rdk-texture-rotation;rdk-texture-adjust-multiplier");
            var azimob    = renderTexture.GetParameter("azimuth");
            var altob     = renderTexture.GetParameter("altitude");
            var multob    = renderTexture.GetParameter("multiplier");
            var multadjob = renderTexture.GetParameter("rdk-texture-adjust-multiplier");
            var mult      = 1.0f;
            var multadj   = 1.0f;

            if (multob != null)
            {
                mult = (float)Convert.ToDouble(multob);
            }
            if (multadjob != null)
            {
                multadj = (float)Convert.ToDouble(multadjob);
            }
            if (azimob != null && altob != null)
            {
                var azi  = Convert.ToDouble(azimob);
                var alti = Convert.ToDouble(altob);
                rhinotfm.M20 = alti;
                rhinotfm.M21 = alti;
                rhinotfm.M22 = azi;
            }
            else
            {
                rhinotfm.M00 = tra.X;
                rhinotfm.M01 = tra.Y;
                rhinotfm.M02 = tra.Z;

                rhinotfm.M10 = rep.X;
                rhinotfm.M11 = rep.Y;
                rhinotfm.M12 = rep.Z;

                rhinotfm.M20 = Rhino.RhinoMath.ToRadians(rot.X);
                rhinotfm.M21 = Rhino.RhinoMath.ToRadians(rot.Y);
                rhinotfm.M22 = Rhino.RhinoMath.ToRadians(rot.Z);
            }

            Transform t = new Transform(
                rhinotfm.ToFloatArray(true)
                );

            var restore = !multadj.FuzzyEquals(1.0f);

            if (restore)
            {
                renderTexture.BeginChange(RenderContent.ChangeContexts.Ignore);
                renderTexture.SetParameter("rdk-texture-adjust-multiplier", 1.0);
            }

            using (var textureEvaluator =
                       renderTexture.CreateEvaluator(
                           RenderTexture.TextureEvaluatorFlags.DisableLocalMapping |
                           RenderTexture.TextureEvaluatorFlags.DisableProjectionChange |
                           RenderTexture.TextureEvaluatorFlags.DisableFiltering
                           ))
            {
                if (textureEvaluator == null)
                {
                    teximg.TexByte  = null;
                    teximg.TexFloat = null;
                    teximg.TexWidth = teximg.TexHeight = 0;
                    teximg.Name     = "";
                    return;
                }
                try
                {
                    int u, v, w;
                    renderTexture.PixelSize(out u, out v, out w);
                    teximg.TexWidth  = u;
                    teximg.TexHeight = v;
                }
                catch (Exception)
                {
                    teximg.TexHeight = teximg.TexWidth = 1024;
                }

                if (teximg.TexHeight == 0 || teximg.TexWidth == 0)
                {
                    teximg.TexHeight = teximg.TexWidth = 1024;
                }

                var isFloat = renderTexture.IsHdrCapable();

                var isLinear = teximg.IsLinear = renderTexture.IsLinear();

                if (isFloat)
                {
                    var img = RetrieveFloatsImg(rId, teximg.TexWidth, teximg.TexHeight, textureEvaluator, true, planarProjection, isLinear);
                    img.ApplyGamma(gamma);
                    teximg.TexFloat = img.Data;
                    teximg.TexByte  = null;
                }
                else
                {
                    var img = RetrieveBytesImg(rId, teximg.TexWidth, teximg.TexHeight, textureEvaluator, true, planarProjection, isLinear);
                    img.ApplyGamma(gamma);
                    teximg.TexByte  = img.Data;
                    teximg.TexFloat = null;
                }
                teximg.Name = rId.ToString(CultureInfo.InvariantCulture);
            }
            if (restore)
            {
                renderTexture.SetParameter("rdk-texture-adjust-multiplier", (double)multadj);
                renderTexture.EndChange();
            }
            teximg.Transform = t;
            teximg.Strength  = mult * multadj;
        }