private void DrawCutawayPlane(ObiDistanceField field, Matrix4x4 matrix) { if (field == null) { return; } RefreshCutawayTexture(field); material.mainTexture = cutawayTexture; material.SetPass(0); Quaternion rotation = Quaternion.identity; Vector3 offset = Vector3.zero; offset[(int)axis] = field.FieldBounds.size[0]; if (axis == Axis.Y) { rotation = Quaternion.Euler(90, 0, 0); } else if (axis == Axis.X) { rotation = Quaternion.Euler(0, -90, 0); } Matrix4x4 sc = Matrix4x4.TRS(field.FieldBounds.center + offset * (slice - 0.5f), rotation, Vector3.one * field.FieldBounds.size[0]); Graphics.DrawMeshNow(planeMesh, matrix * sc); }
public ObiDistanceFieldShapeTracker(ObiDistanceField distanceField) { this.distanceField = distanceField; adaptor.is2D = false; oniShape = Oni.CreateShape(Oni.ShapeType.SignedDistanceField); fieldDataHasChanged = true; }
public ObiDistanceFieldHandle GetOrCreateDistanceField(ObiDistanceField source) { ObiDistanceFieldHandle handle; if (!handles.TryGetValue(source, out handle)) { handle = new ObiDistanceFieldHandle(source, headers.count); handles.Add(source, handle); headers.Add(new DistanceFieldHeader(dfNodes.count, source.nodes.Count)); dfNodes.AddRange(source.nodes); } return(handle); }
private void RefreshCutawayTexture(ObiDistanceField field) { if (field == null) { return; } Bounds b = field.FieldBounds; sampleSize = field.EffectiveSampleSize; sampleCount = (int)(b.size[0] / sampleSize) + 1; CreatePlaneMesh(field); ResizeTexture(); float sweep = (sampleCount * slice) * sampleSize; Vector3 origin = b.center - b.extents; for (int x = 0; x < sampleCount; ++x) { for (int y = 0; y < sampleCount; ++y) { Vector3 offset = Vector3.zero; switch (axis) { case Axis.X: offset = new Vector3(sweep, y * sampleSize, x * sampleSize); break; case Axis.Y: offset = new Vector3(x * sampleSize, sweep, y * sampleSize); break; case Axis.Z: offset = new Vector3(x * sampleSize, y * sampleSize, sweep); break; } Vector4 position = origin + offset; float distance = Oni.SampleDistanceField(field.OniDistanceField, position.x, position.y, position.z); float value = ObiUtils.Remap(distance, -maxDistance, maxDistance, 0, 1); cutawayTexture.SetPixel(x, y, new Color(value, 0, 0)); } } cutawayTexture.Apply(); }
private void CreatePlaneMesh(ObiDistanceField field) { if (field != null && planeMesh == null) { float uvBorder = (1 - field.FieldBounds.size[0] / (sampleSize * sampleCount)) * 0.5f; planeMesh = new Mesh(); planeMesh.vertices = new Vector3[] { new Vector3(-0.5f, -0.5f, 0), new Vector3(0.5f, -0.5f, 0), new Vector3(-0.5f, 0.5f, 0), new Vector3(0.5f, 0.5f, 0) }; planeMesh.uv = new Vector2[] { new Vector2(uvBorder, uvBorder), new Vector2(1 - uvBorder, uvBorder), new Vector2(uvBorder, 1 - uvBorder), new Vector2(1 - uvBorder, 1 - uvBorder) }; planeMesh.normals = new Vector3[] { -Vector3.forward, -Vector3.forward, -Vector3.forward, -Vector3.forward }; planeMesh.triangles = new int[] { 0, 2, 1, 2, 3, 1 }; } }
public ObiDistanceFieldHandle GetOrCreateDistanceField(ObiDistanceField df) { return(distanceFieldContainer.GetOrCreateDistanceField(df)); }
public void OnEnable() { distanceField = (ObiDistanceField)target; previewHelper = new PreviewHelpers(); UpdatePreview(); }
public ObiDistanceFieldShapeTracker(ObiCollider source, Component collider, ObiDistanceField distanceField) { this.source = source; this.collider = collider; this.distanceField = distanceField; }