예제 #1
0
        public bool OnRaycastHitchanged(Input input, QbMatrix matrix, RaycastHit hit, ref Colort color, MouseButtonEventArgs e)
        {
            if ((e != null && e.IsPressed && e.Button == MouseButton.Left) || (e == null && input.mousedown(MouseButton.Left)))
            {
                QbMatrix mat = Singleton<QbManager>.INSTANCE.ActiveModel.matrices[hit.matrixIndex];
                if (mat != null)
                {
                    Voxel voxel;
                    if (mat.voxels.TryGetValue(mat.GetHash(hit.x, hit.y, hit.z), out voxel))
                    {
                        for (int i = 0; i < 10; i++)
                        {
                            var colorpal = Singleton<GUI>.INSTANCE.Get<EmptyWidget>(GUIID.START_COLOR_SELECTORS + i);

                            if ((bool)colorpal.customData["active"])
                            {
                                colorpal.appearence.Get<PlainBackground>("background").color = mat.colors[voxel.colorindex];
                                Singleton<GUI>.INSTANCE.Dirty = true;

                                Singleton<BrushManager>.INSTANCE.brushColor = mat.colors[voxel.colorindex];

                                Color4 colorr = mat.colors[voxel.colorindex];
                                Singleton<Broadcaster>.INSTANCE.Broadcast(Message.ColorSelectionChanged, colorpal, colorr);
                            }
                        }
                    }
                }
                return true;
            }
            return false;
        }
예제 #2
0
        public void CleanLastVolume(VoxelVolume volume, VoxelVolume currentVolume, QbMatrix matrix, Dictionary <double, VoxelUndoData> modifiedVoxels)
        {
            VoxelUndoData removed = new VoxelUndoData();

            for (int z = volume.minz; z <= volume.maxz; z++)
            {
                for (int y = volume.miny; y <= volume.maxy; y++)
                {
                    for (int x = volume.minx; x <= volume.maxx; x++)
                    {
                        if (!currentVolume.ContainsPoint(x, y, z))
                        {
                            if (modifiedVoxels.TryGetValue(matrix.GetHash(x, y, z), out removed))
                            {
                                if (removed.alphamask > 1)
                                {
                                    matrix.Add(x, y, z, matrix.colors[removed.colorindex]);
                                }
                                modifiedVoxels.Remove(matrix.GetHash(x, y, z));
                            }
                        }
                    }
                }
            }
        }
예제 #3
0
        public BrushMatrixSelection()
        {
            Singleton<Input>.INSTANCE.AddHandler(new InputHandler()
            {
                Keydownhandler = (e) =>
                {
                    if (Singleton<GUI>.INSTANCE.OverWidget) return;
                    if (!Active && e.Key == Key.Space)
                    {
                        Singleton<BrushManager>.INSTANCE.SetCurrentBrush(BrushType);
                    }
                },
                Keyuphandler = (e) =>
                {
                    if (Singleton<GUI>.INSTANCE.OverWidget) return;

                    if (Active && (e.Key == Key.Space || e.Key == Key.Space))
                    {
                        var clientbrush = Singleton<BrushManager>.INSTANCE;
                        clientbrush.SetCurrentBrush(clientbrush.previousBrush.BrushType);
                        Singleton<GUI>.INSTANCE.Get<Label>(GUIID.STATUS_TEXT).text = "";
                        if (lastmatrix != null)
                        {
                            Singleton<QbManager>.INSTANCE.ActiveMatrix = lastmatrix;
                            Singleton<Camera>.INSTANCE.TransitionToMatrix();
                            lastmatrix.highlight = Color4.White;
                            lastmatrix = null;
                        }
                    }
                }
            });
        }
        public bool OnRaycastHitchanged(Input input, QbMatrix matrix, RaycastHit hit, ref Colort color, MouseButtonEventArgs e)
        {
            if (matrix == null)
            {
                if (lastmatrix != null)
                {
                    lastmatrix.highlight = Color4.White;
                    lastmatrix           = null;
                    Singleton <GUI> .INSTANCE.Get <Label>(GUIID.STATUS_TEXT).text = "";
                }
                return(true);
            }

            if (matrix != lastmatrix)
            {
                if (lastmatrix != null)
                {
                    lastmatrix.highlight = Color4.White;
                }
                matrix.highlight = new Colort(1.5f, 1.5f, 1.5f);

                lastmatrix = matrix;
                Singleton <GUI> .INSTANCE.Get <Label>(GUIID.STATUS_TEXT).text = $"Over Matrix : {matrix.name}";
            }
            return(true);
        }
예제 #5
0
 public bool onselectionchanged(Input input, QbMatrix matrix, RaycastHit hit, MouseButtonEventArgs e = null)
 {
     if (matrix != null && !matrix.Visible)
     {
         return(true);
     }
     return(currentBrush.OnRaycastHitchanged(input, matrix, hit, ref brushColor, e));
 }
예제 #6
0
        public void AddMatrix()
        {
            QbMatrix matrix = new QbMatrix();

            matrix.name = "default";
            matrix.setsize(15, 15, 15, true);
            matrix.GenerateVertexBuffers();
            matrices.Add(matrix);
        }
예제 #7
0
        public void AddMatrix(int index)
        {
            QbMatrix matrix = new QbMatrix();

            matrix.name = "default";
            matrix.setsize(15, 15, 15, true);
            matrix.GenerateVertexBuffers();
            matrices.Insert(index, matrix);
        }
예제 #8
0
        public UndoData(VoxelBrushType type, QbMatrix matrix, VoxelVolume volume, Colort color, Dictionary <double, VoxelUndoData> data)
        {
            this.brush  = type;
            this.matrix = matrix;
            this.volume = volume;
            this.color  = color;
            this.data   = new Dictionary <double, VoxelUndoData>();

            foreach (var c in data)
            {
                this.data.Add(c.Key, c.Value);
            }
        }
예제 #9
0
        public Floor(Camera camera, Broadcaster broadcaster)
            : base()
        {
            this.camera      = camera;
            this.broadcaster = broadcaster;

            broadcaster.handlers.Add((message, e, t) =>
            {
                if (message == Message.ActiveMatrixChanged)
                {
                    QbMatrix m = t[0] as QbMatrix;
                    m.MatchFloorToSize();
                }
            });
        }
예제 #10
0
        public bool OnRaycastHitchanged(Input input, QbMatrix matrix, RaycastHit hit, ref Colort color, MouseButtonEventArgs e)
        {
            lastmatrix = matrix;
            switch (state)
            {
            case ToolState.Start:
                if ((e != null && e.IsPressed && e.Button == MouseButton.Left) || (e == null && input.mousedown(MouseButton.Left)))
                {
                    state = ToolState.Base;
                    Singleton <Raycaster> .INSTANCE.testdirt = true;
                    startPosition = new VoxelLocation(hit, false);
                    endPosition   = new VoxelLocation(hit, false);
                    volume        = new VoxelVolume(startPosition, endPosition);
                    modifiedVoxels.Clear();
                    EnumerateVolume(volume, lastvolume, matrix, ref color, modifiedVoxels);
                    lastvolume = volume;
                    return(true);
                }
                break;

            case ToolState.Base:
                if ((e != null && e.IsPressed && e.Button == MouseButton.Left) || (e == null && input.mousedown(MouseButton.Left)))
                {
                    endPosition = new VoxelLocation(hit, false);
                    volume      = new VoxelVolume(startPosition, endPosition);

                    EnumerateVolume(volume, lastvolume, matrix, ref color, modifiedVoxels);
                    CleanLastVolume(lastvolume, volume, matrix, modifiedVoxels);
                    lastvolume = volume;

                    return(true);
                }
                else if ((e != null && !e.IsPressed && e.Button == MouseButton.Left) || (e == null && input.mouseup(MouseButton.Left)))

                {
                    state      = ToolState.Start;
                    lastvolume = VoxelVolume.NEGATIVE_ZERO;
                    Singleton <UndoRedo> .INSTANCE.AddUndo(BrushType, matrix, volume, color, modifiedVoxels);

                    return(true);
                }
                break;

            case ToolState.Limit:
                break;
            }
            return(false);
        }
예제 #11
0
 public void EnumerateVolume(VoxelVolume volume, VoxelVolume currentVolume, QbMatrix matrix, ref Colort color, Dictionary <double, VoxelUndoData> modifiedVoxels)
 {
     for (int z = currentVolume.minz; z <= currentVolume.maxz; z++)
     {
         for (int y = currentVolume.miny; y <= currentVolume.maxy; y++)
         {
             for (int x = currentVolume.minx; x <= currentVolume.maxx; x++)
             {
                 if (!volume.ContainsPoint(x, y, z) && !modifiedVoxels.ContainsKey(matrix.GetHash(x, y, z)))
                 {
                     modifiedVoxels.Add(matrix.GetHash(x, y, z), new VoxelUndoData(matrix.Add(x, y, z, color)));
                 }
             }
         }
     }
 }
예제 #12
0
        public bool OnRaycastHitchanged(Input input, QbMatrix matrix, RaycastHit hit, ref Colort color, MouseButtonEventArgs e)
        {
            lastmatrix = matrix;
            switch (state)
            {
                case ToolState.Start:
                    if ((e != null && e.IsPressed && e.Button == MouseButton.Left) || (e == null && input.mousedown(MouseButton.Left)))
                    {
                        state = ToolState.Base;
                        Singleton<Raycaster>.INSTANCE.testdirt = true;
                        startPosition = new VoxelLocation(hit, false);
                        endPosition = new VoxelLocation(hit, false);
                        volume = new VoxelVolume(startPosition, endPosition);
                        modifiedVoxels.Clear();
                        EnumerateVolume(volume, lastvolume, matrix, ref color, modifiedVoxels);
                        lastvolume = volume;
                        return true;
                    }
                    break;
                case ToolState.Base:
                    if ((e != null && e.IsPressed && e.Button == MouseButton.Left) || (e == null && input.mousedown(MouseButton.Left)))
                    {
                        endPosition = new VoxelLocation(hit, false);
                        volume = new VoxelVolume(startPosition, endPosition);

                        EnumerateVolume(volume, lastvolume, matrix, ref color, modifiedVoxels);
                        CleanLastVolume(lastvolume, volume, matrix, modifiedVoxels);
                        lastvolume = volume;

                        return true;
                    }
                    else if ((e != null && !e.IsPressed && e.Button == MouseButton.Left) || (e == null && input.mouseup(MouseButton.Left)))

                    {
                        state = ToolState.Start;
                        lastvolume = VoxelVolume.NEGATIVE_ZERO;
                        Singleton<UndoRedo>.INSTANCE.AddUndo(BrushType, matrix, volume, color, modifiedVoxels);
                        return true;
                    }
                    break;
                case ToolState.Limit:
                    break;
            }
            return false;
        }
예제 #13
0
        public void RemoveVolume(VoxelVolume volume, QbMatrix matrix, Dictionary <double, VoxelUndoData> modifiedVoxels)
        {
            VoxelUndoData _temp;

            for (int z = volume.minz; z <= volume.maxz; z++)
            {
                for (int y = volume.miny; y <= volume.maxy; y++)
                {
                    for (int x = volume.minx; x <= volume.maxx; x++)
                    {
                        if (modifiedVoxels.TryGetValue(matrix.GetHash(x, y, z), out _temp) && _temp.changed)
                        {
                            matrix.Remove(x, y, z, false, false);
                            modifiedVoxels.Remove(matrix.GetHash(x, y, z));
                        }
                    }
                }
            }
        }
예제 #14
0
        public void AddVolume(VoxelVolume volume, QbMatrix matrix, ref Colort color, Dictionary <double, VoxelUndoData> modifiedVoxels)
        {
            double hash;

            for (int z = volume.minz; z <= volume.maxz; z++)
            {
                for (int y = volume.miny; y <= volume.maxy; y++)
                {
                    for (int x = volume.minx; x <= volume.maxx; x++)
                    {
                        hash = matrix.GetHash(x, y, z);
                        if (!modifiedVoxels.ContainsKey(hash))
                        {
                            modifiedVoxels.Add(hash, new VoxelUndoData(matrix.Add(x, y, z, color)));
                        }
                    }
                }
            }
        }
예제 #15
0
 public void CleanLastVolume(VoxelVolume volume, VoxelVolume currentVolume, QbMatrix matrix, Dictionary <double, VoxelUndoData> modifiedVoxels)
 {
     for (int z = volume.minz; z <= volume.maxz; z++)
     {
         for (int y = volume.miny; y <= volume.maxy; y++)
         {
             for (int x = volume.minx; x <= volume.maxx; x++)
             {
                 if (!currentVolume.ContainsPoint(x, y, z))
                 {
                     if (modifiedVoxels[matrix.GetHash(x, y, z)].changed)
                     {
                         matrix.Remove(x, y, z, false, false);
                         modifiedVoxels.Remove(matrix.GetHash(x, y, z));
                     }
                 }
             }
         }
     }
 }
예제 #16
0
        public void RemoveVolume(VoxelVolume volume, QbMatrix matrix, Dictionary <double, VoxelUndoData> modifiedVoxels)
        {
            double        hash;
            VoxelUndoData voxel = new VoxelUndoData();

            for (int z = volume.minz; z <= volume.maxz; z++)
            {
                for (int y = volume.miny; y <= volume.maxy; y++)
                {
                    for (int x = volume.minx; x <= volume.maxx; x++)
                    {
                        hash = matrix.GetHash(x, y, z);
                        if (modifiedVoxels.TryGetValue(hash, out voxel))
                        {
                            matrix.Color(x, y, z, voxel.colorindex, false, true);
                            modifiedVoxels.Remove(hash);
                        }
                    }
                }
            }
        }
예제 #17
0
        public void AddVolume(VoxelVolume volume, QbMatrix matrix, ref Colort color, Dictionary <double, VoxelUndoData> modifiedVoxels)
        {
            double hash;
            Voxel  voxel = null;

            for (int z = volume.minz; z <= volume.maxz; z++)
            {
                for (int y = volume.miny; y <= volume.maxy; y++)
                {
                    for (int x = volume.minx; x <= volume.maxx; x++)
                    {
                        hash = matrix.GetHash(x, y, z);

                        if (!modifiedVoxels.ContainsKey(hash) && matrix.voxels.TryGetValue(hash, out voxel) && voxel.alphamask > 1)
                        {
                            modifiedVoxels.Add(hash, new VoxelUndoData(matrix.voxels[hash].colorindex, 0));
                            matrix.Color(x, y, z, color);
                        }
                    }
                }
            }
        }
예제 #18
0
        public BrushMatrixSelection()
        {
            Singleton <Input> .INSTANCE.AddHandler(new InputHandler()
            {
                Keydownhandler = (e) =>
                {
                    if (Singleton <GUI> .INSTANCE.OverWidget)
                    {
                        return;
                    }
                    if (!Active && e.Key == Key.Space)
                    {
                        Singleton <BrushManager> .INSTANCE.SetCurrentBrush(BrushType);
                    }
                },
                Keyuphandler = (e) =>
                {
                    if (Singleton <GUI> .INSTANCE.OverWidget)
                    {
                        return;
                    }

                    if (Active && (e.Key == Key.Space || e.Key == Key.Space))
                    {
                        var clientbrush = Singleton <BrushManager> .INSTANCE;
                        clientbrush.SetCurrentBrush(clientbrush.previousBrush.BrushType);
                        Singleton <GUI> .INSTANCE.Get <Label>(GUIID.STATUS_TEXT).text = "";
                        if (lastmatrix != null)
                        {
                            Singleton <QbManager> .INSTANCE.ActiveMatrix = lastmatrix;
                            Singleton <Camera> .INSTANCE.TransitionToMatrix();
                            lastmatrix.highlight = Color4.White;
                            lastmatrix           = null;
                        }
                    }
                }
            });
        }
예제 #19
0
        public void AddVolume(VoxelVolume volume, QbMatrix matrix, ref Colort color, Dictionary <double, VoxelUndoData> modifiedVoxels)
        {
            VoxelUndoData removed = new VoxelUndoData();

            for (int z = volume.minz; z <= volume.maxz; z++)
            {
                for (int y = volume.miny; y <= volume.maxy; y++)
                {
                    for (int x = volume.minx; x <= volume.maxx; x++)
                    {
                        if (!modifiedVoxels.ContainsKey(matrix.GetHash(x, y, z)))
                        {
                            if (matrix.GetColorIndex_Alphamask(x, y, z, out removed.colorindex, out removed.alphamask))
                            {
                                if (matrix.Remove(x, y, z, true, false))
                                {
                                    modifiedVoxels.Add(matrix.GetHash(x, y, z), removed);
                                }
                            }
                        }
                    }
                }
            }
        }
예제 #20
0
        public bool OnRaycastHitchanged(Input input, QbMatrix matrix, RaycastHit hit, ref Colort color, MouseButtonEventArgs e)
        {
            if (matrix == null)
            {
                if (lastmatrix != null)
                {
                    lastmatrix.highlight = Color4.White;
                    lastmatrix = null;
                    Singleton<GUI>.INSTANCE.Get<Label>(GUIID.STATUS_TEXT).text = "";
                }
                return true;
            }

            if(matrix != lastmatrix)
            {
                if (lastmatrix != null)
                    lastmatrix.highlight = Color4.White;
                matrix.highlight = new Colort(1.5f, 1.5f, 1.5f);

                lastmatrix = matrix;
                Singleton<GUI>.INSTANCE.Get<Label>(GUIID.STATUS_TEXT).text = $"Over Matrix : {matrix.name}";
            }
            return true;
        }
예제 #21
0
        public RaycastHit RaycastTest(Vector3 camerapos, QbMatrix m)
        {
            RaycastHit hitpoint = new RaycastHit();

            hitpoint.distance = 10000;
            rayOrigin         = camerapos;

            _front  = RayIntersectsPlane(ref front, ref camera.direction);
            _back   = RayIntersectsPlane(ref back, ref camera.direction);
            _top    = RayIntersectsPlane(ref top, ref camera.direction);
            _bottom = RayIntersectsPlane(ref bottom, ref camera.direction);
            _right  = RayIntersectsPlane(ref right, ref camera.direction);
            _left   = RayIntersectsPlane(ref left, ref camera.direction);

            //var outp =string.Format("front {0},back {1},top {2},bottom {3},left {4},right {5},", _front, _back, _top, _bottom, _left, _right);
            //Console.WriteLine(outp);

            // RayTestTriangle region... kinda think of like quad treeing
            //Vector3[] f1 = new Vector3[] { new Vector3(0, 0, 0), new Vector3(m.size.X/2f, m.size.Y /2f, m.size.Z/2f) };
            //Vector3[] f2 = new Vector3[] { new Vector3(0, 0, 0), new Vector3(0, 0, 0) };
            //Vector3[] f3 = new Vector3[] { new Vector3(0, 0, 0), new Vector3(0, 0, 0) };
            //Vector3[] f4 = new Vector3[] { new Vector3(0, 0, 0), new Vector3(0, 0, 0) };
            //Vector3[] f5 = new Vector3[] { new Vector3(0, 0, 0), new Vector3(0, 0, 0) };
            //Vector3[] f6 = new Vector3[] { new Vector3(0, 0, 0), new Vector3(0, 0, 0) };
            //Vector3[] f7 = new Vector3[] { new Vector3(0, 0, 0), new Vector3(0, 0, 0) };
            //Vector3[] f8 = new Vector3[] { new Vector3(0, 0, 0), new Vector3(0, 0, 0) };

            foreach (var v in m.voxels.Values)
            {
                if (testdirt)
                {
                    if (v.dirty)
                    {
                        ////front
                        if (_front && (RayTestTriangle(ref front, -cubesize + v.x, -cubesize + v.y, cubesize + v.z,
                                                       cubesize + v.x, -cubesize + v.y, cubesize + v.z,
                                                       cubesize + v.x, cubesize + v.y, cubesize + v.z,
                                                       out testout) || RayTestTriangle(ref front, -cubesize + v.x, -cubesize + v.y, cubesize + v.z,
                                                                                       cubesize + v.x, cubesize + v.y, cubesize + v.z,
                                                                                       -cubesize + v.x, cubesize + v.y, cubesize + v.z, out testout)))
                        {
                            d = distance(v.x * .5f, v.y * .5f, v.z * .5f + .5f);
                            if (d < hitpoint.distance)
                            {
                                hitpoint.distance = d;
                                hitpoint.x        = v.x;
                                hitpoint.y        = v.y;
                                hitpoint.z        = v.z;
                                hitpoint.side     = Side.Front;
                            }
                        }

                        ////bavk
                        if (_back && (RayTestTriangle(ref back, -cubesize + v.x, -cubesize + v.y, -cubesize + v.z,
                                                      cubesize + v.x, -cubesize + v.y, -cubesize + v.z,
                                                      cubesize + v.x, cubesize + v.y, -cubesize + v.z,
                                                      out testout) || RayTestTriangle(ref back, -cubesize + v.x, -cubesize + v.y, -cubesize + v.z,
                                                                                      cubesize + v.x, cubesize + v.y, -cubesize + v.z,
                                                                                      -cubesize + v.x, cubesize + v.y, -cubesize + v.z, out testout)))
                        {
                            d = distance(v.x * .5f, v.y * .5f, v.z * .5f - .5f);
                            if (d < hitpoint.distance)
                            {
                                hitpoint.distance = d;
                                hitpoint.x        = v.x;
                                hitpoint.y        = v.y;
                                hitpoint.z        = v.z;
                                hitpoint.side     = Side.Back;
                            }
                        }


                        //top
                        if (_top && (RayTestTriangle(ref top, -cubesize + v.x, cubesize + v.y, cubesize + v.z,
                                                     cubesize + v.x, cubesize + v.y, cubesize + v.z,
                                                     cubesize + v.x, cubesize + v.y, -cubesize + v.z,
                                                     out testout) || RayTestTriangle(ref top, -cubesize + v.x, cubesize + v.y, cubesize + v.z,
                                                                                     cubesize + v.x, cubesize + v.y, -cubesize + v.z,
                                                                                     -cubesize + v.x, cubesize + v.y, -cubesize + v.z, out testout)))
                        {
                            d = distance(v.x * .5f, v.y * .5f + .5f, v.z * .5f);
                            if (d < hitpoint.distance)
                            {
                                hitpoint.distance = d;
                                hitpoint.x        = v.x;
                                hitpoint.y        = v.y;
                                hitpoint.z        = v.z;
                                hitpoint.side     = Side.Top;
                            }
                        }

                        ////bottom
                        if (_bottom && (RayTestTriangle(ref bottom, -cubesize + v.x, -cubesize + v.y, cubesize + v.z,
                                                        cubesize + v.x, -cubesize + v.y, cubesize + v.z,
                                                        cubesize + v.x, -cubesize + v.y, -cubesize + v.z,
                                                        out testout) || RayTestTriangle(ref bottom, -cubesize + v.x, -cubesize + v.y, cubesize + v.z,
                                                                                        cubesize + v.x, -cubesize + v.y, -cubesize + v.z,
                                                                                        -cubesize + v.x, -cubesize + v.y, -cubesize + v.z, out testout)))
                        {
                            d = distance(v.x * .5f, v.y * .5f - .5f, v.z * .5f);
                            if (d < hitpoint.distance)
                            {
                                hitpoint.distance = d;
                                hitpoint.x        = v.x;
                                hitpoint.y        = v.y;
                                hitpoint.z        = v.z;
                                hitpoint.side     = Side.Bottom;
                            }
                        }

                        ////left
                        if (_left && (RayTestTriangle(ref left, cubesize + v.x, -cubesize + v.y, -cubesize + v.z,
                                                      cubesize + v.x, -cubesize + v.y, cubesize + v.z,
                                                      cubesize + v.x, cubesize + v.y, cubesize + v.z,
                                                      out testout) || RayTestTriangle(ref left, cubesize + v.x, -cubesize + v.y, -cubesize + v.z,
                                                                                      cubesize + v.x, cubesize + v.y, cubesize + v.z,
                                                                                      cubesize + v.x, cubesize + v.y, -cubesize + v.z, out testout)))
                        {
                            d = distance(v.x * .5f + .5f, v.y * .5f, v.z * .5f);
                            if (d < hitpoint.distance)
                            {
                                hitpoint.distance = d;
                                hitpoint.x        = v.x;
                                hitpoint.y        = v.y;
                                hitpoint.z        = v.z;
                                hitpoint.side     = Side.Left;
                            }
                        }

                        ////right
                        if (_right && (RayTestTriangle(ref right, -cubesize + v.x, -cubesize + v.y, -cubesize + v.z,
                                                       -cubesize + v.x, -cubesize + v.y, cubesize + v.z,
                                                       -cubesize + v.x, cubesize + v.y, cubesize + v.z,
                                                       out testout) || RayTestTriangle(ref right, -cubesize + v.x, -cubesize + v.y, -cubesize + v.z,
                                                                                       -cubesize + v.x, cubesize + v.y, cubesize + v.z,
                                                                                       -cubesize + v.x, cubesize + v.y, -cubesize + v.z, out testout)))
                        {
                            d = distance(v.x * .5f - .5f, v.y * .5f, v.z * .5f);
                            if (d < hitpoint.distance)
                            {
                                hitpoint.distance = d;
                                hitpoint.x        = v.x;
                                hitpoint.y        = v.y;
                                hitpoint.z        = v.z;
                                hitpoint.side     = Side.Right;
                            }
                        }
                    }
                    else
                    {
                        //front
                        if (_front && ((v.alphamask & 32) == 32))
                        {
                            if ((RayTestTriangle(ref front, -cubesize + v.x, -cubesize + v.y, cubesize + v.z,
                                                 cubesize + v.x, -cubesize + v.y, cubesize + v.z,
                                                 cubesize + v.x, cubesize + v.y, cubesize + v.z,
                                                 out testout) || RayTestTriangle(ref front, -cubesize + v.x, -cubesize + v.y, cubesize + v.z,
                                                                                 cubesize + v.x, cubesize + v.y, cubesize + v.z,
                                                                                 -cubesize + v.x, cubesize + v.y, cubesize + v.z, out testout)))
                            {
                                d = distance(v.x * .5f, v.y * .5f, v.z * .5f + .5f);
                                if (d < hitpoint.distance)
                                {
                                    hitpoint.distance = d;
                                    hitpoint.x        = v.x;
                                    hitpoint.y        = v.y;
                                    hitpoint.z        = v.z;
                                    hitpoint.side     = Side.Front;
                                }
                            }
                        }

                        //bavk
                        if (_back && ((v.alphamask & 64) == 64))
                        {
                            if ((RayTestTriangle(ref back, -cubesize + v.x, -cubesize + v.y, -cubesize + v.z,
                                                 cubesize + v.x, -cubesize + v.y, -cubesize + v.z,
                                                 cubesize + v.x, cubesize + v.y, -cubesize + v.z,
                                                 out testout) || RayTestTriangle(ref back, -cubesize + v.x, -cubesize + v.y, -cubesize + v.z,
                                                                                 cubesize + v.x, cubesize + v.y, -cubesize + v.z,
                                                                                 -cubesize + v.x, cubesize + v.y, -cubesize + v.z, out testout)))
                            {
                                d = distance(v.x * .5f, v.y * .5f, v.z * .5f - .5f);
                                if (d < hitpoint.distance)
                                {
                                    hitpoint.distance = d;
                                    hitpoint.x        = v.x;
                                    hitpoint.y        = v.y;
                                    hitpoint.z        = v.z;
                                    hitpoint.side     = Side.Back;
                                }
                            }
                        }

                        //top
                        if (_top && ((v.alphamask & 8) == 8))
                        {
                            if ((RayTestTriangle(ref top, -cubesize + v.x, cubesize + v.y, cubesize + v.z,
                                                 cubesize + v.x, cubesize + v.y, cubesize + v.z,
                                                 cubesize + v.x, cubesize + v.y, -cubesize + v.z,
                                                 out testout) || RayTestTriangle(ref top, -cubesize + v.x, cubesize + v.y, cubesize + v.z,
                                                                                 cubesize + v.x, cubesize + v.y, -cubesize + v.z,
                                                                                 -cubesize + v.x, cubesize + v.y, -cubesize + v.z, out testout)))
                            {
                                d = distance(v.x * .5f, v.y * .5f + .5f, v.z * .5f);
                                if (d < hitpoint.distance)
                                {
                                    hitpoint.distance = d;
                                    hitpoint.x        = v.x;
                                    hitpoint.y        = v.y;
                                    hitpoint.z        = v.z;
                                    hitpoint.side     = Side.Top;
                                }
                            }
                        }

                        //bottom
                        if (_bottom && ((v.alphamask & 16) == 16))
                        {
                            if ((RayTestTriangle(ref bottom, -cubesize + v.x, -cubesize + v.y, cubesize + v.z,
                                                 cubesize + v.x, -cubesize + v.y, cubesize + v.z,
                                                 cubesize + v.x, -cubesize + v.y, -cubesize + v.z,
                                                 out testout) || RayTestTriangle(ref bottom, -cubesize + v.x, -cubesize + v.y, cubesize + v.z,
                                                                                 cubesize + v.x, -cubesize + v.y, -cubesize + v.z,
                                                                                 -cubesize + v.x, -cubesize + v.y, -cubesize + v.z, out testout)))
                            {
                                d = distance(v.x * .5f, v.y * .5f - .5f, v.z * .5f);
                                if (d < hitpoint.distance)
                                {
                                    hitpoint.distance = d;
                                    hitpoint.x        = v.x;
                                    hitpoint.y        = v.y;
                                    hitpoint.z        = v.z;
                                    hitpoint.side     = Side.Bottom;
                                }
                            }
                        }

                        //left
                        if (_left && ((v.alphamask & 2) == 2))
                        {
                            if ((RayTestTriangle(ref left, cubesize + v.x, -cubesize + v.y, -cubesize + v.z,
                                                 cubesize + v.x, -cubesize + v.y, cubesize + v.z,
                                                 cubesize + v.x, cubesize + v.y, cubesize + v.z,
                                                 out testout) || RayTestTriangle(ref left, cubesize + v.x, -cubesize + v.y, -cubesize + v.z,
                                                                                 cubesize + v.x, cubesize + v.y, cubesize + v.z,
                                                                                 cubesize + v.x, cubesize + v.y, -cubesize + v.z, out testout)))
                            {
                                d = distance(v.x * .5f + .5f, v.y * .5f, v.z * .5f);
                                if (d < hitpoint.distance)
                                {
                                    hitpoint.distance = d;
                                    hitpoint.x        = v.x;
                                    hitpoint.y        = v.y;
                                    hitpoint.z        = v.z;
                                    hitpoint.side     = Side.Left;
                                }
                            }
                        }

                        //right
                        if (_right && ((v.alphamask & 4) == 4))
                        {
                            if ((RayTestTriangle(ref right, -cubesize + v.x, -cubesize + v.y, -cubesize + v.z,
                                                 -cubesize + v.x, -cubesize + v.y, cubesize + v.z,
                                                 -cubesize + v.x, cubesize + v.y, cubesize + v.z,
                                                 out testout) || RayTestTriangle(ref right, -cubesize + v.x, -cubesize + v.y, -cubesize + v.z,
                                                                                 -cubesize + v.x, cubesize + v.y, cubesize + v.z,
                                                                                 -cubesize + v.x, cubesize + v.y, -cubesize + v.z, out testout)))
                            {
                                d = distance(v.x * .5f - .5f, v.y * .5f, v.z * .5f);
                                if (d < hitpoint.distance)
                                {
                                    hitpoint.distance = d;
                                    hitpoint.x        = v.x;
                                    hitpoint.y        = v.y;
                                    hitpoint.z        = v.z;
                                    hitpoint.side     = Side.Right;
                                }
                            }
                        }
                    }
                }
                else if (v.alphamask > 0)
                {
                    if (v.dirty)
                    {
                        continue;
                    }
                    //front
                    if (_front && ((v.alphamask & 32) == 32 || m.IsDirty(v.x, v.y, v.z + 1)))
                    {
                        if ((RayTestTriangle(ref front, -cubesize + v.x, -cubesize + v.y, cubesize + v.z,
                                             cubesize + v.x, -cubesize + v.y, cubesize + v.z,
                                             cubesize + v.x, cubesize + v.y, cubesize + v.z,
                                             out testout) || RayTestTriangle(ref front, -cubesize + v.x, -cubesize + v.y, cubesize + v.z,
                                                                             cubesize + v.x, cubesize + v.y, cubesize + v.z,
                                                                             -cubesize + v.x, cubesize + v.y, cubesize + v.z, out testout)))
                        {
                            d = distance(v.x * .5f, v.y * .5f, v.z * .5f + .5f);
                            if (d < hitpoint.distance)
                            {
                                hitpoint.distance = d;
                                hitpoint.x        = v.x;
                                hitpoint.y        = v.y;
                                hitpoint.z        = v.z;
                                hitpoint.side     = Side.Front;
                            }
                        }
                    }

                    //bavk
                    if (_back && ((v.alphamask & 64) == 64 || m.IsDirty(v.x, v.y, v.z - 1)))
                    {
                        if ((RayTestTriangle(ref back, -cubesize + v.x, -cubesize + v.y, -cubesize + v.z,
                                             cubesize + v.x, -cubesize + v.y, -cubesize + v.z,
                                             cubesize + v.x, cubesize + v.y, -cubesize + v.z,
                                             out testout) || RayTestTriangle(ref back, -cubesize + v.x, -cubesize + v.y, -cubesize + v.z,
                                                                             cubesize + v.x, cubesize + v.y, -cubesize + v.z,
                                                                             -cubesize + v.x, cubesize + v.y, -cubesize + v.z, out testout)))
                        {
                            d = distance(v.x * .5f, v.y * .5f, v.z * .5f - .5f);
                            if (d < hitpoint.distance)
                            {
                                hitpoint.distance = d;
                                hitpoint.x        = v.x;
                                hitpoint.y        = v.y;
                                hitpoint.z        = v.z;
                                hitpoint.side     = Side.Back;
                            }
                        }
                    }


                    //top
                    if (_top && ((v.alphamask & 8) == 8) || m.IsDirty(v.x, v.y + 1, v.z))
                    {
                        if ((RayTestTriangle(ref top, -cubesize + v.x, cubesize + v.y, cubesize + v.z,
                                             cubesize + v.x, cubesize + v.y, cubesize + v.z,
                                             cubesize + v.x, cubesize + v.y, -cubesize + v.z,
                                             out testout) || RayTestTriangle(ref top, -cubesize + v.x, cubesize + v.y, cubesize + v.z,
                                                                             cubesize + v.x, cubesize + v.y, -cubesize + v.z,
                                                                             -cubesize + v.x, cubesize + v.y, -cubesize + v.z, out testout)))
                        {
                            d = distance(v.x * .5f, v.y * .5f + .5f, v.z * .5f);
                            if (d < hitpoint.distance)
                            {
                                hitpoint.distance = d;
                                hitpoint.x        = v.x;
                                hitpoint.y        = v.y;
                                hitpoint.z        = v.z;
                                hitpoint.side     = Side.Top;
                            }
                        }
                    }

                    //bottom
                    if (_bottom && ((v.alphamask & 16) == 16) || m.IsDirty(v.x, v.y - 1, v.z))
                    {
                        if ((RayTestTriangle(ref bottom, -cubesize + v.x, -cubesize + v.y, cubesize + v.z,
                                             cubesize + v.x, -cubesize + v.y, cubesize + v.z,
                                             cubesize + v.x, -cubesize + v.y, -cubesize + v.z,
                                             out testout) || RayTestTriangle(ref bottom, -cubesize + v.x, -cubesize + v.y, cubesize + v.z,
                                                                             cubesize + v.x, -cubesize + v.y, -cubesize + v.z,
                                                                             -cubesize + v.x, -cubesize + v.y, -cubesize + v.z, out testout)))
                        {
                            d = distance(v.x * .5f, v.y * .5f - .5f, v.z * .5f);
                            if (d < hitpoint.distance)
                            {
                                hitpoint.distance = d;
                                hitpoint.x        = v.x;
                                hitpoint.y        = v.y;
                                hitpoint.z        = v.z;
                                hitpoint.side     = Side.Bottom;
                            }
                        }
                    }

                    //left
                    if (_left && ((v.alphamask & 2) == 2 || m.IsDirty(v.x + 1, v.y, v.z)))
                    {
                        if ((RayTestTriangle(ref left, cubesize + v.x, -cubesize + v.y, -cubesize + v.z,
                                             cubesize + v.x, -cubesize + v.y, cubesize + v.z,
                                             cubesize + v.x, cubesize + v.y, cubesize + v.z,
                                             out testout) || RayTestTriangle(ref left, cubesize + v.x, -cubesize + v.y, -cubesize + v.z,
                                                                             cubesize + v.x, cubesize + v.y, cubesize + v.z,
                                                                             cubesize + v.x, cubesize + v.y, -cubesize + v.z, out testout)))
                        {
                            d = distance(v.x * .5f + .5f, v.y * .5f, v.z * .5f);
                            if (d < hitpoint.distance)
                            {
                                hitpoint.distance = d;
                                hitpoint.x        = v.x;
                                hitpoint.y        = v.y;
                                hitpoint.z        = v.z;
                                hitpoint.side     = Side.Left;
                            }
                        }
                    }

                    //right
                    if (_right && ((v.alphamask & 4) == 4 || m.IsDirty(v.x - 1, v.y, v.z)))
                    {
                        if ((RayTestTriangle(ref right, -cubesize + v.x, -cubesize + v.y, -cubesize + v.z,
                                             -cubesize + v.x, -cubesize + v.y, cubesize + v.z,
                                             -cubesize + v.x, cubesize + v.y, cubesize + v.z,
                                             out testout) || RayTestTriangle(ref right, -cubesize + v.x, -cubesize + v.y, -cubesize + v.z,
                                                                             -cubesize + v.x, cubesize + v.y, cubesize + v.z,
                                                                             -cubesize + v.x, cubesize + v.y, -cubesize + v.z, out testout)))
                        {
                            d = distance(v.x * .5f - .5f, v.y * .5f, v.z * .5f);
                            if (d < hitpoint.distance)
                            {
                                hitpoint.distance = d;
                                hitpoint.x        = v.x;
                                hitpoint.y        = v.y;
                                hitpoint.z        = v.z;
                                hitpoint.side     = Side.Right;
                            }
                        }
                    }
                }
            }
            return(hitpoint);
        }
예제 #22
0
 public bool OnRaycastHitchanged(Input input, QbMatrix matrix, RaycastHit hit, ref Colort color, MouseButtonEventArgs e)
 {
     return true;
 }
예제 #23
0
 public void CleanLastVolume(VoxelVolume volume, VoxelVolume currentVolume, QbMatrix matrix, Dictionary<double, VoxelUndoData> modifiedVoxels)
 {
 }
예제 #24
0
        public void AddVolume(VoxelVolume volume, QbMatrix matrix, ref Colort color, Dictionary<double, VoxelUndoData> modifiedVoxels)
        {
            double hash;
            Voxel voxel = null;
            for (int z = volume.minz; z <= volume.maxz; z++)
                for (int y = volume.miny; y <= volume.maxy; y++)
                    for (int x = volume.minx; x <= volume.maxx; x++)
                    {
                        hash = matrix.GetHash(x, y, z);

                        if (!modifiedVoxels.ContainsKey(hash) && matrix.voxels.TryGetValue(hash, out voxel) && voxel.alphamask > 1)
                        {
                            modifiedVoxels.Add(hash, new VoxelUndoData(matrix.voxels[hash].colorindex, 0));
                            matrix.Color(x, y, z, color);
                        }
                    }
        }
예제 #25
0
        public void write(string path, string name, QbModel model)
        {
            string fullpath = Path.Combine(path, name + extension);

            using (FileStream f = new FileStream(fullpath, FileMode.OpenOrCreate))
            {
                using (BinaryWriter w = new BinaryWriter(f))
                {
                    w.Write(model.version);
                    w.Write(model.colorFormat);
                    w.Write(model.zAxisOrientation);
                    w.Write(model.compressed);
                    w.Write(model.visibilityMaskEncoded);

                    w.Write((uint)model.matrices.Count);

                    for (int i = 0; i < model.numMatrices; i++)
                    {
                        QbMatrix m = model.matrices[i];
                        if (!m.Visible)
                        {
                            continue;
                        }

                        int startx = Math.Min(0, m.minx);
                        int starty = Math.Min(0, m.miny);
                        int startz = Math.Min(0, m.minz);

                        int width  = (int)(Math.Abs(Math.Min(0, m.minx)) + m.maxx + 1);
                        int height = (int)(Math.Abs(Math.Min(0, m.miny)) + m.maxy + 1);
                        int length = (int)(Math.Abs(Math.Min(0, m.minz)) + m.maxz + 1);

                        if (width < m.size.X)
                        {
                            width = (int)m.size.X;
                        }

                        if (height < m.size.Y)
                        {
                            height = (int)m.size.Y;
                        }

                        if (length < m.size.Z)
                        {
                            length = (int)m.size.Z;
                        }

                        w.Write(m.name);
                        w.Write((uint)width);
                        w.Write((uint)height);
                        w.Write((uint)length);

                        w.Write((int)m.position.X);
                        w.Write((int)m.position.Y);
                        w.Write((int)m.position.Z);

                        if (model.compressed == 0)
                        {
                            Voxel voxel;
                            for (int z = startz; z < startz + length; z++)
                            {
                                for (int y = starty; y < starty + height; y++)
                                {
                                    for (int x = startx; x < startx + width; x++)
                                    {
                                        int zz = model.zAxisOrientation == (int)0 ? z : (int)(length - z - 1);

                                        if (m.voxels.TryGetValue(m.GetHash(x, y, zz), out voxel))
                                        {
                                            Colort c = m.colors[voxel.colorindex];

                                            int r = (int)(c.R * 255f);
                                            int g = (int)(c.G * 255f);
                                            int b = (int)(c.B * 255f);

                                            w.Write((byte)r);
                                            w.Write((byte)g);
                                            w.Write((byte)b);
                                            w.Write(voxel.alphamask);
                                        }
                                        else
                                        {
                                            w.Write((byte)0);
                                            w.Write((byte)0);
                                            w.Write((byte)0);
                                            w.Write((byte)0);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
예제 #26
0
 public void EnumerateVolume(VoxelVolume volume, VoxelVolume currentVolume, QbMatrix matrix, ref Colort color, Dictionary <double, VoxelUndoData> modifiedVoxels)
 {
 }
예제 #27
0
        public void write(string path, string name, QbModel dataType)
        {
            Dictionary <int, string> colorlookup = new Dictionary <int, string>();
            int colorindex = 0;

            using (FileStream material = new FileStream(path + "\\" + name + ".mtl", FileMode.OpenOrCreate))
            {
                using (StreamWriter _out = new StreamWriter(material))
                {
                    for (int t = 0; t < dataType.matrices.Count; t++)
                    {
                        //color index, to string for usemlt value
                        QbMatrix m = dataType.matrices[t];
                        if (!m.Visible)
                        {
                            continue;
                        }
                        foreach (var color in m.colors)
                        {
                            float r = color.R;
                            float g = color.G;
                            float b = color.B;
                            if (r < 0.0F)
                            {
                                r = 0.0F;
                            }
                            if (r > 1.0F)
                            {
                                r = 1.0F;
                            }
                            if (r <= 0.03928F)
                            {
                                r /= 12.92F;
                            }
                            else
                            {
                                r = (float)Math.Exp(2.4D * Math.Log((r + 0.055D) / 1.055D));
                            }
                            if (g < 0.0F)
                            {
                                g = 0.0F;
                            }
                            if (g > 1.0F)
                            {
                                g = 1.0F;
                            }
                            if (g <= 0.03928F)
                            {
                                g /= 12.92F;
                            }
                            else
                            {
                                g = (float)Math.Exp(2.4D * Math.Log((g + 0.055D) / 1.055D));
                            }
                            if (b < 0.0F)
                            {
                                b = 0.0F;
                            }
                            if (b > 1.0F)
                            {
                                b = 1.0F;
                            }
                            if (b <= 0.03928F)
                            {
                                b /= 12.92F;
                            }
                            else
                            {
                                b = (float)Math.Exp(2.4D * Math.Log((b + 0.055D) / 1.055D));
                            }

                            if (colorlookup.Values.Contains($"{color.R}_{color.G}_{color.B}"))
                            {
                                continue;
                            }

                            _out.WriteLine("newmtl " + color.R + "_" + color.G + "_" + color.B);
                            _out.WriteLine("illum 0");
                            _out.WriteLine("Kd " + color.R + " " + color.G + " " + color.B);
                            _out.WriteLine("");

                            colorlookup.Add(colorindex, $"{color.R}_{color.G}_{color.B}");

                            colorindex++;
                        }
                    }
                }
            }

            using (FileStream obj = new FileStream(path + "\\" + name + ".obj", FileMode.OpenOrCreate))
            {
                using (StreamWriter _out = new StreamWriter(obj))
                {
                    _out.WriteLine($"mtllib {name}.mtl");
                    Dictionary <int, string> vertexcolors = new Dictionary <int, string>();

                    int indexcount = 0;
                    int index      = 0;
                    for (int t = 0; t < dataType.matrices.Count; t++)
                    {
                        QbMatrix m = dataType.matrices[t];
                        if (!m.Visible)
                        {
                            continue;
                        }
                        foreach (var c in m.voxels.Values)
                        {
                            if (c.alphamask <= 1)
                            {
                                continue;
                            }
                            float cubesize = .5f;
                            float x        = c.x;
                            float y        = c.y;
                            float z        = c.z;
                            //front
                            if ((c.alphamask & 32) == 32)
                            {
                                indexcount++;

                                _out.WriteLine(string.Format("v {0} {1} {2}", -cubesize + x,
                                                             -cubesize + y,
                                                             cubesize + z));

                                _out.WriteLine(string.Format("v {0} {1} {2}", cubesize + x,
                                                             -cubesize + y,
                                                             cubesize + z));

                                _out.WriteLine(string.Format("v {0} {1} {2}", cubesize + x,
                                                             cubesize + y,
                                                             cubesize + z));

                                _out.WriteLine(string.Format("v {0} {1} {2}", -cubesize + x,
                                                             cubesize + y,
                                                             cubesize + z));

                                Colort color = m.colors[c.colorindex];
                                vertexcolors.Add(index, $"{color.R}_{color.G}_{color.B}");
                                index++;
                            }

                            //back
                            if ((c.alphamask & 64) == 64)
                            {
                                indexcount++;

                                _out.WriteLine(string.Format("v {0} {1} {2}", -cubesize + x,
                                                             cubesize + y,
                                                             -cubesize + z));

                                _out.WriteLine(string.Format("v {0} {1} {2}", cubesize + x,
                                                             cubesize + y,
                                                             -cubesize + z));

                                _out.WriteLine(string.Format("v {0} {1} {2}", cubesize + x,
                                                             -cubesize + y,
                                                             -cubesize + z));

                                _out.WriteLine(string.Format("v {0} {1} {2}", -cubesize + x,
                                                             -cubesize + y,
                                                             -cubesize + z));

                                Colort color = m.colors[c.colorindex];
                                vertexcolors.Add(index, $"{color.R}_{color.G}_{color.B}");
                                index++;
                            }

                            //top
                            if ((c.alphamask & 8) == 8)
                            {
                                indexcount++;

                                _out.WriteLine(string.Format("v {0} {1} {2}", -cubesize + x,
                                                             cubesize + y,
                                                             cubesize + z));

                                _out.WriteLine(string.Format("v {0} {1} {2}", cubesize + x,
                                                             cubesize + y,
                                                             cubesize + z));

                                _out.WriteLine(string.Format("v {0} {1} {2}", cubesize + x,
                                                             cubesize + y,
                                                             -cubesize + z));

                                _out.WriteLine(string.Format("v {0} {1} {2}", -cubesize + x,
                                                             cubesize + y,
                                                             -cubesize + z));

                                Colort color = m.colors[c.colorindex];
                                vertexcolors.Add(index, $"{color.R}_{color.G}_{color.B}");
                                index++;
                            }

                            //bottom
                            if ((c.alphamask & 16) == 16)
                            {
                                indexcount++;

                                _out.WriteLine(string.Format("v {0} {1} {2}", -cubesize + x,
                                                             -cubesize + y,
                                                             -cubesize + z));

                                _out.WriteLine(string.Format("v {0} {1} {2}", cubesize + x,
                                                             -cubesize + y,
                                                             -cubesize + z));

                                _out.WriteLine(string.Format("v {0} {1} {2}", cubesize + x,
                                                             -cubesize + y,
                                                             cubesize + z));

                                _out.WriteLine(string.Format("v {0} {1} {2}", -cubesize + x,
                                                             -cubesize + y,
                                                             cubesize + z));

                                Colort color = m.colors[c.colorindex];
                                vertexcolors.Add(index, $"{color.R}_{color.G}_{color.B}");
                                index++;
                            }

                            //left
                            if ((c.alphamask & 2) == 2)
                            {
                                indexcount++;

                                _out.WriteLine(string.Format("v {0} {1} {2}", cubesize + x,
                                                             cubesize + y,
                                                             -cubesize + z));

                                _out.WriteLine(string.Format("v {0} {1} {2}", cubesize + x,
                                                             cubesize + y,
                                                             cubesize + z));

                                _out.WriteLine(string.Format("v {0} {1} {2}", cubesize + x,
                                                             -cubesize + y,
                                                             cubesize + z));

                                _out.WriteLine(string.Format("v {0} {1} {2}", cubesize + x,
                                                             -cubesize + y,
                                                             -cubesize + z));

                                Colort color = m.colors[c.colorindex];
                                vertexcolors.Add(index, $"{color.R}_{color.G}_{color.B}");
                                index++;
                            }

                            //right
                            if ((c.alphamask & 4) == 4)
                            {
                                indexcount++;

                                _out.WriteLine(string.Format("v {0} {1} {2}", -cubesize + x,
                                                             -cubesize + y,
                                                             -cubesize + z));

                                _out.WriteLine(string.Format("v {0} {1} {2}", -cubesize + x,
                                                             -cubesize + y,
                                                             cubesize + z));

                                _out.WriteLine(string.Format("v {0} {1} {2}", -cubesize + x,
                                                             cubesize + y,
                                                             cubesize + z));

                                _out.WriteLine(string.Format("v {0} {1} {2}", -cubesize + x,
                                                             cubesize + y,
                                                             -cubesize + z));

                                Colort color = m.colors[c.colorindex];
                                vertexcolors.Add(index, $"{color.R}_{color.G}_{color.B}");
                                index++;
                            }
                        }
                    }
                    index = 0;
                    for (int i = 1; i < indexcount * 4; i += 4)
                    {
                        _out.WriteLine($"usemtl {vertexcolors[index]}");
                        _out.WriteLine(string.Format("f {0} {1} {2}", i, i + 1, i + 2));
                        _out.WriteLine(string.Format("f {0} {1} {2}", i, i + 2, i + 3));
                        index++;
                    }
                }
            }
        }
예제 #28
0
 public void RemoveVolume(VoxelVolume volume, QbMatrix matrix, Dictionary<double, VoxelUndoData> modifiedVoxels)
 {
     throw new NotImplementedException();
 }
예제 #29
0
파일: QbModel.cs 프로젝트: law4x/stonevox3d
 public void AddMatrix(int index)
 {
     QbMatrix matrix = new QbMatrix();
     matrix.name = "default";
     matrix.setsize(15, 15, 15, true);
     matrix.GenerateVertexBuffers();
     matrices.Insert(index, matrix);
 }
예제 #30
0
        public QbModel _read(string path)
        {
            QbModel model = new QbModel(path.Split('\\').Last().Split('.').First());

            using (FileStream f = new FileStream(path, FileMode.Open))
                using (BinaryReader reader = new BinaryReader(f))
                {
                    model.version               = reader.ReadUInt32();
                    model.colorFormat           = reader.ReadUInt32();
                    model.zAxisOrientation      = reader.ReadUInt32();
                    model.compressed            = reader.ReadUInt32();
                    model.visibilityMaskEncoded = reader.ReadUInt32();
                    model.setmatrixcount(reader.ReadUInt32());

                    for (int i = 0; i < model.numMatrices; i++)
                    {
                        QbMatrix m = model.matrices[i];

                        byte l = reader.ReadByte();
                        m.name = System.Text.Encoding.Default.GetString(reader.ReadBytes(l));
                        m.setsize((int)reader.ReadUInt32(), (int)reader.ReadUInt32(), (int)reader.ReadUInt32());
                        m.position = new OpenTK.Vector3(reader.ReadInt32(), reader.ReadInt32(), reader.ReadInt32());

                        byte r;
                        byte g;
                        byte b;
                        byte a;
                        int  zz;

                        if (model.compressed == 0)
                        {
                            for (int z = 0; z < m.size.Z; z++)
                            {
                                for (int y = 0; y < m.size.Y; y++)
                                {
                                    for (int x = 0; x < m.size.X; x++)
                                    {
                                        r  = reader.ReadByte();
                                        g  = reader.ReadByte();
                                        b  = reader.ReadByte();
                                        a  = reader.ReadByte();
                                        zz = model.zAxisOrientation == (int)0 ? z : (int)(m.size.Z - z - 1);

                                        if (a != 0)
                                        {
                                            m.voxels.GetOrAdd(m.GetHash(x, y, zz), new Voxel(x, y, zz, a, m.getcolorindex(r, g, b, model.colorFormat)));
                                        }
                                    }
                                }
                            }
                        }
                        else
                        {
                            for (int z = 0; z < m.size.Z; z++)
                            {
                                zz = model.zAxisOrientation == 0 ? z : (int)m.size.Z - z - 1;
                                int index = 0;
                                while (true)
                                {
                                    r = reader.ReadByte();
                                    g = reader.ReadByte();
                                    b = reader.ReadByte();
                                    a = reader.ReadByte();
                                    if (r == 6 && g == 0 && b == 0 && a == 0) // NEXTSLICEFLAG
                                    {
                                        break;
                                    }
                                    else
                                    {
                                        if (r == 2 && g == 0 && b == 0 && a == 0) //CODEFLAG
                                        {
                                            uint count = reader.ReadUInt32();
                                            r = reader.ReadByte();
                                            g = reader.ReadByte();
                                            b = reader.ReadByte();
                                            a = reader.ReadByte();
                                            if (a != 0)
                                            {
                                                for (int j = 0; j < count; j++)
                                                {
                                                    int x = index % (int)m.size.X;
                                                    int y = index / (int)m.size.X;
                                                    index++;
                                                    m.voxels.GetOrAdd(m.GetHash(x, y, zz), new Voxel(x, y, zz, a, m.getcolorindex(r, g, b, model.colorFormat)));
                                                }
                                            }
                                            else
                                            {
                                                index += (int)count;
                                            }
                                        }
                                        else
                                        {
                                            int x = index % (int)m.size.X;
                                            int y = index / (int)m.size.X;
                                            index++;
                                            if (a != 0)
                                            {
                                                m.voxels.GetOrAdd(m.GetHash(x, y, zz), new Voxel(x, y, zz, a, m.getcolorindex(r, g, b, model.colorFormat)));
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            return(model);
        }
예제 #31
0
 public void CleanLastVolume(VoxelVolume volume, VoxelVolume currentVolume, QbMatrix matrix, Dictionary<double, VoxelUndoData> modifiedVoxels)
 {
     for (int z = volume.minz; z <= volume.maxz; z++)
         for (int y = volume.miny; y <= volume.maxy; y++)
             for (int x = volume.minx; x <= volume.maxx; x++)
             {
                 if (!currentVolume.ContainsPoint(x, y, z))
                 {
                     if (modifiedVoxels[matrix.GetHash(x, y, z)].changed)
                     {
                         matrix.Remove(x, y, z, false, false);
                         modifiedVoxels.Remove(matrix.GetHash(x, y, z));
                     }
                 }
             }
 }
예제 #32
0
 public void AddUndo(VoxelBrushType type, QbMatrix matrix, VoxelVolume volume, Colort color, Dictionary <double, VoxelUndoData> data)
 {
     redos.Clear();
     undos.Push(new UndoData(type, matrix, volume, color, data));
 }
예제 #33
0
 public void RemoveVolume(VoxelVolume volume, QbMatrix matrix, Dictionary<double, VoxelUndoData> modifiedVoxels)
 {
     VoxelUndoData _temp;
     for (int z = volume.minz; z <= volume.maxz; z++)
         for (int y = volume.miny; y <= volume.maxy; y++)
             for (int x = volume.minx; x <= volume.maxx; x++)
             {
                 if (modifiedVoxels.TryGetValue(matrix.GetHash(x, y, z), out _temp) && _temp.changed)
                 {
                     matrix.Remove(x, y, z, false, false);
                     modifiedVoxels.Remove(matrix.GetHash(x, y, z));
                 }
             }
 }
예제 #34
0
 public void CleanLastVolume(VoxelVolume volume, VoxelVolume currentVolume, QbMatrix matrix, Dictionary <double, VoxelUndoData> modifiedVoxels)
 {
 }
예제 #35
0
 public void RemoveVolume(VoxelVolume volume, QbMatrix matrix, Dictionary <double, VoxelUndoData> modifiedVoxels)
 {
 }
예제 #36
0
        public void write(string path, string name, QbModel model)
        {
            Client.OpenGLContextThread.Add(() =>
            {
                int Wwidth  = Client.window.Width;
                int Wheight = Client.window.Height;

                int framebuffer = GL.GenBuffer();
                GL.BindFramebuffer(FramebufferTarget.FramebufferExt, framebuffer);

                int color = GL.GenTexture();
                GL.BindTexture(TextureTarget.Texture2D, color);
                GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba8, Wwidth, Wheight, 0, PixelFormat.Rgba, PixelType.UnsignedByte, IntPtr.Zero);
                GL.FramebufferTexture2D(FramebufferTarget.FramebufferExt, FramebufferAttachment.ColorAttachment0Ext, TextureTarget.Texture2D, color, 0);

                int depth = GL.GenTexture();
                GL.BindTexture(TextureTarget.Texture2D, depth);
                GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.DepthComponent24, Wwidth, Wheight, 0, PixelFormat.DepthComponent, PixelType.UnsignedByte, IntPtr.Zero);
                GL.FramebufferTexture2D(FramebufferTarget.FramebufferExt, FramebufferAttachment.DepthAttachmentExt, TextureTarget.Texture2D, depth, 0);

                GL.BindFramebuffer(FramebufferTarget.FramebufferExt, 0);

                GL.BindFramebuffer(FramebufferTarget.FramebufferExt, framebuffer);
                GL.DrawBuffers(1, new DrawBuffersEnum[] { DrawBuffersEnum.ColorAttachment0 });

                GL.ClearColor(0, 0, 0, 0);
                GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);

                int minx  = 10000;
                int miny  = 10000;
                int minz  = 10000;
                int maxx  = 0;
                int maxy  = 0;
                int maxz  = 0;
                int sizex = 0;
                int sizey = 0;
                int sizez = 0;

                foreach (var matrix in model.matrices)
                {
                    if (!matrix.Visible)
                    {
                        continue;
                    }
                    if (matrix.minx < minx)
                    {
                        minx = matrix.minx;
                    }
                    if (matrix.maxx > maxx)
                    {
                        maxx = matrix.maxx;
                    }

                    if (matrix.miny < miny)
                    {
                        miny = matrix.miny;
                    }
                    if (matrix.maxy > maxy)
                    {
                        maxy = matrix.maxy;
                    }

                    if (matrix.minz < minz)
                    {
                        minz = matrix.minz;
                    }
                    if (matrix.maxz > maxz)
                    {
                        maxz = matrix.maxz;
                    }
                }

                sizex = maxx - minx;
                sizey = maxy - miny;
                sizez = maxz - minz;

                float backup = 0;

                if (sizey * 1.5f > 20)
                {
                    backup = sizey * 1.5f;
                }
                else if (sizex * 1.5f > 20)
                {
                    backup = sizex * 1.5f;
                }
                else
                {
                    backup = 20;
                }

                var centerpos = new Vector3((minx + ((maxx - minx) / 2)), (miny + ((maxy - miny) / 2)), (minz + ((maxz - minz) / 2)));
                var position  = centerpos + new Vector3(.5f, sizey * .65f, backup);
                Vector3 direction;

                Vector3.Subtract(ref centerpos, ref position, out direction);
                direction.Normalize();

                var cameraright = Vector3.Cross(direction, VectorUtils.UP);
                var cameraup    = Vector3.Cross(cameraright, direction);

                var view = Matrix4.LookAt(position, position + direction, cameraup);
                var modelviewprojection = view * Matrix4.CreatePerspectiveFieldOfView(MathHelper.DegreesToRadians(45), (float)Wwidth / (float)Wheight, 1, 300);

                Shader voxelShader = ShaderUtil.GetShader("qb");

                voxelShader.UseShader();
                voxelShader.WriteUniform("modelview", modelviewprojection);

                GL.PolygonMode(MaterialFace.FrontAndBack, PolygonMode.Fill);
                model.RenderAll(voxelShader);

                string fullpath = Path.Combine(path, name + extension);
                using (FileStream f = new FileStream(fullpath, FileMode.OpenOrCreate))
                {
                    var bit       = Screenshot.ScreenShot(ReadBufferMode.ColorAttachment0);
                    bit           = cropImage(bit, new Rectangle(Wwidth / 4, 0, Wwidth - ((Wwidth / 4) * 2), Wheight));
                    bit           = bit.ResizeImage(ResizeKeepAspect(bit.Size, 400, 400));
                    byte[] buffer = new byte[0];
                    using (MemoryStream m = new MemoryStream())
                    {
                        bit.Save(m, System.Drawing.Imaging.ImageFormat.Png);
                        buffer = m.ToArray();
                    }

                    using (BinaryWriter w = new BinaryWriter(f))
                    {
                        w.Write(version);
                        w.Write((int)buffer.Length);
                        w.Write(buffer);

                        // note - just in case i allow extending the color pattet
                        // which i probably will
                        w.Write(colorpalletflag);
                        for (int i = 0; i < 10; i++)
                        {
                            var c = Singleton <GUI> .INSTANCE.Get <EmptyWidget>(GUIID.START_COLOR_SELECTORS + i).appearence.Get <PlainBackground>("background").color;
                            w.Write(c.R);
                            w.Write(c.G);
                            w.Write(c.B);
                        }

                        w.Write(model.version);
                        w.Write(model.colorFormat);
                        w.Write(model.zAxisOrientation);
                        w.Write(model.compressed);
                        w.Write(model.visibilityMaskEncoded);

                        w.Write((uint)model.matrices.Count);

                        for (int i = 0; i < model.numMatrices; i++)
                        {
                            QbMatrix m = model.matrices[i];
                            if (!m.Visible)
                            {
                                continue;
                            }

                            int startx = Math.Min(0, m.minx);
                            int starty = Math.Min(0, m.miny);
                            int startz = Math.Min(0, m.minz);

                            int width  = (int)(Math.Abs(Math.Min(0, m.minx)) + m.maxx + 1);
                            int height = (int)(Math.Abs(Math.Min(0, m.miny)) + m.maxy + 1);
                            int length = (int)(Math.Abs(Math.Min(0, m.minz)) + m.maxz + 1);

                            if (width < m.size.X)
                            {
                                width = (int)m.size.X;
                            }

                            if (height < m.size.Y)
                            {
                                height = (int)m.size.Y;
                            }

                            if (length < m.size.Z)
                            {
                                length = (int)m.size.Z;
                            }

                            w.Write(m.name);
                            w.Write((uint)width);
                            w.Write((uint)height);
                            w.Write((uint)length);

                            w.Write((int)m.position.X);
                            w.Write((int)m.position.Y);
                            w.Write((int)m.position.Z);

                            if (model.compressed == 0)
                            {
                                Voxel voxel;
                                for (int z = startz; z < startz + length; z++)
                                {
                                    for (int y = starty; y < starty + height; y++)
                                    {
                                        for (int x = startx; x < startx + width; x++)
                                        {
                                            int zz = model.zAxisOrientation == (int)0 ? z : (int)(length - z - 1);

                                            if (m.voxels.TryGetValue(m.GetHash(x, y, zz), out voxel))
                                            {
                                                Colort c = m.colors[voxel.colorindex];
                                                w.Write((byte)(c.R * 255));
                                                w.Write((byte)(c.G * 255));
                                                w.Write((byte)(c.B * 255));
                                                w.Write(voxel.alphamask);
                                            }
                                            else
                                            {
                                                w.Write((byte)0);
                                                w.Write((byte)0);
                                                w.Write((byte)0);
                                                w.Write((byte)0);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }

                    GL.BindFramebuffer(FramebufferTarget.FramebufferExt, 0);
                    GL.DeleteTexture(color);
                    GL.DeleteTexture(depth);
                    GL.DeleteFramebuffer(framebuffer);
                }
            });
        }
예제 #37
0
 public bool OnRaycastHitchanged(Input input, QbMatrix matrix, RaycastHit hit, ref Colort color, MouseButtonEventArgs e)
 {
     return(true);
 }
예제 #38
0
 public void EnumerateVolume(VoxelVolume volume, VoxelVolume currentVolume, QbMatrix matrix, ref Colort color, Dictionary<double, VoxelUndoData> modifiedVoxels)
 {
     for (int z = currentVolume.minz; z <= currentVolume.maxz; z++)
         for (int y = currentVolume.miny; y <= currentVolume.maxy; y++)
             for (int x = currentVolume.minx; x <= currentVolume.maxx; x++)
             {
                 if (!volume.ContainsPoint(x,y,z) && !modifiedVoxels.ContainsKey(matrix.GetHash(x,y,z)))
                     modifiedVoxels.Add(matrix.GetHash(x, y, z), new VoxelUndoData(matrix.Add(x, y, z, color)));
             }
 }
예제 #39
0
        public QbModel _read(string path)
        {
            QbModel model = new QbModel(path.Split('\\').Last().Split('.').First());

            using (FileStream f = new FileStream(path, FileMode.Open))
                using (BinaryReader reader = new BinaryReader(f))
                {
                    int version = reader.ReadInt32();
                    int len     = reader.ReadInt32();
                    reader.ReadBytes(len);

                    int colorpalleteflag = reader.ReadInt32();

                    for (int i = 0; i < 10; i++)
                    {
                        var colorpal = Singleton <GUI> .INSTANCE.Get <EmptyWidget>(GUIID.START_COLOR_SELECTORS + i);

                        var c = colorpal.appearence.Get <PlainBackground>("background");
                        c.color.R = reader.ReadSingle();
                        c.color.G = reader.ReadSingle();
                        c.color.B = reader.ReadSingle();

                        bool e = (bool)colorpal.customData["active"];
                        if (e)
                        {
                            Singleton <Broadcaster> .INSTANCE.Broadcast(Message.ColorSelectionChanged, colorpal, c.color);
                        }
                    }

                    model.version               = reader.ReadUInt32();
                    model.colorFormat           = reader.ReadUInt32();
                    model.zAxisOrientation      = reader.ReadUInt32();
                    model.compressed            = reader.ReadUInt32();
                    model.visibilityMaskEncoded = reader.ReadUInt32();
                    model.setmatrixcount(reader.ReadUInt32());

                    for (int i = 0; i < model.numMatrices; i++)
                    {
                        QbMatrix m = model.matrices[i];

                        byte l = reader.ReadByte();
                        m.name = System.Text.Encoding.Default.GetString(reader.ReadBytes(l));
                        m.setsize((int)reader.ReadUInt32(), (int)reader.ReadUInt32(), (int)reader.ReadUInt32());
                        m.position = new OpenTK.Vector3(reader.ReadInt32(), reader.ReadInt32(), reader.ReadInt32());

                        byte r;
                        byte g;
                        byte b;
                        byte a;
                        int  zz;

                        if (model.compressed == 0)
                        {
                            for (int z = 0; z < m.size.Z; z++)
                            {
                                for (int y = 0; y < m.size.Y; y++)
                                {
                                    for (int x = 0; x < m.size.X; x++)
                                    {
                                        r  = reader.ReadByte();
                                        g  = reader.ReadByte();
                                        b  = reader.ReadByte();
                                        a  = reader.ReadByte();
                                        zz = model.zAxisOrientation == (int)0 ? z : (int)(m.size.Z - z - 1);

                                        if (a != 0)
                                        {
                                            m.voxels.GetOrAdd(m.GetHash(x, y, zz), new Voxel(x, y, zz, a, m.getcolorindex(r, g, b, model.colorFormat)));
                                        }
                                    }
                                }
                            }
                        }
                        else
                        {
                            for (int z = 0; z < m.size.Z; z++)
                            {
                                zz = model.zAxisOrientation == 0 ? z : (int)m.size.Z - z - 1;
                                int index = 0;
                                while (true)
                                {
                                    r = reader.ReadByte();
                                    g = reader.ReadByte();
                                    b = reader.ReadByte();
                                    a = reader.ReadByte();
                                    if (r == 6 && g == 0 && b == 0 && a == 0) // NEXTSLICEFLAG
                                    {
                                        break;
                                    }
                                    else
                                    {
                                        if (r == 2 && g == 0 && b == 0 && a == 0) //CODEFLAG
                                        {
                                            uint count = reader.ReadUInt32();
                                            r = reader.ReadByte();
                                            g = reader.ReadByte();
                                            b = reader.ReadByte();
                                            a = reader.ReadByte();
                                            if (a != 0)
                                            {
                                                for (int j = 0; j < count; j++)
                                                {
                                                    int x = index % (int)m.size.X;
                                                    int y = index / (int)m.size.X;
                                                    index++;
                                                    m.voxels.GetOrAdd(m.GetHash(x, y, zz), new Voxel(x, y, zz, a, m.getcolorindex(r, g, b, model.colorFormat)));
                                                }
                                            }
                                            else
                                            {
                                                index += (int)count;
                                            }
                                        }
                                        else
                                        {
                                            int x = index % (int)m.size.X;
                                            int y = index / (int)m.size.X;
                                            index++;
                                            if (a != 0)
                                            {
                                                m.voxels.GetOrAdd(m.GetHash(x, y, zz), new Voxel(x, y, zz, a, m.getcolorindex(r, g, b, model.colorFormat)));
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            return(model);
        }
예제 #40
0
 public void RemoveVolume(VoxelVolume volume, QbMatrix matrix, Dictionary <double, VoxelUndoData> modifiedVoxels)
 {
     throw new NotImplementedException();
 }
예제 #41
0
 public void RemoveVolume(VoxelVolume volume, QbMatrix matrix, Dictionary<double, VoxelUndoData> modifiedVoxels)
 {
     double hash;
     VoxelUndoData voxel = new VoxelUndoData();
     for (int z = volume.minz; z <= volume.maxz; z++)
         for (int y = volume.miny; y <= volume.maxy; y++)
             for (int x = volume.minx; x <= volume.maxx; x++)
             {
                 hash = matrix.GetHash(x, y, z);
                 if (modifiedVoxels.TryGetValue(hash, out voxel))
                 {
                     matrix.Color(x, y, z, voxel.colorindex, false, true);
                     modifiedVoxels.Remove(hash);
                 }
             }
 }
예제 #42
0
 public void EnumerateVolume(VoxelVolume volume, VoxelVolume currentVolume, QbMatrix matrix, ref Colort color, Dictionary <double, VoxelUndoData> modifiedVoxels)
 {
     throw new NotImplementedException();
 }
예제 #43
0
 public void AddVolume(VoxelVolume volume, QbMatrix matrix, ref Colort color, Dictionary<double, VoxelUndoData> modifiedVoxels)
 {
 }
예제 #44
0
 public void Remove(QbMatrix matrix)
 {
     Remove(matrices.IndexOf(matrix));
 }
예제 #45
0
 public void EnumerateVolume(VoxelVolume volume, VoxelVolume currentVolume, QbMatrix matrix, ref Colort color, Dictionary<double, VoxelUndoData> modifiedVoxels)
 {
 }
예제 #46
0
        public void RemoveVolume(VoxelVolume volume, QbMatrix matrix, Dictionary<double, VoxelUndoData> modifiedVoxels)
        {
            VoxelUndoData removed = new VoxelUndoData();

            for (int z = volume.minz; z <= volume.maxz; z++)
                for (int y = volume.miny; y <= volume.maxy; y++)
                    for (int x = volume.minx; x <= volume.maxx; x++)
                    {
                        if (modifiedVoxels.TryGetValue(matrix.GetHash(x, y, z), out removed))
                        {
                            if (removed.alphamask > 1)
                                matrix.Add(x, y, z, matrix.colors[removed.colorindex]);
                            modifiedVoxels.Remove(matrix.GetHash(x, y, z));
                        }
                    }
        }
예제 #47
0
 public void RemoveVolume(VoxelVolume volume, QbMatrix matrix, Dictionary<double, VoxelUndoData> modifiedVoxels)
 {
 }
예제 #48
0
        public void AddVolume(VoxelVolume volume, QbMatrix matrix, ref Colort color, Dictionary<double, VoxelUndoData> modifiedVoxels)
        {
            VoxelUndoData removed = new VoxelUndoData();

            for (int z = volume.minz; z <= volume.maxz; z++)
                for (int y = volume.miny; y <= volume.maxy; y++)
                    for (int x = volume.minx; x <= volume.maxx; x++)
                    {
                        if (!modifiedVoxels.ContainsKey(matrix.GetHash(x, y, z)))
                        {
                            if (matrix.GetColorIndex_Alphamask(x, y, z, out removed.colorindex, out removed.alphamask))
                            {
                                if (matrix.Remove(x, y, z, true, false))
                                    modifiedVoxels.Add(matrix.GetHash(x, y, z), removed);
                            }
                        }
                    }
        }
예제 #49
0
 public void EnumerateVolume(VoxelVolume volume, VoxelVolume currentVolume, QbMatrix matrix, ref Colort color, Dictionary<double, VoxelUndoData> modifiedVoxels)
 {
     throw new NotImplementedException();
 }
예제 #50
0
 public void AddVolume(VoxelVolume volume, QbMatrix matrix, ref Colort color, Dictionary<double, VoxelUndoData> modifiedVoxels)
 {
     double hash;
     for (int z = volume.minz; z <= volume.maxz; z++)
         for (int y = volume.miny; y <= volume.maxy; y++)
             for (int x = volume.minx; x <= volume.maxx; x++)
             {
                 hash = matrix.GetHash(x, y, z);
                 if (!modifiedVoxels.ContainsKey(hash))
                     modifiedVoxels.Add(hash, new VoxelUndoData(matrix.Add(x, y, z, color)));
             }
 }
예제 #51
0
파일: QbModel.cs 프로젝트: law4x/stonevox3d
 public void Remove(QbMatrix matrix)
 {
     Remove(matrices.IndexOf(matrix));
 }
예제 #52
0
파일: QbModel.cs 프로젝트: law4x/stonevox3d
 public void AddMatrix()
 {
     QbMatrix matrix = new QbMatrix();
     matrix.name = "default";
     matrix.setsize(15, 15, 15, true);
     matrix.GenerateVertexBuffers();
     matrices.Add(matrix);
 }