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; }
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)); } } } } } }
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); }
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)); }
public void AddMatrix() { QbMatrix matrix = new QbMatrix(); matrix.name = "default"; matrix.setsize(15, 15, 15, true); matrix.GenerateVertexBuffers(); matrices.Add(matrix); }
public void AddMatrix(int index) { QbMatrix matrix = new QbMatrix(); matrix.name = "default"; matrix.setsize(15, 15, 15, true); matrix.GenerateVertexBuffers(); matrices.Insert(index, matrix); }
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); } }
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(); } }); }
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); }
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))); } } } } }
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; }
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)); } } } } }
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))); } } } } }
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)); } } } } } }
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); } } } } }
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); } } } } }
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 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); } } } } } } }
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; }
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); }
public bool OnRaycastHitchanged(Input input, QbMatrix matrix, RaycastHit hit, ref Colort color, MouseButtonEventArgs e) { return true; }
public void CleanLastVolume(VoxelVolume volume, VoxelVolume currentVolume, QbMatrix matrix, Dictionary<double, VoxelUndoData> modifiedVoxels) { }
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); } } }
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); } } } } } } } } }
public void EnumerateVolume(VoxelVolume volume, VoxelVolume currentVolume, QbMatrix matrix, ref Colort color, Dictionary <double, VoxelUndoData> modifiedVoxels) { }
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++; } } } }
public void RemoveVolume(VoxelVolume volume, QbMatrix matrix, Dictionary<double, VoxelUndoData> modifiedVoxels) { throw new NotImplementedException(); }
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); }
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)); } } } }
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)); }
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)); } } }
public void CleanLastVolume(VoxelVolume volume, VoxelVolume currentVolume, QbMatrix matrix, Dictionary <double, VoxelUndoData> modifiedVoxels) { }
public void RemoveVolume(VoxelVolume volume, QbMatrix matrix, Dictionary <double, VoxelUndoData> modifiedVoxels) { }
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); } }); }
public bool OnRaycastHitchanged(Input input, QbMatrix matrix, RaycastHit hit, ref Colort color, MouseButtonEventArgs e) { return(true); }
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))); } }
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); }
public void RemoveVolume(VoxelVolume volume, QbMatrix matrix, Dictionary <double, VoxelUndoData> modifiedVoxels) { throw new NotImplementedException(); }
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); } } }
public void EnumerateVolume(VoxelVolume volume, VoxelVolume currentVolume, QbMatrix matrix, ref Colort color, Dictionary <double, VoxelUndoData> modifiedVoxels) { throw new NotImplementedException(); }
public void AddVolume(VoxelVolume volume, QbMatrix matrix, ref Colort color, Dictionary<double, VoxelUndoData> modifiedVoxels) { }
public void Remove(QbMatrix matrix) { Remove(matrices.IndexOf(matrix)); }
public void EnumerateVolume(VoxelVolume volume, VoxelVolume currentVolume, QbMatrix matrix, ref Colort color, Dictionary<double, VoxelUndoData> modifiedVoxels) { }
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)); } } }
public void RemoveVolume(VoxelVolume volume, QbMatrix matrix, Dictionary<double, VoxelUndoData> modifiedVoxels) { }
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); } } } }
public void EnumerateVolume(VoxelVolume volume, VoxelVolume currentVolume, QbMatrix matrix, ref Colort color, Dictionary<double, VoxelUndoData> modifiedVoxels) { throw new NotImplementedException(); }
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))); } }