示例#1
0
        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());
        }