public TetrahedronTypeB BuildTensegrityTypeB(Tetra tetra, SpatialSlur.Mesh.Impl.NodeList <SpatialSlur.Mesh.HeMesh3d.Vertex> verts)
    {
        var p0 = (Vector3)verts[tetra.Vertex0].Position;
        var p1 = (Vector3)verts[tetra.Vertex1].Position;
        var p2 = (Vector3)verts[tetra.Vertex2].Position;
        var p3 = (Vector3)verts[tetra.Vertex3].Position;

        p0 = transform.TransformPoint(p0);
        p1 = transform.TransformPoint(p1);
        p2 = transform.TransformPoint(p2);
        p3 = transform.TransformPoint(p3);


        var cen       = (p0 + p1 + p2 + p3) / 4f;
        var tetratype = Instantiate(_typeB, transform);

        tetratype.transform.position = cen;

        p0 = tetratype.transform.InverseTransformPoint(p0);
        p1 = tetratype.transform.InverseTransformPoint(p1);
        p2 = tetratype.transform.InverseTransformPoint(p2);
        p3 = tetratype.transform.InverseTransformPoint(p3);


        tetratype.SetupTetraPoints(new Vector3[] { p0, p1, p2, p3 });
        tetratype.SetupStructure();
        return(tetratype);
    }
Beispiel #2
0
        protected Tetra UnpackTetra()
        {
            Tetra o = new Tetra();

            byte stateByte = ReadByte();

            o.DriveThrough = (stateByte & (1 << 0)) != 0;
            o.ShootThrough = (stateByte & (1 << 1)) != 0;
            o.Ricochet     = (stateByte & (1 << 2)) != 0;

            o.Transform = UnpackMeshTransform();


            for (int i = 0; i < 4; i++)
            {
                o.Verts.Add(ReadVector3F());
            }

            byte normalFlags = ReadByte();

            for (int i = 0; i < 4; i++)
            {
                Tetra.Face face = new Tetra.Face();
                o.Faces.Add(face);
                face.UseNormals = (normalFlags & (1 << i)) != 0;
                if (face.UseNormals)
                {
                    for (int j = 0; j < 3; j++)
                    {
                        face.Norms.Add(ReadVector3F());
                    }
                }
            }

            byte uvFlags = ReadByte();

            for (int i = 0; i < 4; i++)
            {
                Tetra.Face face = o.Faces[i];
                face.UseUVs = (uvFlags & (1 << i)) != 0;
                if (face.UseNormals)
                {
                    for (int j = 0; j < 3; j++)
                    {
                        face.UVs.Add(ReadVector2F());
                    }
                }
            }

            for (int i = 0; i < 4; i++)
            {
                Tetra.Face face = o.Faces[i];
                face.MaterialID = ReadInt32();
            }

            return(o);
        }
Beispiel #3
0
 public void CheckNeighbor(Tetra T)
 {
     foreach (var e in T.Edge)
     {
         if (e.GetName().Contains(this.transform.name))
         {
             var f = T.Edgeface[e];
             Evaulate(f, T);
         }
     }
     print(T.name);
 }
Beispiel #4
0
 public void Evaulate(List <Face> f, Tetra T)
 {
     foreach (var fp in f)
     {
         if (fp.GetTag() == "Free")
         {
             _fp.Add(fp.GetTransform());
         }
         else
         {
             tp2[0] = T.FacePoint[fp];
             var c = tp2[0].gameObject.AddComponent <SphereCollider>();
             c.isTrigger = true;
             c.radius    = 0.3f;
         }
     }
     print(_fp.Count);
 }
Beispiel #5
0
        public override ExecutionResult ExecuteInstruction(MmixComputer mmixComputer, Tetra tetra)
        {
            // register to store into
            var reg = mmixComputer.Registers[tetra.X];

            // multiply by 4 as ops are 4 bytes wide
            long relativeAddress = 4 * (tetra.Y + tetra.Z);

            // sign check as there isn't a ulong + long overload that handles negatives (I think)
            ulong address;

            if (relativeAddress > 0)
            {
                address = mmixComputer.PC + (ulong)relativeAddress;
            }
            else
            {
                address = mmixComputer.PC - (ulong)(-relativeAddress);
            }
            reg.Store(address);

            return(ExecutionResult.CONTINUE);
        }
Beispiel #6
0
 /// <summary>
 /// Constructs an empty grid. All public member variables must be
 /// initialized before this object can be used in BoSSS.
 /// </summary>
 public UnstructuredTetraGrid()
     : base()
 {
     m_GridSimplex = new Tetra();
 }
Beispiel #7
0
        protected override void OnHandleInput()
        {
            base.OnHandleInput();

            if (Input.MousePressed == MouseButtons.Right)
            {
                results.Fraction = 1;
                if (pickConstraint == null)
                {
                    Vector3 rayFrom = Freelook.Eye;
                    Vector3 rayTo   = GetRayTo(Input.MousePoint, Freelook.Eye, Freelook.Target, FieldOfView);
                    Vector3 rayDir  = (rayTo - rayFrom);
                    rayDir.Normalize();
                    AlignedSoftBodyArray sbs = ((SoftRigidDynamicsWorld)PhysicsContext.World).SoftBodyArray;
                    for (int ib = 0; ib < sbs.Count; ++ib)
                    {
                        SoftBody psb = sbs[ib];
                        SRayCast res = new SRayCast();
                        if (psb.RayTest(rayFrom, rayTo, res))
                        {
                            results = res;
                        }
                    }
                    if (results.Fraction < 1)
                    {
                        impact       = rayFrom + (rayTo - rayFrom) * results.Fraction;
                        drag         = !(PhysicsContext as Physics).cutting;
                        lastMousePos = Input.MousePoint;
                        node         = null;
                        switch (results.Feature)
                        {
                        case EFeature.Tetra:
                        {
                            Tetra tet = results.Body.Tetras[results.Index];
                            node = tet.Nodes[0];
                            for (int i = 1; i < 4; ++i)
                            {
                                if ((node.X - impact).LengthSquared() >
                                    (tet.Nodes[i].X - impact).LengthSquared())
                                {
                                    node = tet.Nodes[i];
                                }
                            }
                            break;
                        }

                        case EFeature.Face:
                        {
                            Face f = results.Body.Faces[results.Index];
                            node = f.N[0];
                            for (int i = 1; i < 3; ++i)
                            {
                                if ((node.X - impact).LengthSquared() >
                                    (f.N[i].X - impact).LengthSquared())
                                {
                                    node = f.N[i];
                                }
                            }
                        }
                        break;
                        }
                        if (node != null)
                        {
                            goal = node.X;
                        }
                        //return;
                    }
                }
            }
            else if (Input.MouseReleased == MouseButtons.Right)
            {
                if ((!drag) && (PhysicsContext as Physics).cutting && (results.Fraction < 1))
                {
                    ImplicitSphere isphere = new ImplicitSphere(impact, 1);
                    results.Body.Refine(isphere, 0.0001f, true);
                }
                results.Fraction = 1;
                drag             = false;
            }

            // Mouse movement
            if (Input.MouseDown == MouseButtons.Right)
            {
                if (node != null && (results.Fraction < 1))
                {
                    if (!drag)
                    {
                        int x = Input.MousePoint.X - lastMousePos.X;
                        int y = Input.MousePoint.Y - lastMousePos.Y;
                        if ((x * x) + (y * y) > 6)
                        {
                            drag = true;
                        }
                    }
                    if (drag)
                    {
                        lastMousePos = Input.MousePoint;
                    }
                }
            }

            (PhysicsContext as Physics).HandleInput(Input, FrameDelta);
        }
Beispiel #8
0
        /// <summary>
        /// テトラメッシュを構築して返す
        /// </summary>
        /// <param name="posList"></param>
        /// <param name="tetraCount">作成されたテトラ数</param>
        /// <param name="tetraIndexList">テトラ数x4のインデックスリスト</param>
        /// <param name="tetraSizeList">テトラの重心からの最大距離リスト</param>
        public static void CalcTetraMesh(List <Vector3> posList, out int tetraCount, out List <int> tetraIndexList, out List <float> tetraSizeList)
        {
            tetraCount     = 0;
            tetraIndexList = new List <int>();
            tetraSizeList  = new List <float>();

            // 作業用バッファ
            List <TetraVertex> vertexList = new List <TetraVertex>();

            for (int i = 0; i < posList.Count; i++)
            {
                vertexList.Add(new TetraVertex(posList[i], i));
            }

            // 入力頂点のバウンディングボックス
            Bounds b = new Bounds(posList[0], Vector3.one * 0.01f);

            foreach (var pos in posList)
            {
                b.Encapsulate(pos);
            }

            // ポイントをすべて内包するテトラポイントを追加する
            float areaRadius = Mathf.Max(Mathf.Max(b.extents.x, b.extents.y), b.extents.z);
            float dist       = areaRadius * 100.0f;
            var   tempSV0    = new TetraVertex();
            var   tempSV1    = new TetraVertex();
            var   tempSV2    = new TetraVertex();
            var   tempSV3    = new TetraVertex();

            tempSV0.pos = b.center + new Vector3(0.0f, -dist, 0.0f);
            tempSV1.pos = b.center + new Vector3(-dist, dist, dist);
            tempSV2.pos = b.center + new Vector3(dist, dist, dist);
            tempSV3.pos = b.center + new Vector3(0.0f, dist, -dist);
            int svcnt = vertexList.Count;

            tempSV0.index = svcnt++;
            tempSV1.index = svcnt++;
            tempSV2.index = svcnt++;
            tempSV3.index = svcnt++;
            vertexList.Add(tempSV0);
            vertexList.Add(tempSV1);
            vertexList.Add(tempSV2);
            vertexList.Add(tempSV3);

            // 最初のテトラを分割テトラとして登録
            List <Tetra> divideTetras = new List <Tetra>();
            var          tetra0       = new Tetra(tempSV0, tempSV1, tempSV2, tempSV3);

            tetra0.CalcCircumcircle();
            divideTetras.Add(tetra0);

            // 重複チェック用
            Dictionary <ulong, Tetra> useTetraHash = new Dictionary <ulong, Tetra>();

            useTetraHash.Add(tetra0.GetTetraHash(), tetra0);

            // テトラ構築
            for (int k = 0; k < (vertexList.Count - 4); k++)
            {
                var point = vertexList[k];

                List <Tetra> tempDivTetras = new List <Tetra>();

                for (int i = 0; i < divideTetras.Count;)
                {
                    var tetra = divideTetras[i];
                    if (tetra.ContainsPoint(point) == false)
                    {
                        if (tetra.IntersectCircumcircle(point.pos))
                        {
                            // 再分割
                            var tetra1 = new Tetra(tetra.vertexList[0], tetra.vertexList[1], tetra.vertexList[2], point);
                            var tetra2 = new Tetra(tetra.vertexList[0], tetra.vertexList[2], tetra.vertexList[3], point);
                            var tetra3 = new Tetra(tetra.vertexList[0], tetra.vertexList[3], tetra.vertexList[1], point);
                            var tetra4 = new Tetra(tetra.vertexList[1], tetra.vertexList[2], tetra.vertexList[3], point);

                            tempDivTetras.Add(tetra1);
                            tempDivTetras.Add(tetra2);
                            tempDivTetras.Add(tetra3);
                            tempDivTetras.Add(tetra4);

                            useTetraHash.Remove(tetra.GetTetraHash());
                            divideTetras.RemoveAt(i);
                            continue;
                        }
                    }

                    i++;
                }

                // 次の候補として追加
                foreach (var tetra in tempDivTetras)
                {
                    ulong thash = tetra.GetTetraHash();
                    if (useTetraHash.ContainsKey(thash) == false)
                    {
                        tetra.CalcCircumcircle();
                        useTetraHash.Add(thash, tetra);
                        divideTetras.Add(tetra);
                    }
                    else
                    {
                        // 衝突
                        // 衝突もとも削除する
                        var deltetra = useTetraHash[thash];
                        useTetraHash.Remove(thash);
                        divideTetras.Remove(deltetra);
                    }
                }
            }

            // 最初に追加したテトラを削除
            for (int i = 0; i < divideTetras.Count;)
            {
                var tetra = divideTetras[i];
                if (tetra.ContainsPoint(tempSV0, tempSV1, tempSV2, tempSV3))
                {
                    // このテトラは削除する
                    useTetraHash.Remove(tetra.GetTetraHash());
                    divideTetras.RemoveAt(i);
                    continue;
                }

                i++;
            }
            vertexList.Remove(tempSV0);
            vertexList.Remove(tempSV1);
            vertexList.Remove(tempSV2);
            vertexList.Remove(tempSV3);

            // テトラの検証
            for (int i = 0; i < divideTetras.Count;)
            {
                var tetra = divideTetras[i];
                if (tetra.Verification() == false)
                {
                    divideTetras.RemoveAt(i);
                    continue;
                }

                i++;
            }

            // 最終結果を格納
            tetraCount = divideTetras.Count;
            foreach (var tetra in divideTetras)
            {
                for (int i = 0; i < 4; i++)
                {
                    tetraIndexList.Add(tetra.vertexList[i].index);
                }

                tetraSizeList.Add(tetra.tetraSize);
            }
        }
Beispiel #9
0
 public bool CheckSame(Tetra tri)
 {
     return(circumCenter == tri.circumCenter && circumRadius == tri.circumRadius);
 }
Beispiel #10
0
        public override ExecutionResult ExecuteInstruction(MmixComputer mmixComputer, Tetra tetra)
        {
            var   reg   = mmixComputer.Registers[tetra.X];
            ulong a     = mmixComputer.Registers[tetra.Y].ToULong() + mmixComputer.Registers[tetra.Z].ToULong();
            var   bytes = mmixComputer.ReadOcta(a);

            reg.Store(bytes);

            return(ExecutionResult.CONTINUE);
        }
Beispiel #11
0
		void depthSort(Tetra.InstancedData[] datas)
		{
			Vector3 vEye = vEyeTarget + vLook * eyeDist;
			Array.Sort(datas,
				delegate(Tetra.InstancedData x, Tetra.InstancedData y) {
					return (new Vector2(y.modelMats.Row3.X, y.modelMats.Row3.Y) - vEye.Xy).LengthFast.
						CompareTo	((new Vector2(x.modelMats.Row3.X, x.modelMats.Row3.Y) - vEye.Xy).LengthFast); });
			
		}
Beispiel #12
0
        public override ExecutionResult ExecuteInstruction(MmixComputer mmixComputer, Tetra tetra)
        {
            mmixComputer.rBB = mmixComputer.Registers[255];

            // TODO there is a lot more to be understood here - http://mmix.cs.hm.edu/doc/instructions-en.html#TRAP
            // for now, XYZ == 0 terminates the program.
            if (tetra.Y == Constants.Fputs && tetra.Z == 1)
            {
                // get pointer from $255
                var address = mmixComputer.Registers[255].ToLong();

                byte letter;
                var  letters = new List <byte>();
                do
                {
                    letter = mmixComputer.Memory[address];
                    letters.Add(letter);
                    address++;
                } while (letter != 0x00);

                Console.Write(Encoding.ASCII.GetString(letters.ToArray()));
            }
            if (tetra.ToInt() == 0)
            {
                return(ExecutionResult.HALTED);
            }

            return(ExecutionResult.CONTINUE);
        }
Beispiel #13
0
 public abstract ExecutionResult ExecuteInstruction(MmixComputer mmixComputer, Tetra tetra);
Beispiel #14
0
 public ExecutionResult Execute(MmixComputer mmixComputer, Tetra tetra)
 {
     //Console.WriteLine(Symbol);
     return(ExecuteInstruction(mmixComputer, tetra));
 }