/** * Shade * * @param tree * @param eyeRay * @param color * @param factor * @param level * @param originID */ private void Shade(OctNode tree, Ray eyeRay, Color color, double factor, int level, int originID) { Color lightColor = new Color(0.0f, 0.0f, 0.0f); Color reflectColor = new Color(0.0f, 0.0f, 0.0f); Color refractColor = new Color(0.0f, 0.0f, 0.0f); IntersectPt intersect = new IntersectPt(); OctNode baseoctn = new OctNode(); Vector normal = new Vector(); Ray reflect = new Ray(); Ray refract = new Ray(); double mu; int current; if (intersect.FindNearestIsect(tree, eyeRay, originID, level, baseoctn)) { intersect.GetIntersectObj().FindNormal(intersect.GetIntersection(), normal); GetLightColor(baseoctn, intersect.GetIntersection(), normal, intersect.GetIntersectObj(), lightColor); if (level < MaxLevel) { double check = factor * (1.0f - intersect.GetIntersectObj().GetMaterial().GetKTran()) * intersect.GetIntersectObj().GetMaterial().GetShininess(); if (check > MinFactor) { reflect.SetOrigin(intersect.GetIntersection()); reflect.GetDirection().Combine(eyeRay.GetDirection(), normal, 1.0f, -2.0f * normal.Dot(eyeRay.GetDirection())); reflect.SetID(RayID); this.RayID = this.RayID + 1; Shade(baseoctn, reflect, reflectColor, check, level + 1, originID); reflectColor.Scale((1.0f - intersect.GetIntersectObj().GetMaterial().GetKTran()) * intersect.GetIntersectObj().GetMaterial().GetShininess(), intersect.GetIntersectObj().GetMaterial().GetSpecColor()); } check = factor * intersect.GetIntersectObj().GetMaterial().GetKTran(); if (check > MinFactor) { if (intersect.GetEnter()) { mu = 1.0f / intersect.GetIntersectObj().GetMaterial().GetRefIndex(); current = intersect.GetIntersectObj().GetObjID(); } else { mu = intersect.GetIntersectObj().GetMaterial().GetRefIndex(); normal.Negate(); current = 0; } double IdotN = normal.Dot(eyeRay.GetDirection()); double TotIntReflect = 1.0f - mu * mu * (1.0f - IdotN * IdotN); if (TotIntReflect >= 0.0) { double gamma = -mu * IdotN - (double)Math.Sqrt(TotIntReflect); refract.SetOrigin(intersect.GetIntersection()); refract.GetDirection().Combine(eyeRay.GetDirection(), normal, mu, gamma); refract.SetID(RayID); this.RayID = RayID + 1; Shade(baseoctn, refract, refractColor, check, level + 1, current); refractColor.Scale(intersect.GetIntersectObj().GetMaterial().GetKTran(), intersect.GetIntersectObj().GetMaterial().GetSpecColor()); } } } color.Combine(intersect.GetIntersectObj().GetMaterial().GetEmissColor(), intersect.GetIntersectObj().GetMaterial().GetAmbColor(), AmbLightIntensity, lightColor, reflectColor, refractColor); } }
/** * Shade * * @param tree * @param eyeRay * @param color * @param factor * @param level * @param originID */ private void Shade(OctNode tree, Ray eyeRay, Color color, double factor, int level, int originID) { Color lightColor = new Color(0.0f, 0.0f, 0.0f); Color reflectColor = new Color(0.0f, 0.0f, 0.0f); Color refractColor = new Color(0.0f, 0.0f, 0.0f); IntersectPt intersect = new IntersectPt(); OctNode baseoctn = new OctNode(); Vector normal = new Vector(); Ray reflect = new Ray(); Ray refract = new Ray(); double mu; int current; if(intersect.FindNearestIsect(tree, eyeRay, originID, level, baseoctn)) { intersect.GetIntersectObj().FindNormal(intersect.GetIntersection(), normal); GetLightColor(baseoctn, intersect.GetIntersection(), normal, intersect.GetIntersectObj(), lightColor); if(level < MaxLevel) { double check = factor * (1.0f - intersect.GetIntersectObj().GetMaterial().GetKTran()) * intersect.GetIntersectObj().GetMaterial().GetShininess(); if(check > MinFactor) { reflect.SetOrigin(intersect.GetIntersection()); reflect.GetDirection().Combine(eyeRay.GetDirection(), normal, 1.0f, -2.0f * normal.Dot(eyeRay.GetDirection())); reflect.SetID(RayID); this.RayID = this.RayID + 1; Shade(baseoctn, reflect, reflectColor, check, level + 1, originID); reflectColor.Scale((1.0f - intersect.GetIntersectObj().GetMaterial().GetKTran()) * intersect.GetIntersectObj().GetMaterial().GetShininess(), intersect.GetIntersectObj().GetMaterial().GetSpecColor()); } check = factor * intersect.GetIntersectObj().GetMaterial().GetKTran(); if(check > MinFactor) { if(intersect.GetEnter()) { mu = 1.0f / intersect.GetIntersectObj().GetMaterial().GetRefIndex(); current = intersect.GetIntersectObj().GetObjID(); } else { mu = intersect.GetIntersectObj().GetMaterial().GetRefIndex(); normal.Negate(); current = 0; } double IdotN = normal.Dot(eyeRay.GetDirection()); double TotIntReflect = 1.0f - mu * mu * (1.0f - IdotN * IdotN); if(TotIntReflect >= 0.0) { double gamma = -mu * IdotN - (double)Math.Sqrt(TotIntReflect); refract.SetOrigin(intersect.GetIntersection()); refract.GetDirection().Combine(eyeRay.GetDirection(), normal, mu, gamma); refract.SetID(RayID); this.RayID = RayID + 1; Shade(baseoctn, refract, refractColor, check, level + 1, current); refractColor.Scale(intersect.GetIntersectObj().GetMaterial().GetKTran(), intersect.GetIntersectObj().GetMaterial().GetSpecColor()); } } } color.Combine(intersect.GetIntersectObj().GetMaterial().GetEmissColor(), intersect.GetIntersectObj().GetMaterial().GetAmbColor(), AmbLightIntensity, lightColor, reflectColor, refractColor); } }