internal void AddDebugPixel(RayTracer_552.RTCore rtCore)
        {
            if (null == rtCore)
                return;

            mPixelsToShow.AddDebugPixel(rtCore, mCameraPosition);
        }
 internal void AddRTKdTree(RayTracer_552.KdTreeNode rootNode)
 {
     UWB_SceneNode n = new UWB_SceneNode();
     m_SceneDatabase.insertChildNode(n);
     UWB_PrimitiveList list = new UWB_PrimitiveList();
     n.setPrimitive(list);
     AddBox(rootNode, list);
 }
 internal void AddBox(RayTracer_552.KdTreeNode node, UWB_PrimitiveList list)
 {
     defineBox(list, node.Bounds.Min, node.Bounds.Max);
     if (!node.IsLeafNode()) {
         AddBox(node.LeftChild, list);
         AddBox(node.RightChild, list);
     }
 }
        internal void AddDebugRays(RayTracer_552.RTCore rtCore)
        {
            if (null == rtCore)
                return;

            while ((mShownRayY < rtCore.CurrentY) ||
                    (((mShownRayY == rtCore.CurrentY) && (mShownRayX < rtCore.CurrentX))))
            {
                lock (rtCore)
                {
                    Vector3 p = new Vector3();
                    System.Drawing.Color c = new System.Drawing.Color();
                    float dist;
                    rtCore.GetPixelValues(mShownRayX, mShownRayY, out p, out c, out dist);

                    if (rtCore.DisplayDebugRays())
                    {
                        UWB_PrimitiveLine line = new UWB_PrimitiveLine();
                        Vector3 v = p - mCameraPosition;
                        float len = v.Length();
                        v /= len;
                        if (dist > (float.MaxValue / 2f))
                            dist = len;
                        p = mCameraPosition + dist * v;
                        line.setStartPoint(mCameraPosition.X, mCameraPosition.Y, mCameraPosition.Z);
                        line.setEndPoint(p.X, p.Y, p.Z);
                        line.Material.Diffuse = Vector4.Zero;
                        line.Material.Specular = Vector4.Zero;
                        line.Material.Ambient = Vector4.Zero;
                        line.Material.Emissive = Vector4.One;
                        mRaysToShow.append(line);
                    }

                    mShownRayX++;
                    if (mShownRayX >= rtCore.ImageWidth)
                    {
                        mShownRayX = 0;
                        mShownRayY++;
                    }
                }
            }
        }
 private void SetMeshMaterial(UWB_Primitive prim, RayTracer_552.RTMaterial mat)
 {
     prim.EnableLighting(true);
     prim.setShadeMode(eShadeMode.smGouraud);
     prim.Material.Emissive = new Vector4(Vector3.Zero, 1f);
     prim.Material.Ambient = new Vector4(mat.GetAmbientColor, 1f);
     prim.Material.Diffuse = new Vector4(mat.GetDiffuseColor, 1f);
     prim.Material.Specular = new Vector4(mat.GetSpecularColor, 1f);
     prim.Material.Power = mat.GetN;
 }
        private void AddLights(RayTracer_552.SceneDatabase rtScene)
        {
            UWB_XNAGraphicsDevice.m_TheAPI.LightManager.ResetAllLights();
            for (int l = 0; l < rtScene.GetNumLights(); l++)
            {
                RTLight lgt = rtScene.GetLight(l);
                Vector4 useColor = new Vector4(lgt.GetColor(new Vector3(0,0,0)),1f);
                UWB_XNALight theLight = null;

                if (lgt.GetLightSourceType() == RTLightType.RTLightSourceType.RTLightSourceTypeDirection)
                {
                    theLight = UWB_XNAGraphicsDevice.m_TheAPI.LightManager.CreateDirectionalLight();
                }
                else if (lgt.GetLightSourceType() == RTLightType.RTLightSourceType.RTLightSourceTypeSpot)
                {
                    theLight = UWB_XNAGraphicsDevice.m_TheAPI.LightManager.CreateSpotLight();
                }
                else
                {
                    theLight = UWB_XNAGraphicsDevice.m_TheAPI.LightManager.CreatePointLight();
                }

                theLight.Ambient = Vector4.Zero;
                theLight.Diffuse = useColor;
                theLight.Specular = useColor;
                theLight.Position = lgt.GetLightPosition();
                theLight.Direction = -lgt.GetNormalizedDirection(Vector3.Zero);
                theLight.Color = useColor;
                theLight.Attenuation = new Vector3(1f, 0.0f, 0.0f);
                theLight.Range = 10000f;
                theLight.SwitchOnLight();

                UWB_Primitive prim = CreateSphereMesh();
                SetMeshMaterial(prim, rtScene.GetMaterial(0));
                float scale = 0.25f;
                CreateNode(lgt.GetLightPosition(), scale, scale, scale, prim);
            }
        }
        private void AddCamera(RayTracer_552.RTCamera c)
        {
            // Look at position
            UWB_SceneNode atN = new UWB_SceneNode();
            UWB_XNAPrimitiveMesh at = new UWB_XNAPrimitiveMesh("sphere");
            at.Material.Diffuse = new Vector4(0.8f, 0.1f, 0.1f, 1.0f);
            atN.setPrimitive(at);
            UWB_XFormInfo atxf = atN.getXFormInfo();
            atxf.SetTranslation(c.AtPosition);
            atxf.SetScale(new Vector3(0.3f, 0.3f, 0.3f));
            atN.setXFormInfo(atxf);

            // Eye position
            UWB_SceneNode eyeN = new UWB_SceneNode();
            UWB_XNAPrimitiveMesh eye = new UWB_XNAPrimitiveMesh("cone");
            eyeN.setPrimitive(eye);
            UWB_XFormInfo eyexf = eyeN.getXFormInfo();
            eyexf.SetTranslation(c.EyePosition);
            mCameraPosition = c.EyePosition;
            Vector3 init = new Vector3(0, 0, 1); // initial cone orientation
            Vector3 final = c.AtPosition - c.EyePosition;
            final = Vector3.Normalize(final);
            float dot = Vector3.Dot(init, final);
            if (Math.Abs(dot) < 0.9999)
            {
                float angle = (float)Math.Acos(dot);
                Vector3 axis = Vector3.Cross(init, final);
                axis = Vector3.Normalize(axis);
                Quaternion q = Quaternion.CreateFromAxisAngle(axis, angle);
                eyexf.SetRotationQuat(q);
            }
            eyeN.setXFormInfo(eyexf);

            // Lines ...
            UWB_SceneNode lineN = new UWB_SceneNode();
            mCameraPrimitives = new UWB_PrimitiveList();
            lineN.setPrimitive(mCameraPrimitives);
            UWB_PrimitiveLine l = new UWB_PrimitiveLine();
            l.setStartPoint(c.EyePosition.X, c.EyePosition.Y, c.EyePosition.Z);
            l.setEndPoint(c.AtPosition.X, c.AtPosition.Y, c.AtPosition.Z);
            mCameraPrimitives.append(l);

            mCamera.insertChildNode(lineN);
            mCamera.insertChildNode(atN);
            mCamera.insertChildNode(eyeN);
        }
        internal void AddRTScene(RayTracer_552.RTCamera c, RayTracer_552.SceneDatabase rtScene)
        {
            UWB_Primitive prim;

            NewSceneDatabase();
            SceneResource<RTGeometry> allGeom = rtScene.GetAllGeom();
            for (int i = 0; i < allGeom.Count; i++)
            {
                RTGeometry g = (RTGeometry)allGeom.ResourceLookup(i);
                switch (g.GeomType()) {
                    case RTGeometry.RTGeometryType.Sphere:
                        RTSphere s = (RTSphere)g;
                        prim = CreateSphereMesh();
                        SetMeshMaterial(prim, rtScene.GetMaterial(s.GetMaterialIndex()));
                        float scale =s.Radius/2f;
                        CreateNode(s.Center, scale, scale, scale, prim);
                        break;
                    case RTGeometry.RTGeometryType.Rectangle:
                        RTRectangle r = (RTRectangle) g;
                        prim = CreateRectangle(r);
                        SetMeshMaterial(prim, rtScene.GetMaterial(r.GetMaterialIndex()));
                        UWB_SceneNode node = CreateNode(r.GetCenter(), r.GetUSize()/2f, 1f, r.GetVSize()/2f, prim);
                        // now rotate the y-vector of node to point towards r.Normal;
                        float dot = (float)Math.Abs(Vector3.Dot(Vector3.UnitY, r.GetNormal()));
                        if (dot < 0.9999f)
                        {
                            float angle = (float)Math.Acos(dot);
                            Vector3 axis = Vector3.Cross(Vector3.UnitY, r.GetNormal());
                            axis.Normalize();
                            Quaternion q = Quaternion.CreateFromAxisAngle(axis, angle);
                            UWB_XFormInfo xf = node.getXFormInfo();
                            xf.SetRotationQuat(q);
                            node.setXFormInfo(xf);
                        }
                        break;
                    case RTGeometry.RTGeometryType.Triangle:
                        RTTriangle t = (RTTriangle)g;
                        Vector3[] v = t.GetVertices();
                        prim = new UWB_PrimitiveTriangle(v[0], v[1], v[2]);
                        prim.EnableLighting(true);
                        prim.EnableTexturing(false);
                        SetMeshMaterial(prim, rtScene.GetMaterial(t.GetMaterialIndex()));
                        CreateNode(Vector3.Zero, 1f, 1f, 1f, prim);
                        break;
                    }
            }
            AddCamera(c);
            AddLights(rtScene);

            // to show ray list
            mShownRayX = mShownRayY = 0;
            mRaysToShow = new UWB_PrimitiveList();

            mDebugInfo = new UWB_SceneNode();
            mDebugInfo.setPrimitive(mRaysToShow);
            mDebugInfo.insertChildNode(mPixelsToShow.GetAllPixels());
            mDebugInfo.insertChildNode(mPixelInWorld.GetAllPixels());
        }
        internal void AddImageFrame(RayTracer_552.RTCore rtCore)
        {
            if (null == rtCore)
                return;

            // construct the image frame
            Vector3 tl = rtCore.GetTopLeftPixelPosition();
            Vector3 tr = rtCore.GetTopRightPixelPosition();
            Vector3 bl = rtCore.GetBottomLeftPixelPosition();
            Vector3 br = rtCore.GetBottomRightPixelPosition();
            UWB_PrimitiveLine t, b, l, r;
            t = new UWB_PrimitiveLine();
            b = new UWB_PrimitiveLine();
            l = new UWB_PrimitiveLine();
            r = new UWB_PrimitiveLine();

            t.setStartPoint(tr.X, tr.Y, tr.Z);
            t.setEndPoint(tl.X, tl.Y, tl.Z);
            t.Material.Emissive = Vector4.UnitX;

            l.setStartPoint(tl.X, tl.Y, tl.Z);
            l.setEndPoint(bl.X, bl.Y, bl.Z);
            l.Material.Emissive = Vector4.UnitX;

            b.setStartPoint(br.X, br.Y, br.Z);
            b.setEndPoint(bl.X, bl.Y, bl.Z);
            b.Material.Emissive = Vector4.UnitX;

            r.setStartPoint(tr.X, tr.Y, tr.Z);
            r.setEndPoint(br.X, br.Y, br.Z);
            r.Material.Emissive = Vector4.UnitX;

            mCameraPrimitives.append(t);
            mCameraPrimitives.append(b);
            mCameraPrimitives.append(l);
            mCameraPrimitives.append(r);
        }