Beispiel #1
0
    // voxelArray is only used if createIfMissing is true
    private static Voxel SearchDown(OctreeNode node, Vector3Int position, bool createIfMissing, VoxelArray voxelArray)
    {
        VoxelComponent useComponent = null;

        while (node.size != 1)
        {
            // initial root node is larger than COMPONENT_BLOCK_SIZE so a component node should always be found
            if (createIfMissing && useComponent == null && node.size == COMPONENT_BLOCK_SIZE)
            {
                if (node.voxelComponent == null || node.voxelComponent.isDestroyed)
                {
                    GameObject voxelObject = new GameObject();
                    voxelObject.transform.parent = voxelArray.transform;
                    voxelObject.name             = node.position.ToString();
                    node.voxelComponent          = voxelObject.AddComponent <VoxelComponent>();
                }
                useComponent = node.voxelComponent;
            }

            int        halfSize = node.size / 2;
            bool       xLarge   = position.x >= node.position.x + halfSize;
            bool       yLarge   = position.y >= node.position.y + halfSize;
            bool       zLarge   = position.z >= node.position.z + halfSize;
            int        branchI  = (xLarge ? 1 : 0) + (yLarge ? 2 : 0) + (zLarge ? 4 : 0);
            OctreeNode branch   = node.branches[branchI];
            if (branch == null)
            {
                if (!createIfMissing)
                {
                    return(null);
                }
                Vector3Int branchPos = new Vector3Int(
                    node.position.x + (xLarge ? halfSize : 0),
                    node.position.y + (yLarge ? halfSize : 0),
                    node.position.z + (zLarge ? halfSize : 0)
                    );
                branch = new OctreeNode(branchPos, halfSize);
                node.branches[branchI] = branch;
                branch.parent          = node;
            }
            node = branch;
        }

        if (!createIfMissing)
        {
            return(node.voxel);
        }
        else if (node.voxel != null)
        {
            return(node.voxel);
        }
        else
        {
            Voxel newVoxel = voxelArray.InstantiateVoxel(position, useComponent);
            node.voxel          = newVoxel;
            newVoxel.octreeNode = node;
            return(newVoxel);
        }
    }
Beispiel #2
0
    public void Init(VoxelComponent voxelComponent)
    {
        this.voxelComponent = voxelComponent;

        gameObject.name = voxelComponent.GetType().Name.ToString() + "-" + voxelComponent.Entity.Id;

        UpdateMesh();
    }
Beispiel #3
0
    protected override void OnInit(Parameters parameters)
    {
        random         = Entity.Simulation.GetComponentManager <DeterministicRandom>();
        voxelComponent = Entity.GetComponent <VoxelComponent>();
        voxelWorld     = voxelComponent.World;

        SelectTarget();
    }
Beispiel #4
0
    // Use this for initialization
    void Start()
    {
        voxelModel = new GameObject("VoxelModel");
        voxelComp  = voxelModel.AddComponent <VoxelComponent>();
        voxelComp.LoadMagicaModel(@"C:\Projects\Unity\OpenBoxUnity\Assets\VoxModels\cathedral-2.vox", true);

        //voxelModel = VoxelFactory.Load(@"C:\Projects\Unity\OpenBoxUnity\Assets\VoxModels\cathedral-2.vox", VoxelFactory.ColliderType.None);
        voxelModel.transform.parent = transform;
    }
    public void Start()
    {
        component = GetComponent <VoxelComponent>();

        thrust   = new float[6];
        rotation = new float[3];

        Initialize();
    }
    public VoxelObject SpawnAsteroid(Swordfish.Position _position)
    {
        VoxelComponent component = Instantiate(voxelObjectPrefab, _position.toVector3(), Quaternion.identity).GetComponent <VoxelComponent>();

        component.setName("asteroid" + voxelMaster.voxelObjects.Count);
        component.setSize(4);
        component.setStatic(true);
        component.Initialize(VoxelObjectType.ASTEROID);
        return(component.voxelObject);
    }
    public VoxelObject SpawnVoxelObject(Swordfish.Position _position)
    {
        VoxelComponent component = Instantiate(voxelObjectPrefab, _position.toVector3(), Quaternion.identity).GetComponent <VoxelComponent>();

        component.setName("voxelObject" + voxelMaster.voxelObjects.Count);
        component.setSize(2);
        component.setStatic(false);
        component.Initialize(VoxelObjectType.GENERIC);
        return(component.voxelObject);
    }
Beispiel #8
0
    public override void Disable()
    {
        target = null;

        _importmesh = null;
        _vertexlist = null;
        _vertices.Clear();
        selectlist.Clear();
        selectset.Clear();
        _update_mesh  = false;
        _repaint_menu = false;
        _render_mesh  = false;
    }
Beispiel #9
0
    public override void Disable()
    {
        target = null;

        _trianglelist = null;
        _triangles.Clear();
        _update_mesh  = false;
        _repaint_menu = false;
        _render_mesh  = false;
        selectlist.Clear();
        selectset.Clear();
        _selectdisplay.Disable();
    }
        public VoxelObject(int _sizeX, int _sizeY, int _sizeZ, VoxelComponent _component, Guid _guid)
        {
            guid = _guid;
            GameMaster.Instance.voxelMaster.voxelObjects[guid] = this;

            chunkSizeX = _sizeX;
            chunkSizeY = _sizeY;
            chunkSizeZ = _sizeZ;

            component = _component;

            Initialize();
        }
        public VoxelObject(int _sizeX = 1, int _sizeY = 1, int _sizeZ = 1, VoxelComponent _component = null)
        {
            guid = Guid.NewGuid();
            GameMaster.Instance.voxelMaster.voxelObjects[guid] = this;

            chunkSizeX = _sizeX;
            chunkSizeY = _sizeY;
            chunkSizeZ = _sizeZ;

            component = _component;

            Initialize();
        }
        public VoxelHitDataBuiltin(RaycastHit _hit)
        {
            rayInfo = _hit;

            component = _hit.transform.GetComponent <VoxelComponent>();

            if (component == null)
            {
                return;
            }

            voxelObject = component.voxelObject;

            worldNormal = _hit.normal;
            worldNormal.Normalize();
            localNormal = _hit.transform.InverseTransformDirection(_hit.normal);
            localNormal.Normalize();

            _hit.point += (_hit.normal * 0.1f);   //  Pad the ray to penetrate into the voxel's space

            transformPosition  = _hit.transform.position + ((BoxCollider)_hit.collider).center;
            transformPosition -= (Vector3.one * 0.5f); //  Reverse block centering

            //localPosition = _hit.transform.InverseTransformPoint(_hit.point); //  USE CLICK SPACE INSTEAD OF COLLIDER SPACE
            localPosition  = _hit.collider.transform.localPosition + ((BoxCollider)_hit.collider).center;
            localPosition -= component.pivotPoint; //  Offset by the pivot
            localPosition -= (Vector3.one * 0.5f); //  Reverse block centering
            //localPosition += localNormal; //  The hit voxel is offset by the normal of the face we hit  //  USE CLICK SPACE INSTEAD OF COLLIDER SPACE
            localPosition = new Vector3(
                (float)Math.Round(localPosition.x, 0, MidpointRounding.ToEven),
                (float)Math.Round(localPosition.y, 0, MidpointRounding.ToEven),
                (float)Math.Round(localPosition.z, 0, MidpointRounding.ToEven));
            localFacePosition = (localPosition + localNormal);

            worldPosition  = _hit.transform.InverseTransformDirection(_hit.point);
            worldPosition -= worldNormal; //  The hit voxel is offset by the normal of the face we hit
            worldPosition  = new Vector3(
                (float)Math.Round(worldPosition.x, 0, MidpointRounding.ToEven),
                (float)Math.Round(worldPosition.y, 0, MidpointRounding.ToEven),
                (float)Math.Round(worldPosition.z, 0, MidpointRounding.ToEven));
            worldFacePosition = (worldPosition + worldNormal);

            atHit  = Coord3D.fromVector3(localPosition);     //  The coord of the voxel that was hit
            atFace = Coord3D.fromVector3(localFacePosition); //  The coord of the voxel at the face that was hit
        }
Beispiel #13
0
    public override void Disable()
    {
        selectlist.Clear();
        selectset.Clear();

        _update_mesh  = false;
        _render_mesh  = false;
        _repaint_menu = false;
        target        = null;
        _selectdisplay.Disable();
        _meshdisplay.Disable();
        _preview.invx = false;
        _preview.invy = false;

        _axilist    = null;
        _socketlist = null;
        _sockets.Clear();
    }
Beispiel #14
0
    public override EntityComponent InitEntityGameObject(VoxelArray voxelArray, bool storeComponent = true)
    {
        GameObject substanceObject = new GameObject();

        substanceObject.name               = "Substance";
        substanceObject.transform.parent   = voxelArray.transform;
        substanceObject.transform.position = PositionInEditor();

        var voxelComponents = new HashSet <VoxelComponent>();

        foreach (Voxel v in voxels)
        {
            voxelComponents.Add(v.voxelComponent);
        }
        foreach (VoxelComponent vc in voxelComponents)
        {
            // TODO: need to update this!
            if (storeComponent)
            {
                vc.transform.parent = substanceObject.transform;
            }
            else
            {
                // clone
                VoxelComponent vClone = vc.Clone();
                vClone.transform.parent   = substanceObject.transform;
                vClone.transform.position = vc.transform.position;
                vClone.transform.rotation = vc.transform.rotation;
            }
        }
        SubstanceComponent component = substanceObject.AddComponent <SubstanceComponent>();

        component.entity    = this;
        component.substance = this;
        component.health    = health;
        if (storeComponent)
        {
            this.component = component;
        }
        return(component);
    }
        public VoxelHitData(Unity.Physics.RaycastHit _hit, Unity.Entities.Entity _entity)
        {
            rayInfo = _hit;

            hitTransform = GameMaster.Instance.entitiesToObjectMap[_entity];
            component    = hitTransform.GetComponent <VoxelComponent>();

            if (component == null)
            {
                return;
            }

            voxelObject = component.voxelObject;

            _hit.Position += (_hit.SurfaceNormal * 0.1f);   //  Pad the ray to penetrate into the voxel's space

            worldNormal = _hit.SurfaceNormal;
            worldNormal.Normalize();
            localNormal = hitTransform.InverseTransformDirection(_hit.SurfaceNormal);
            localNormal.Normalize();

            voxelPosition  = hitTransform.InverseTransformPoint(_hit.Position);
            voxelPosition -= (component.pivotPoint + (Vector3.one * 0.5f));  //  Offset to match voxel coordinates

            voxelPosition.x = (float)Math.Round(voxelPosition.x);
            voxelPosition.y = (float)Math.Round(voxelPosition.y);
            voxelPosition.z = (float)Math.Round(voxelPosition.z);

            voxelPosition -= localNormal;   //  Reverse centering

            localPosition = voxelPosition + component.pivotPoint + (Vector3.one * 0.5f);
            worldPosition = hitTransform.position + (hitTransform.rotation * localPosition);

            localFacePosition = (localPosition + localNormal);
            voxelFacePosition = (voxelPosition + localNormal);
            worldFacePosition = (worldPosition + worldNormal);

            atHit  = Coord3D.fromVector3(voxelPosition);     //  The coord of the voxel that was hit
            atFace = Coord3D.fromVector3(voxelFacePosition); //  The coord of the voxel at the face that was hit
        }
Beispiel #16
0
    private Voxel InstantiateVoxel(Vector3Int position, VoxelComponent useComponent)
    {
        Voxel voxel = new Voxel();

        voxel.position = position;

        if (useComponent == null)
        {
            if (voxelComponent == null)
            {
                GameObject voxelObject = new GameObject();
                voxelObject.transform.parent = transform;
                voxelObject.name             = "megavoxel";
                voxelComponent = voxelObject.AddComponent <VoxelComponent>();
            }
            voxel.voxelComponent = voxelComponent;
        }
        else
        {
            voxel.voxelComponent = useComponent;
        }
        voxel.voxelComponent.AddVoxel(voxel);
        return(voxel);
    }
Beispiel #17
0
 public Planetoid(int _sizeX = 1, int _sizeY = 1, int _sizeZ = 1, VoxelComponent _component = null) : base(_sizeX, _sizeY, _sizeZ, _component)
 {
 }
Beispiel #18
0
    public void UpdateLists()
    {
        //record list guids
        VoxelComponent lib_obj = null;

        if (_libobjlist.index >= 0 && _libobjlist.index < _libobjlist.count)
        {
            lib_obj = _libobjs[_libobjlist.index];
        }
        string guid_guid = "";

        if (_guidlist.index >= 0 && _guidlist.index < _guidlist.count)
        {
            guid_guid = _guids[_guidlist.index];
        }
        //update library lists
        _libobjs.Clear();
        if (target != null)
        {
            if (typeof(T) == typeof(CornerDesign))
            {
                target.AddCornersToList(_libobjs);
            }
            else if (typeof(T) == typeof(LateralDesign))
            {
                target.AddLateralsToList(_libobjs);
            }
            else if (typeof(T) == typeof(LongitudeDesign))
            {
                target.AddLongitudesToList(_libobjs);
            }
            else if (typeof(T) == typeof(RectDesign))
            {
                target.AddRectsToList(_libobjs);
            }
            else if (typeof(T) == typeof(HexagonDesign))
            {
                target.AddHexagonsToList(_libobjs);
            }
        }
        HashSet <string> lib_guids = new HashSet <string>();

        for (int k = 0; k < _libobjs.Count; k++)
        {
            string guid;
            long   local_id;
            if (!AssetDatabase.TryGetGUIDAndLocalFileIdentifier(_libobjs[k].GetInstanceID(), out guid, out local_id))
            {
                continue;
            }
            lib_guids.Add(guid);
        }
        //update guid list
        _guids.Clear();
        _guidstrs.Clear();
        string[] guids = AssetDatabase.FindAssets("t:" + typeof(T).ToString());
        for (int k = 0; k < guids.Length; k++)
        {
            if (lib_guids.Contains(guids[k]))
            {
                continue;
            }
            string name = AssetDatabase.GUIDToAssetPath(guids[k]);
            if (name == null || name.Length <= 0)
            {
                continue;
            }
            name = Path.GetFileNameWithoutExtension(name);
            if (name == null || name.Length <= 0)
            {
                continue;
            }
            _guids.Add(guids[k]);
            _guidstrs.Add(name);
        }
        //set new list indices
        _libobjlist.index = _libobjs.IndexOf(lib_obj);
        _guidlist.index   = _guids.IndexOf(guid_guid);
    }
Beispiel #19
0
 public Planetoid(int _sizeX, int _sizeY, int _sizeZ, VoxelComponent _component, Guid _guid) : base(_sizeX, _sizeY, _sizeZ, _component, _guid)
 {
 }