Example #1
0
        public TAABB GetTriAABB(int tri)
        {
            TAABB result = new TAABB(pos[triangle[tri].p0], new Vector3(0, 0, 0));

            result.Extend(pos[triangle[tri].p1]);
            result.Extend(pos[triangle[tri].p2]);
            return(result);
        }
Example #2
0
        public void RebuildGeometry()
        {
            //need_props_refresh = true;//TODO если обновлять окно свойст здесь, то почему-то не происходит перерисовка моделей

            int last_high     = -1,
                normal_offset = 0,
                pos_offset    = 0,
                color_offset  = 0;

            if (objects.Count < 1)
            {
                return;
            }
            TTriMeshWithTree[] meshes            = new TTriMeshWithTree[objects.Count];
            TTriMesh[]         not_cutted_meshes = new TTriMesh[meshes.Length];
            float         node_size = 0;
            TVector <int> buffer    = new TVector <int>(1000);
            TAABB         scene_box = new TAABB();

            for (int i = 0; i < meshes.Length; i++)
            {
                not_cutted_meshes[i] = objects[i].GetTransformedMesh();
                meshes[i]            = new TTriMeshWithTree(not_cutted_meshes[i].GetCopy());
                node_size           += meshes[i].GetAverageTriSize();
                if (i == 0)
                {
                    scene_box = meshes[i].GetAABB();
                }
                else
                {
                    scene_box.Extend(meshes[i].GetAABB());
                }
            }
            node_size /= meshes.Length;

            scene = new TTriMeshWithTree(node_size * 2, scene_box);


            TVector <int> query_result  = new TVector <int>(1000);
            TVector <int> query_result1 = new TVector <int>(1000);

            for (int i = 0; i < meshes.Length; i++)
            {
                if (i != 0)
                {
                    //сечём треугольники объекта треугольниками сцены
                    scene.AABBQuery(query_result, meshes[i].GetAABB());
                    for (int k = 0; k <= query_result.High; k++)
                    {
                        meshes[i].Cut(buffer, scene.GetMesh(), query_result[k], scene.GetMesh().GetTriAABB(query_result[k]));
                    }
                    //сечём треугольники сцены треугольниками объекта(треугольники объекта не сечённые)
                    for (int k = 0; k <= not_cutted_meshes[i].triangle.High; k++)
                    {
                        scene.Cut(buffer, not_cutted_meshes[i], k, not_cutted_meshes[i].GetTriAABB(k));
                    }
                    scene.TrianglesInMeshQuery(buffer, query_result, meshes[i], true);
                    meshes[i].TrianglesInMeshQuery(buffer, query_result1, scene, false);
                    scene.DelTriangles(query_result);
                    meshes[i].DelTriangles(query_result1);
                    meshes[i].InverseNormals();
                }
                //добавляем объект в сцену
                scene.Add(meshes[i]);
            }
        }