/// <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; }