private void ShowOneDebugPixelAt(Vector3 p, System.Drawing.Color c)
 {
     if (mNumPixelNodesUsed >= mPixelsToShow.numChildren())
     {
         // need to create new ones
         UWB_Primitive prim = CreateSphereMesh();
         prim.EnableLighting(false);
         UWB_SceneNode pNode = new UWB_SceneNode();
         pNode.setPrimitive(prim);
         UWB_XFormInfo xf = pNode.getXFormInfo();
         xf.SetTranslation(p);
         xf.SetScale(new Vector3(kPixelSize));
         pNode.setXFormInfo(xf);
         prim.Material.Diffuse  = Vector4.Zero;
         prim.Material.Specular = Vector4.Zero;
         prim.Material.Ambient  = Vector4.Zero;
         prim.Material.Emissive = new Vector4(c.R / 255.0f, c.G / 255.0f, c.B / 255.0f, 1f);
         mPixelsToShow.insertChildNode(pNode);
     }
     else
     {
         // there are more to be reused ...
         UWB_SceneNode n  = mPixelsToShow.getChildNode(mNumPixelNodesUsed);
         UWB_XFormInfo xf = n.getXFormInfo();
         xf.SetTranslation(new Vector3(p.X, p.Y, p.Z));
         UWB_Primitive prim = n.getPrimitive();
         prim.setVisible(true);
         prim.Material.Diffuse  = Vector4.Zero;
         prim.Material.Specular = Vector4.Zero;
         prim.Material.Ambient  = Vector4.Zero;
         prim.Material.Emissive = new Vector4(c.R / 255.0f, c.G / 255.0f, c.B / 255.0f, 1f);
     }
 }
        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);
        }
        private UWB_SceneNode CreateNode(Vector3 at, float sx, float sy, float sz, UWB_Primitive prim)
        {
            UWB_SceneNode pNode = new UWB_SceneNode();

            pNode.setPrimitive(prim);
            UWB_XFormInfo xf = pNode.getXFormInfo();

            xf.SetTranslation(at);
            xf.SetScale(new Vector3(sx, sy, sz));
            pNode.setXFormInfo(xf);
            m_SceneDatabase.insertChildNode(pNode);
            return(pNode);
        }
        internal RTModelViewer()
        {
            m_DrawHelper.initializeModelTransform();

            m_RootNode = new UWB_SceneNode("Scene");
            NewSceneDatabase();
            mCamera = new UWB_SceneNode();

            UWB_SceneNode pAxisNode = new UWB_SceneNode("axis frame");
            UWB_XFormInfo xf        = pAxisNode.getXFormInfo();

            xf.SetScale(new Vector3(3.0f, 3.0f, 3.0f));
            pAxisNode.setXFormInfo(xf);
            UWB_XNAPrimitiveMeshAxis pMeshAxis = new UWB_XNAPrimitiveMeshAxis();

            //pMeshAxis.EnableBlending(true);
            pAxisNode.setPrimitive(pMeshAxis);
            m_RootNode.insertChildNode(pAxisNode);

            m_WorldBounds.setCorners(new Vector3(-100, -100, -100), new Vector3(100, 100, 100));
        }
        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());
        }