Beispiel #1
0
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.F1))
        {
            SaveVector("currentCenter", currentCenter);
            SaveVector("currentNormal", currentNormal);
            PlayerPrefs.Save();
        }
        if (Input.GetKeyDown(KeyCode.F2))
        {
            currentCenter = LoadVector("currentCenter");
            currentNormal = LoadVector("currentNormal");

            hitLocation.transform.position = currentCenter;
        }

        if (Input.GetKeyDown(KeyCode.F4))
        {
            if (modelStddev == 1)
            {
                modelStddev = 20;
            }
            else
            {
                modelStddev = 1;
            }
        }

        if (Input.GetKeyDown(KeyCode.F5))
        {
            foreach (var go in samples)
            {
                GameObject.Destroy(go);
            }
            samples.Clear();
            GenerateSamples(samplesToGenerate);
        }
        if (Input.GetKeyDown(KeyCode.F6))
        {
            modelName         = modelNames[currentModelIndex];
            currentModelIndex = (currentModelIndex + 1) % modelNames.Length;
        }

        if (Input.GetKeyDown(KeyCode.F7))
        {
            modelVersion             = modelVersions[currentModelVersionIndex].ToString();
            currentModelVersionIndex = (currentModelVersionIndex + 1) % modelVersions.Length;
        }
        if (Input.GetKeyDown(KeyCode.F8))
        {
            foreach (var go in samples)
            {
                GameObject.Destroy(go);
            }
            samples.Clear();
            GetSamplesFromModelCurrentPos();
        }

        surface.renderer.enabled = renderPolySurface;

        var ctrl  = Input.GetKey(KeyCode.LeftControl) || Input.GetKey(KeyCode.RightControl);
        var shift = Input.GetKey(KeyCode.LeftShift);

        pointCloudMaterial.SetFloat("_WeightScale", weightScale);
        pointCloudMaterial.SetFloat("_WeightFactor", weightFactor);

        if (currentPointCloud != null)
        {
            currentVertices = currentPointCloud.vertices;

            if (ctrl && Input.GetMouseButtonDown(1))
            {
                var ray = camera.ScreenPointToRay(Input.mousePosition);
                if (Physics.Raycast(ray, out var hit))
                {
                    camera.transform.parent.position = hit.point;
                }
                else
                {
                    camera.transform.parent.position = Vector3.zero;
                }
            }
            if (!ctrl && Input.GetMouseButton(1))
            {
                var ray = camera.ScreenPointToRay(Input.mousePosition);
                meshCollider.sharedMesh = currentPointCloud.mesh.mesh;
                if (meshCollider.Raycast(ray, out var hit, float.MaxValue))
                {
                    //Debug.Log($"({ray.origin.x}, {ray.origin.y}, {ray.origin.z}), ({ray.direction.x}, {ray.direction.y}, {ray.direction.z})");
                    hitLocation.position = hit.point;
                    currentCenter        = hit.point;
                    currentNormal        = hit.normal;
                    currentVertices      = currentPointCloud.vertices;
                    pointCloudMaterial.SetVector("center", hit.point);

                    //
                    if (currentPointCloud.mesh.coefficients != null)
                    {
                        var uvw = hit.barycentricCoordinate;

                        var coefficientsArray = currentPointCloud.mesh.coefficients;
                        var faces             = currentPointCloud.mesh.faces;

                        float[] c0 = coefficientsArray[faces[hit.triangleIndex * 3 + 0]];
                        float[] c1 = coefficientsArray[faces[hit.triangleIndex * 3 + 1]];
                        float[] c2 = coefficientsArray[faces[hit.triangleIndex * 3 + 2]];

                        float[] coefficients = new float[20];
                        for (int i = 0; i < 20; i++)
                        {
                            coefficients[i] = uvw.x * c0[i] + uvw.y * c1[i] + uvw.z * c2[i];
                        }

                        surface.SetCenter(currentCenter);
                        surface.SetCoefficients(coefficients);
                    }
                }
            }
        }

        if (ctrl && Input.GetMouseButtonDown(0))
        {
            var point = camera.ScreenPointToRay(Input.mousePosition);

            var random = new System.Random();

            currentPath.Clear();
            currentPath.Add(new PathPoint
            {
                position  = point.origin,
                direction = point.direction
            });


            var(dist, _) = PolySurface.RayMarch(coefficients, point.origin, point.direction, 1000.0f, surface.Center);
            var hit = point.origin + (dist + 0.001f) * point.direction;

            int stepCount = 0;
            var exit      = TestDataGenerator.SimulatePath(
                random,
                surface.Coefficients,
                hit, point.direction,
                surface.Center,
                surface.g, surface.SigmaSReduced, surface.sigmaT,
                distScale,
                (p) => currentPath.Add(p),
                ref stepCount);

            if (exit != null)
            {
                currentPath.Add(new PathPoint
                {
                    position  = exit.Value,
                    direction = (exit.Value - currentPath.Last().position).normalized,
                });

                currentPath.Add(new PathPoint
                {
                    position = currentPath.Last().position + currentPath.Last().direction * 10,
                });
            }
        }

        if (process != null && process.HasExited)
        {
            Debug.Log("generator done");

            foreach (var go in samples)
            {
                GameObject.Destroy(go);
            }
            samples.Clear();

            foreach (var sample in samplesTemp)
            {
                var go = GameObject.Instantiate(samplePointPrefab, transform);
                go.transform.position = sample.position;
                samples.Add(go);
            }
            samplesTemp.Clear();
            process = null;
        }

        // generate samples
        if (shift && Input.GetMouseButtonDown(0))
        {
            foreach (var go in samples)
            {
                GameObject.Destroy(go);
            }
            samples.Clear();
            if (sampleSource != SampleSource.Generate && process == null)
            {
                var ray = camera.ScreenPointToRay(Input.mousePosition);
                if (meshCollider.Raycast(ray, out var hit, float.MaxValue))
                {
                    var dir = ray.direction;
                    if (incidentIsNormal)
                    {
                        dir = -hit.normal;
                    }
                    GetSamplesFromModel(hit.point, hit.normal, dir);
                }
            }
        }
        if (shift && Input.GetMouseButton(0))
        {
            if (sampleSource == SampleSource.Generate)
            {
                GenerateSamples();
            }
        }

        for (int i = 0; i < currentPath.Count; i++)
        {
            var p = currentPath[i];

            if (RenderPathAxis)
            {
                if (p.uv != null)
                {
                    var vec = p.right.Value * p.uv.Value.x + p.up.Value * p.uv.Value.y;
                    Debug.DrawRay(p.position, vec * PathAxisLen, Color.yellow, 0, false);
                }
                if (p.right != null)
                {
                    Debug.DrawRay(p.position, p.right.Value * PathAxisLen, Color.red, 0, false);
                }
                if (p.up != null)
                {
                    Debug.DrawRay(p.position, p.up.Value * PathAxisLen, Color.green, 0, false);
                }
                Debug.DrawRay(p.position, p.direction, Color.blue, 0, false);
            }

            if (RenderPath && i < currentPath.Count - 1)
            {
                var col = Color.white;
                if (i == 0)
                {
                    col = Color.cyan;
                }
                else if (i == currentPath.Count - 2)
                {
                    col = Color.magenta;
                }
                Debug.DrawLine(p.position, currentPath[i + 1].position, col, 0, false);
            }
        }
    }