コード例 #1
0
        private MeshQuery.Result ModifyVertices(MeshQuery query, List <int> indecies)
        {
            var upMode           = query.ForceDirection.y > 0;
            var modified         = 0;
            var scannedTriangles = 0;

            // modify vertices
            for (int j = 0; j < indecies.Count; j++)
            {
                int outerIndex = indecies[j] * 3;
                for (var k = 0; k < 3; k++)
                {
                    var index    = outerIndex + k;
                    var vertex   = query.Vertices[index];
                    var distance = Vector3.Distance(vertex, query.Epicenter);
                    if (distance < query.Radius)
                    {
                        float heightDiff = query.GetForceChange(distance);
                        query.Vertices[index] = new Vector3(
                            vertex.x,
                            vertex.y + (upMode ? heightDiff : -heightDiff),
                            vertex.z);
                        modified++;
                    }
                }
                scannedTriangles++;
            }

            return(new MeshQuery.Result(query.Vertices)
            {
                ModifiedVertices = modified,
                ScannedTriangles = scannedTriangles
            });
        }
コード例 #2
0
        /// <inheritdoc />
        public MeshQuery.Result Modify(MeshQuery query)
        {
            var result = new List <int>(4);
            var center = query.Epicenter;
            var x      = (int)Math.Floor((center.x - _left) / _xAxisStep);
            var y      = (int)Math.Floor((center.z - _bottom) / _yAxisStep);

            var center2d = new Vector2d(center.x, center.z);

            for (int j = y - 1; j <= y + 1; j++)
            {
                for (int i = x - 1; i <= x + 1; i++)
                {
                    var rectangle = new Rectangle2d(
                        _bottomLeft.X + i * _xAxisStep,
                        _bottomLeft.Y + j * _yAxisStep,
                        _xAxisStep,
                        _yAxisStep);

                    // NOTE enlarge search radius to prevent some issues with adjusted triangles
                    // as their position in index defined by their centroid
                    // actually, additional size depends on terrain triangle area
                    if (GeometryUtils.HasCollision(center2d, query.Radius + 6, rectangle))
                    {
                        AddRange(i, j, result);
                    }
                }
            }

            return(ModifyVertices(query, result));
        }
コード例 #3
0
ファイル: BehaviourHelper.cs プロジェクト: yuta0023/demo
        public static void Modify(MeshQuery query)
        {
            Collider[] hitColliders = Physics.OverlapSphere(query.Epicenter, query.Radius);
            foreach (var hitCollider in hitColliders)
            {
                var meshIndexBehavior = hitCollider.gameObject.GetComponent<MeshIndexBehaviour>();
                if (meshIndexBehavior == null)
                    continue;

                var mesh = hitCollider.gameObject.GetComponent<MeshFilter>().mesh;
                query.Vertices = mesh.vertices;

                var meshQueryResult = meshIndexBehavior.Index.Modify(query);

                if (meshQueryResult.IsDestroyed)
                {
                    var collider = hitCollider;
                    ObservableUnity
                        .FromCoroutine(() => SplitMesh(collider.gameObject))
                        .Subscribe();
                }
                else if (meshQueryResult.IsModified)
                {
                    mesh.vertices = meshQueryResult.Vertices;
                    meshIndexBehavior.IsMeshModified = true;
                }

                Debug.Log(String.Format("MeshIndex:{0} modified:{1} scanned tris:{2}, forceDir:{3}", 
                    hitCollider.name, meshQueryResult.ModifiedVertices, meshQueryResult.ScannedTriangles, query.ForceDirection));
            }
        }
コード例 #4
0
 /// <inheritdoc />
 public MeshQuery.Result Modify(MeshQuery query)
 {
     return(new MeshQuery.Result(query.Vertices)
     {
         IsDestroyed = true
     });
 }
コード例 #5
0
        public void CanMakeQuery()
        {
            // ARRANGE
            var vertices = GetVertices();
            var query    = new MeshQuery()
            {
                Epicenter       = new Vector3(0, Radius, 0),
                ForceDirection  = new Vector3(0, -1, 0),
                GetForceChange  = f => 1,
                Vertices        = vertices,
                Radius          = Radius,
                OffsetThreshold = 1
            };

            // ACT
            var meshIndex = new SphereMeshIndex(Radius, Center);

            meshIndex.Build();
            var result = meshIndex.Modify(query);

            // ASSERT
            Assert.IsNotNull(result);
            Assert.Greater(result.ModifiedVertices, 0);
            Assert.Greater(result.DestroyedVertices, 0);
        }
コード例 #6
0
        public static void Modify(MeshQuery query)
        {
            Collider[] hitColliders = Physics.OverlapSphere(query.Epicenter, query.Radius);
            foreach (var hitCollider in hitColliders)
            {
                var meshIndexBehavior = hitCollider.gameObject.GetComponent <MeshIndexBehaviour>();
                if (meshIndexBehavior == null)
                {
                    continue;
                }

                var mesh = hitCollider.gameObject.GetComponent <MeshFilter>().mesh;
                query.Vertices = mesh.vertices;

                var meshQueryResult = meshIndexBehavior.Index.Modify(query);

                if (meshQueryResult.IsDestroyed)
                {
                    var collider = hitCollider;
                    ObservableUnity
                    .FromCoroutine(() => SplitMesh(collider.gameObject))
                    .Subscribe();
                }
                else if (meshQueryResult.IsModified)
                {
                    mesh.vertices = meshQueryResult.Vertices;
                    meshIndexBehavior.IsMeshModified = true;
                }

                Debug.Log(String.Format("MeshIndex:{0} modified:{1} scanned tris:{2}, forceDir:{3}",
                                        hitCollider.name, meshQueryResult.ModifiedVertices, meshQueryResult.ScannedTriangles, query.ForceDirection));
            }
        }
コード例 #7
0
        /// <summary> Modifies mesh plane based on it's equation parameters. </summary>
        protected MeshQuery.Result Modify(MeshQuery query, int startIndex, int endIndex,
                                          Vector3 n, float magnitude, float d)
        {
            var halfVertexCount = query.Vertices.Length / 2;
            var vertices        = query.Vertices;
            int modified        = 0;
            var destroyed       = 0;

            for (int j = startIndex; j < endIndex; j += 3)
            {
                // triangle is already collapsed
                if (vertices[j] == vertices[j + 1])
                {
                    continue;
                }

                for (int i = j; i < j + 3; i++)
                {
                    var v        = vertices[i];
                    var distance = Vector3.Distance(v, query.Epicenter);
                    if (distance < query.Radius)
                    {
                        var distanceToWall = (v.x * n.x + v.y * n.y + v.z * n.z - d) / magnitude;
                        var forceChange    = query.GetForceChange(distance);
                        // NOTE whole traingle should be removed as one of the vertices is
                        // moved more than threshold allows
                        if (Math.Abs(distanceToWall + forceChange) > query.OffsetThreshold)
                        {
                            // collapse triangle into point
                            var firstVertIndex = i - i % 3;
                            vertices[firstVertIndex + 1] = vertices[firstVertIndex];
                            vertices[firstVertIndex + 2] = vertices[firstVertIndex];

                            var backSideIndex = halfVertexCount + firstVertIndex;
                            vertices[backSideIndex + 1] = vertices[backSideIndex];
                            vertices[backSideIndex + 2] = vertices[backSideIndex];
                            destroyed += 3;
                            break;
                        }
                        vertices[i] = v + forceChange * query.ForceDirection;
                        vertices[halfVertexCount + i] = vertices[i];
                        modified++;
                    }
                }
            }
            return(new MeshQuery.Result(query.Vertices)
            {
                DestroyedVertices = destroyed,
                ModifiedVertices = modified,
                ScannedTriangles = -1
            });
        }
コード例 #8
0
        /// <inheritdoc />
        public MeshQuery.Result Modify(MeshQuery query)
        {
            var result = new MeshQuery.Result(query.Vertices);

            foreach (var meshIndex in _indices)
            {
                var intermediateResult = meshIndex.Modify(query);
                result.ModifiedVertices  += intermediateResult.ModifiedVertices;
                result.DestroyedVertices += intermediateResult.DestroyedVertices;
                result.ScannedTriangles  += intermediateResult.ScannedTriangles;
                result.IsDestroyed       |= intermediateResult.IsDestroyed;
            }
            return(result);
        }
コード例 #9
0
        /// <inheritdoc />
        public MeshQuery.Result Modify(MeshQuery query)
        {
            var vertices  = query.Vertices;
            int modified  = 0;
            var destroyed = 0;

            for (int j = 0; j < vertices.Length; j += 3)
            {
                // triangle is already collapsed
                if (vertices[j] == vertices[j + 1])
                {
                    continue;
                }

                for (int i = j; i < j + 3; i++)
                {
                    var v        = vertices[i];
                    var distance = Vector3.Distance(v, query.Epicenter);
                    if (distance < query.Radius)
                    {
                        var forceChange      = query.GetForceChange(distance);
                        var distanceToCenter = Vector3.Distance(v, _center);
                        if (Math.Abs(_radius - distanceToCenter + forceChange) > query.OffsetThreshold)
                        {
                            // collapse triangle into point
                            var firstVertIndex = i - i % 3;
                            vertices[firstVertIndex + 1] = vertices[firstVertIndex];
                            vertices[firstVertIndex + 2] = vertices[firstVertIndex];
                            destroyed += 3;
                            break;
                        }
                        var forceDirection = (_center - v).normalized;
                        vertices[i] = v + forceChange * forceDirection;
                        modified++;
                    }
                }
            }

            return(new MeshQuery.Result(vertices)
            {
                DestroyedVertices = destroyed,
                ModifiedVertices = modified
            });
        }
コード例 #10
0
        /// <inheritdoc />
        public override MeshQuery.Result Modify(MeshQuery query)
        {
            int startIndex = 0;
            int destroyed  = 0;
            int modified   = 0;

            for (int j = 0; j < _planeIndices.Length; j++)
            {
                var endIndex  = j == _planeIndices.Length - 1 ? _vertexCount : _planeIndices[j + 1];
                var n         = _normals[j];
                var magnitude = _magnitudes[j];
                var d         = _coeffDs[j];
                var result    = base.Modify(query, startIndex, endIndex, n, magnitude, d);
                destroyed += result.DestroyedVertices;
                modified  += result.ModifiedVertices;
                startIndex = endIndex;
            }

            return(new MeshQuery.Result(query.Vertices)
            {
                ModifiedVertices = modified,
                DestroyedVertices = destroyed
            });
        }
コード例 #11
0
 public override List <QueryResponse> Validate(ExecutionContext context, MeshDataCommand command, IDictionary <string, object> config, string id, MeshQuery query)
 {
     throw new NotImplementedException();
 }
コード例 #12
0
 public override bool Accept(MeshDataCommand command, MeshQuery query, IEntity entity)
 {
     return(command.ProviderId == this.GetProviderId() && query.Action == ActionType.UPDATE && EntityType.Contains(entity.EntityType));
 }
コード例 #13
0
        public override List <QueryResponse> Validate(ExecutionContext context, RemoveFromProcessingDataCommand command, IDictionary <string, object> config, string id, MeshQuery query)
        {
            var hubSpotCrawlJobData = new HubSpotCrawlJobData(config);
            var quereis             = new List <QueryResponse>();
            var client  = new RestClient("https://api.hubapi.com");
            var request = new RestRequest(string.Format("/automation/v2/workflows/enrollments/contacts/{0}", id), Method.GET);

            request.AddQueryParameter("hapikey", hubSpotCrawlJobData.ApiToken); // adds to POST or URL querystring based on Method
            var result = client.ExecuteTaskAsync <List <Workflow> >(request).Result;

            return(new List <QueryResponse>()
            {
                new QueryResponse()
                {
                    Content = result.Content, StatusCode = result.StatusCode
                }
            });
        }
コード例 #14
0
        /* TODO remove comment and implement the override for Accept method in your derived Provider class if requiring more functionality beyond the base class implementation
         * public override bool Accept(MeshDataCommand command, MeshQuery query, IEntity entity)
         * {
         * // TODO filter on action
         * // e.g. query.Action == ActionType.*;
         * return base.Accept(command, query, entity);
         * }
         */

        public override void DoProcess(ExecutionContext context, MeshDataCommand command, IDictionary <string, object> jobData, MeshQuery query)
        {
            throw new NotImplementedException();
        }
コード例 #15
0
 public override bool Accept(RemoveFromProcessingDataCommand command, MeshQuery query, IEntity entity)
 {
     return(command.ProviderId == this.GetProviderId() && query.Action == ActionType.DISASSOCIATE && EntityType.Contains(entity.EntityType));
 }
コード例 #16
0
        public override List <QueryResponse> Validate(ExecutionContext context, MeshDataCommand command, IDictionary <string, object> config, string id, MeshQuery query)
        {
            var serviceNowCrawlJobData = new ServiceNowCrawlJobData(config);
            var client  = new RestClient(string.Format("{0}/api/now/table", serviceNowCrawlJobData.BaseUrl));
            var request = new RestRequest(EditUrl, Method.GET);

            client.Authenticator = new HttpBasicAuthenticator(serviceNowCrawlJobData.Username, serviceNowCrawlJobData.Password);

            var result = client.ExecuteTaskAsync(request).Result;

            return(new List <QueryResponse>()
            {
                new QueryResponse()
                {
                    Content = result.Content, StatusCode = result.StatusCode
                }
            });
        }
コード例 #17
0
 public override bool Accept(MeshDataCommand command, MeshQuery query, IEntity entity)
 {
     return(true);
 }
コード例 #18
0
 /// <inheritdoc />
 public virtual MeshQuery.Result Modify(MeshQuery query)
 {
     return(Modify(query, 0, query.Vertices.Length / 2, _n, _normalMagnitude, _d));
 }
コード例 #19
0
        public override List <QueryResponse> Validate(ExecutionContext context, MeshDataCommand command, IDictionary <string, object> config, string id, MeshQuery query)
        {
            var item = ActionExtensions.ExecuteWithRetry(() => { return(graphClient.Drive.Items[id].Request().GetAsync().Result); });

            if (item == null)
            {
                return new List <QueryResponse>()
                       {
                           new QueryResponse()
                           {
                               Content = null, StatusCode = System.Net.HttpStatusCode.InternalServerError
                           }
                       }
            }
            ;

            //TODO search file content

            return(new List <QueryResponse>()
            {
                new QueryResponse()
                {
                    Content = JsonConvert.SerializeObject(item), StatusCode = System.Net.HttpStatusCode.OK
                }
            });
        }
コード例 #20
0
 public override List <QueryResponse> Validate(ExecutionContext context, MeshDataCommand command, IDictionary <string, object> config, string id, MeshQuery query)
 {
     return(new List <QueryResponse>()
     {
         new QueryResponse()
         {
             Content = string.Empty, StatusCode = System.Net.HttpStatusCode.OK
         }
     });
 }
コード例 #21
0
 public override void DoProcess(CluedIn.Core.ExecutionContext context, MeshDataCommand command, IDictionary <string, object> jobData, MeshQuery query)
 {
     return;
 }
コード例 #22
0
        public override List <QueryResponse> Validate(ExecutionContext context, MeshDataCommand command, IDictionary <string, object> config, string id, MeshQuery query)
        {
            var hubSpotCrawlJobData = new HubSpotCrawlJobData(config);

            var client  = new RestClient("https://api.hubapi.com");
            var request = new RestRequest(string.Format(EditUrl + "{0}", id), Method.GET);

            request.AddQueryParameter("hapikey", hubSpotCrawlJobData.ApiToken); // adds to POST or URL querystring based on Method

            var result = client.ExecuteTaskAsync(request).Result;

            return(new List <QueryResponse>()
            {
                new QueryResponse()
                {
                    Content = result.Content, StatusCode = result.StatusCode
                }
            });
        }
コード例 #23
0
 /// <inheritdoc />
 public MeshQuery.Result Modify(MeshQuery query)
 {
     return(new MeshQuery.Result(query.Vertices));
 }