Beispiel #1
0
        private async Task HandleResources(IEnvironment environment, ResourceCollector resources)
        {
            var add = resources.GetRenderablesToAdd().ToHashSet();
            var rem = resources.GetRenderablesToRemove().ToHashSet();

            foreach (var r in add)
            {
                _engine.Value.Add(r);
            }
            foreach (var r in add.OfType <IUpdateable>())
            {
                _engine.Value.Add(r);
            }

            foreach (var r in rem.OfType <IUpdateable>())
            {
                _engine.Value.Remove(r);
            }
            foreach (var r in rem)
            {
                _engine.Value.Remove(r);
            }

            await _resourceCollection.Upload(environment, resources);
        }
        protected override void Render(MapDocument document, BufferBuilder builder, ResourceCollector resourceCollector)
        {
            if (_mouseMovePoint.HasValue && _mouseDown != CircleType.None)
            {
                var axis = Vector3.One;
                var c    = Color.White;

                switch (_mouseDown)
                {
                case CircleType.X:
                    axis = Vector3.UnitX;
                    c    = Color.Red;
                    break;

                case CircleType.Y:
                    axis = Vector3.UnitY;
                    c    = Color.Lime;
                    break;

                case CircleType.Z:
                    axis = Vector3.UnitZ;
                    c    = Color.Blue;
                    break;

                case CircleType.Outer:
                    if (ActiveViewport == null || !(ActiveViewport.Viewport.Camera is PerspectiveCamera pc))
                    {
                        return;
                    }
                    axis = pc.Direction;
                    c    = Color.White;
                    break;
                }

                var start = _pivotPoint - axis * 1024 * 1024;
                var end   = _pivotPoint + axis * 1024 * 1024;

                var col = new Vector4(c.R, c.G, c.B, c.A) / 255;

                builder.Append(
                    new[]
                {
                    new VertexStandard {
                        Position = start, Colour = col, Tint = Vector4.One
                    },
                    new VertexStandard {
                        Position = end, Colour = col, Tint = Vector4.One
                    },
                },
                    new uint[] { 0, 1 },
                    new[]
                {
                    new BufferGroup(PipelineType.Wireframe, CameraType.Perspective, 0, 2)
                }
                    );
            }

            base.Render(document, builder, resourceCollector);
        }
 public override void Render(BufferBuilder builder, ResourceCollector resourceCollector)
 {
     foreach (var obj in CollectObjects(x => new[] { x }))
     {
         obj.Render(builder);
     }
     base.Render(builder, resourceCollector);
 }
Beispiel #4
0
 protected override void Render(MapDocument document, BufferBuilder builder, ResourceCollector resourceCollector)
 {
     foreach (var obj in CollectObjects(x => new[] { x }))
     {
         obj.Render(document, builder);
     }
     base.Render(document, builder, resourceCollector);
 }
Beispiel #5
0
 private void InsertButton_Click(object sender, EventArgs e)
 {
     ResourceCollector tc = new ResourceCollector();
     if (tc.ShowDialog() == DialogResult.OK)
     {
         txtText.Text = tc.CollectionResult;
         base.SetValue(tc.CollectionResult);
     }
 }
 public static EngineCollisionMesh FromcontentCollisionMesh(ResourceCollector.Content.CollisionMesh source)
 {
     EngineCollisionMesh cm = new EngineCollisionMesh();
     cm.Vertices = new Vector3[source.Vertices.Length];
     source.Vertices.CopyTo(cm.Vertices, 0);
     cm.Indices = new int[source.Indices.Length];
     source.Indices.CopyTo(cm.Indices, 0);
     return cm;
 }
        public Resource[] SelectObjects(Entity subject, Entity predicate)
        {
            Hashtable         resources = new Hashtable();
            ResourceCollector collector = new ResourceCollector();

            collector.SPO   = 2;
            collector.Table = resources;
            Select(new Statement(subject, predicate, null, null), collector);
            return((Resource[])new ArrayList(resources.Keys).ToArray(typeof(Resource)));
        }
        public Entity[] SelectSubjects(Entity predicate, Resource @object)
        {
            Hashtable         resources = new Hashtable();
            ResourceCollector collector = new ResourceCollector();

            collector.SPO   = 0;
            collector.Table = resources;
            Select(new Statement(null, predicate, @object, null), collector);
            return((Entity[])new ArrayList(resources.Keys).ToArray(typeof(Entity)));
        }
Beispiel #9
0
 private void SubtractCost(Spell spell)
 {
     if (!_resourceCollector)
     {
         _resourceCollector = GameObject.FindWithTag("ResourceCollector").GetComponent <ResourceCollector>();
     }
     _resourceCollector.AddEssence("red", -spell.cost["red"]);
     _resourceCollector.AddEssence("blue", -spell.cost["blue"]);
     _resourceCollector.AddEssence("green", -spell.cost["green"]);
     _resourceCollector.AddEssence("yellow", -spell.cost["yellow"]);
 }
Beispiel #10
0
 public virtual void Render(BufferBuilder builder, ResourceCollector resourceCollector)
 {
     if (!Active || Document == null)
     {
         return;
     }
     foreach (var c in Children.Where(x => x.Active))
     {
         c.Render(builder, resourceCollector);
     }
 }
        public async Task Convert(MapDocument document, SceneBuilder builder, IEnumerable <IMapObject> affected, ResourceCollector resourceCollector)
        {
            var objs = document.Map.Root.FindAll();

            if (affected != null)
            {
                var groups = affected.Select(x => x.ID / 200).ToHashSet();
                foreach (var g in groups)
                {
                    resourceCollector.RemoveRenderables(builder.GetRenderablesForGroup(g));
                    builder.DeleteGroup(g);
                }
                objs = objs.Where(x => groups.Contains(x.ID / 200)).ToList();
            }

            var converters      = _converters.Select(x => x.Value).OrderBy(x => (int)x.Priority).ToList();
            var groupConverters = _groupConverters.Select(x => x.Value).OrderBy(x => (int)x.Priority).ToList();

            foreach (var g in objs.GroupBy(x => x.ID / 200))
            {
                builder.EnsureGroupExists(g.Key);
                var buffer    = builder.GetBufferForGroup(g.Key);
                var collector = new ResourceCollector();

                foreach (var gc in groupConverters)
                {
                    gc.Convert(buffer, document, g, collector);
                }

                foreach (var obj in g)
                {
                    foreach (var converter in converters)
                    {
                        if (!converter.Supports(obj))
                        {
                            continue;
                        }
                        await converter.Convert(buffer, document, obj, collector);

                        if (converter.ShouldStopProcessing(document, obj))
                        {
                            break;
                        }
                    }
                }

                builder.RemoveRenderablesFromGroup(g.Key, collector.GetRenderablesToRemove());
                builder.AddRenderablesToGroup(g.Key, collector.GetRenderablesToAdd());

                resourceCollector.Merge(collector);
            }

            builder.Complete();
        }
        public static AsyncRequestHandler <TContext, TResult> CreateHandler <TController>(
            Func <TController> controllerProvider,
            Mutator <HttpMethodCollector <TContext, TResult, TController> > httpMethodCollectorFiller   = null,
            Mutator <ResourceCollector <TContext, TResult, TController> > nestedResourceCollectorFiller = null
            )
        {
            var col = new ResourceCollector <TContext, TResult, TController>(controllerProvider)
                      .Named(string.Empty, controllerProvider, httpMethodCollectorFiller, nestedResourceCollectorFiller);

            return((method, uri, context, ct) =>
                   col.HandleAsync(method, uri.Segments.Select(s => s.Trim('/')).ToArray(), HttpUtility.ParseQueryString(uri.Query), context, ct));
        }
Beispiel #13
0
        public override void Render(BufferBuilder builder, ResourceCollector resourceCollector)
        {
            base.Render(builder, resourceCollector);

            // Force this work to happen on a new thread so waiting on it won't block the context
            Task.Run(async() =>
            {
                foreach (var obj in _selection)
                {
                    await Convert(builder, Document, obj.Copy, resourceCollector);
                }
            }).Wait();
        }
        public Task Convert(BufferBuilder builder, MapDocument document, IMapObject obj,
                            ResourceCollector resourceCollector)
        {
            var pointfile = GetPointfile(document);

            if (pointfile == null)
            {
                return(Task.FromResult(0));
            }

            var r      = 1f;
            var g      = 0.5f;
            var b      = 0.5f;
            var change = 0.5f / pointfile.Lines.Count;

            var verts = new List <VertexStandard>();
            var index = new List <uint>();

            for (var i = 0; i < pointfile.Lines.Count; i++)
            {
                var line = pointfile.Lines[i];

                index.Add((uint)index.Count + 0);
                index.Add((uint)index.Count + 1);

                verts.Add(new VertexStandard
                {
                    Position = line.Start,
                    Colour   = new Vector4(r, g, b, 1),
                    Tint     = Vector4.One
                });
                verts.Add(new VertexStandard
                {
                    Position = line.End,
                    Colour   = new Vector4(r, g, b, 1),
                    Tint     = Vector4.One
                });

                r = 1f - (change * i);
                b = 0.5f + (change * i);
            }

            builder.Append(verts, index, new []
            {
                new BufferGroup(PipelineType.Wireframe, CameraType.Both, 0, (uint)index.Count)
            });

            return(Task.FromResult(0));
        }
Beispiel #15
0
        protected override void Render(MapDocument document, BufferBuilder builder, ResourceCollector resourceCollector)
        {
            if (box.State.Action != BoxAction.Idle)
            {
                // Force this work to happen on a new thread so waiting on it won't block the context
                Task.Run(async() =>
                {
                    foreach (var obj in GetPreview(document).OfType <Solid>())
                    {
                        await Convert(builder, document, obj, resourceCollector);
                    }
                }).Wait();
            }

            base.Render(document, builder, resourceCollector);
        }
Beispiel #16
0
        private bool CanCast(Spell spell)
        {
            if (!_resourceCollector)
            {
                _resourceCollector = GameObject.FindWithTag("ResourceCollector").GetComponent <ResourceCollector>();
            }
            int red    = _resourceCollector.essences["red"] - spell.cost["red"];
            int blue   = _resourceCollector.essences["blue"] - spell.cost["blue"];
            int green  = _resourceCollector.essences["green"] - spell.cost["green"];
            int yellow = _resourceCollector.essences["yellow"] - spell.cost["yellow"];

            if (red < 0 || blue < 0 || green < 0 || yellow < 0)
            {
                return(false);
            }
            return(true);
        }
Beispiel #17
0
        // Start is called before the first frame update
        private void Start()
        {
            _player            = GameObject.FindWithTag("Player");
            _resourceCollector = GameObject.FindWithTag("ResourceCollector").GetComponent <ResourceCollector>();
            _resourceGenerator = GameObject.FindWithTag("ResourceGenerator").GetComponent <ResourceGenerator>();

            // Spawn random number of essence pieces
            System.Random rnd = new System.Random();
            _essenceNumber = rnd.Next(8, 14);
            SpawnEssencePieces(_essenceNumber);

            // Set initial values for hover effect
            _timeCounter            = Random.Range(0, 200);
            _basePosition           = transform.position;
            _movingTowardsPlayer    = false;
            _moveTowardsPlayerSpeed = DefaultMoveTowardsPlayerSpeed;
        }
    // Use this for initialization
    void Start()
    {
        rCollector = GetComponent <ResourceCollector>();

        foodText      = GameObject.Find("FoodText").GetComponent <Text>();
        waterText     = GameObject.Find("WaterText").GetComponent <Text>();
        woodText      = GameObject.Find("WoodText").GetComponent <Text>();
        metalText     = GameObject.Find("MetalText").GetComponent <Text>();
        medicineText  = GameObject.Find("MedicineText").GetComponent <Text>();
        happinessText = GameObject.Find("HappinessText").GetComponent <Text>();
        ammoText      = GameObject.Find("AmmoText").GetComponent <Text>();
        moneyText     = GameObject.Find("MoneyText").GetComponent <Text>();

        Ammo = 20;
        updateUiInfo();
        gatheredtext = GameObject.Find("gatheredText");
        gathertext   = gatheredtext.GetComponent <Text>();
    }
    private void SetBuildingComponents(GameObject build, bool state)
    {
        BoxCollider boxCollider = build.GetComponent <BoxCollider>();

        if (boxCollider)
        {
            boxCollider.enabled = state;
        }

        ResourceCollector resourceCollector = build.GetComponent <ResourceCollector>();

        if (resourceCollector)
        {
            resourceCollector.enabled = state;
        }

        ResourceConverter resourceConverter = build.GetComponent <ResourceConverter>();

        if (resourceConverter)
        {
            resourceConverter.enabled = state;
        }

        AgentSpawner agentSpawner = build.GetComponent <AgentSpawner>();

        if (agentSpawner)
        {
            agentSpawner.enabled = state;
        }

        Animator animator = build.GetComponent <Animator>();

        if (animator)
        {
            animator.enabled = state;
        }

        TreeSibling treeSibling = build.GetComponent <TreeSibling>();

        if (treeSibling)
        {
            treeSibling.enabled = state;
        }
    }
Beispiel #20
0
        public void Update(long frame)
        {
            var builder    = _engine.Value.CreateBufferBuilder(BufferSize.Small);
            var renderable = new BufferBuilderRenderable(builder);

            if (_activeDocument.TryGetTarget(out var md))
            {
                var resourceCollector = new ResourceCollector();

                foreach (var dr in _dynamicRenderables)
                {
                    dr.Render(builder, resourceCollector);
                }

                foreach (var ddr in _documentDynamicRenderables)
                {
                    ddr.Render(md, builder, resourceCollector);
                }

                var env = md.Environment;
                if (env != null)
                {
                    Task.Run(() => _resourceCollection.Upload(env, resourceCollector)).Wait();
                }
            }

            builder.Complete();
            _engine.Value.Add(renderable);

            if (_builder != null)
            {
                _engine.Value.Remove(_renderable);
                _renderable.Dispose();
                _builder.Dispose();
            }

            _builder    = builder;
            _renderable = renderable;
        }
Beispiel #21
0
        // Scene handling

        private Task UpdateScene(MapDocument md, IEnumerable <IMapObject> affected)
        {
            var waitTask = Task.CompletedTask;

            lock (_lock)
            {
                if (_sceneBuilder == null)
                {
                    _sceneBuilder = new SceneBuilder(_engine.Value);
                    _engine.Value.Add(_sceneBuilder.SceneBuilderRenderable);
                    affected = null;
                }

                using (_engine.Value.Pause())
                {
                    if (affected == null || md == null)
                    {
                        foreach (var r in _sceneBuilder.GetAllRenderables())
                        {
                            _engine.Value.Remove(r);
                            if (r is IUpdateable u)
                            {
                                _engine.Value.Remove(u);
                            }
                        }
                        _sceneBuilder.Clear();
                    }

                    if (md != null)
                    {
                        var resourceCollector = new ResourceCollector();
                        waitTask = _converter.Value.Convert(md, _sceneBuilder, affected, resourceCollector)
                                   .ContinueWith(t => HandleResources(md.Environment, resourceCollector));
                    }
                }
            }

            return(waitTask);
        }
        public override void Render(BufferBuilder builder, ResourceCollector resourceCollector)
        {
            base.Render(builder, resourceCollector);

            var verts   = new List <VertexStandard>();
            var indices = new List <int>();
            var groups  = new List <BufferGroup>();

            var col     = Vector4.One;
            var tintCol = Color.FromArgb(128, Color.OrangeRed).ToVector4();

            foreach (var face in _selectedFaces)
            {
                var vo = verts.Count;
                var io = indices.Count;

                verts.AddRange(face.Face.Vertices.Select(x => new VertexStandard
                {
                    Position = x.Position,
                    Colour   = col,
                    Tint     = tintCol,
                    Flags    = VertexFlags.FlatColour
                }));

                for (var i = 2; i < face.Face.Vertices.Count; i++)
                {
                    indices.Add(vo);
                    indices.Add(vo + i - 1);
                    indices.Add(vo + i);
                }

                groups.Add(new BufferGroup(PipelineType.TexturedAlpha, CameraType.Perspective, face.Face.Origin, (uint)io, (uint)(indices.Count - io)));
            }

            builder.Append(verts, indices.Select(x => (uint)x), groups);
        }
        private static Material loadMaterial(string name, ResourceCollector.Pack packs)
        {
            ResourceCollector.Content.Material mat =  ResourceCollector.PackList.Instance.GetObject(name) as ResourceCollector.Content.Material;
            if (mat.Enginereadedobject.Count == 0)
            {
                XNAevents.Add("creating material " + name);
                TextureMaterial.Lod[] lods = new TextureMaterial.Lod[mat.lodMats.Count];
                for (int i = 0; i < mat.lodMats.Count; i++)
                {
                    TextureMaterial.SubsetMaterial[] mats = new TextureMaterial.SubsetMaterial[mat.lodMats[i].mats.Count];
                    for (int j = 0; j < mat.lodMats[i].mats.Count; j++)
                    {
                        mats[j] = new TextureMaterial.SubsetMaterial();
                        Content.EngineTexture texture;
                        ResourceCollector.ImageContent inage = ResourceCollector.PackList.Instance.GetObject(mat.lodMats[i].mats[j].DiffuseTextureName) as ResourceCollector.ImageContent;
                        if (inage.Enginereadedobject.Count == 0)
                        {
                            texture = new Content.EngineTexture();
                            XNAevents.Add("creating texture " + mat.lodMats[i].mats[j].DiffuseTextureName);
                            texture.loadbody(inage.data);
                            inage.usercount++;
                        }
                        else
                        {
                            texture = inage.Enginereadedobject[0] as Content.EngineTexture;
                        }
                        inage.Enginereadedobject.Add(texture);
                        mats[j].diffuseTexture = texture.texture;
                    }
                    lods[i] = new TextureMaterial.Lod(mats);

                }
                TextureMaterial tm = new TextureMaterial(lods);
                mat.Enginereadedobject.Add(tm);
                return tm;
            }
            else
            {
                TextureMaterial result = mat.Enginereadedobject[0] as TextureMaterial;
                mat.Enginereadedobject.Add(result);

                for (int i = 0; i < mat.lodMats.Count; i++)
                {
                    for (int j = 0; j < mat.lodMats[i].mats.Count; j++)
                    {
                        ResourceCollector.ImageContent inage = ResourceCollector.PackList.Instance.GetObject(mat.lodMats[i].mats[j].DiffuseTextureName) as ResourceCollector.ImageContent;
                        inage.Enginereadedobject.Add(inage.Enginereadedobject[0]);
                    }
                }
                return result;
            }
        }
 public Task Convert(BufferBuilder builder, MapDocument document, IMapObject obj, ResourceCollector resourceCollector)
 {
     return(ConvertBox(builder, obj, obj.BoundingBox));
 }
Beispiel #25
0
        internal static async Task ConvertFaces(BufferBuilder builder, MapDocument document, IMapObject obj, List <Face> faces, ResourceCollector resourceCollector)
        {
            faces = faces.Where(x => x.Vertices.Count > 2).ToList();

            var displayFlags = document.Map.Data.GetOne <DisplayFlags>();
            var hideNull     = displayFlags?.HideNullTextures == true;

            // Pack the vertices like this [ f1v1 ... f1vn ] ... [ fnv1 ... fnvn ]
            var numVertices = (uint)faces.Sum(x => x.Vertices.Count);

            // Pack the indices like this [ solid1 ... solidn ] [ wireframe1 ... wireframe n ]
            var numSolidIndices     = (uint)faces.Sum(x => (x.Vertices.Count - 2) * 3);
            var numWireframeIndices = numVertices * 2;

            var points  = new VertexStandard[numVertices];
            var indices = new uint[numSolidIndices + numWireframeIndices];

            var colour = (obj.IsSelected ? Color.Red : obj.Data.GetOne <ObjectColor>()?.Color ?? Color.White).ToVector4();

            //var c = obj.IsSelected ? Color.FromArgb(255, 128, 128) : Color.White;
            //var tint = new Vector4(c.R, c.G, c.B, c.A) / 255f;
            var tint = Vector4.One;

            var tc = await document.Environment.GetTextureCollection();

            var pipeline = PipelineType.TexturedOpaque;
            var entityHasTransparency = false;
            var flags = obj.IsSelected ? VertexFlags.SelectiveTransformed : VertexFlags.None;

            // try and find the parent entity for render flags
            // TODO: this code is extremely specific to Goldsource and should be abstracted away
            var parentEntity = obj.FindClosestParent(x => x is Entity) as Entity;

            if (parentEntity?.EntityData != null)
            {
                const int renderModeColor    = 1;
                const int renderModeTexture  = 2;
                const int renderModeGlow     = 3; // same as texture for brushes
                const int renderModeSolid    = 4;
                const int renderModeAdditive = 5;

                var rendermode = parentEntity.EntityData.Get("rendermode", 0);
                var renderamt  = parentEntity.EntityData.Get("renderamt", 255f) / 255;
                entityHasTransparency = renderamt < 0.99;

                switch (rendermode)
                {
                case renderModeColor:
                    // Flat colour, use render colour and force it to run through the alpha tested pipeline
                    var rendercolor = parentEntity.EntityData.GetVector3("rendercolor") / 255f ?? Vector3.One;
                    tint     = new Vector4(rendercolor, renderamt);
                    flags   |= VertexFlags.FlatColour | VertexFlags.AlphaTested;
                    pipeline = PipelineType.TexturedAlpha;
                    entityHasTransparency = true;
                    break;

                case renderModeTexture:
                case renderModeGlow:
                    // Texture is alpha tested and can be transparent
                    tint   = new Vector4(1, 1, 1, renderamt);
                    flags |= VertexFlags.AlphaTested;
                    if (entityHasTransparency)
                    {
                        pipeline = PipelineType.TexturedAlpha;
                    }
                    break;

                case renderModeSolid:
                    // Texture is alpha tested only
                    flags |= VertexFlags.AlphaTested;
                    entityHasTransparency = false;
                    break;

                case renderModeAdditive:
                    // Texture is alpha tested and transparent, force through the additive pipeline
                    tint     = new Vector4(renderamt, renderamt, renderamt, 1);
                    pipeline = PipelineType.TexturedAdditive;
                    entityHasTransparency = true;
                    break;

                default:
                    entityHasTransparency = false;
                    break;
                }
            }

            if (obj.IsSelected)
            {
                tint *= new Vector4(1, 0.5f, 0.5f, 1);
            }

            var vi = 0u;
            var si = 0u;
            var wi = numSolidIndices;

            foreach (var face in faces)
            {
                var opacity = tc.GetOpacity(face.Texture.Name);
                var t       = await tc.GetTextureItem(face.Texture.Name);

                var w = t?.Width ?? 0;
                var h = t?.Height ?? 0;

                var tintModifier = new Vector4(1, 1, 1, opacity);
                var extraFlags   = t == null ? VertexFlags.FlatColour : VertexFlags.None;

                var offs         = vi;
                var numFaceVerts = (uint)face.Vertices.Count;

                var textureCoords = face.GetTextureCoordinates(w, h).ToList();

                var normal = face.Plane.Normal;
                for (var i = 0; i < face.Vertices.Count; i++)
                {
                    var v = face.Vertices[i];
                    points[vi++] = new VertexStandard
                    {
                        Position = v,
                        Colour   = colour,
                        Normal   = normal,
                        Texture  = new Vector2(textureCoords[i].Item2, textureCoords[i].Item3),
                        Tint     = tint * tintModifier,
                        Flags    = flags | extraFlags
                    };
                }

                // Triangles - [0 1 2]  ... [0 n-1 n]
                for (uint i = 2; i < numFaceVerts; i++)
                {
                    indices[si++] = offs;
                    indices[si++] = offs + i - 1;
                    indices[si++] = offs + i;
                }

                // Lines - [0 1] ... [n-1 n] [n 0]
                for (uint i = 0; i < numFaceVerts; i++)
                {
                    indices[wi++] = offs + i;
                    indices[wi++] = offs + (i == numFaceVerts - 1 ? 0 : i + 1);
                }
            }

            var groups = new List <BufferGroup>();

            uint texOffset = 0;

            foreach (var f in faces)
            {
                var texInd = (uint)(f.Vertices.Count - 2) * 3;

                if (hideNull && tc.IsNullTexture(f.Texture.Name))
                {
                    texOffset += texInd;
                    continue;
                }

                var opacity = tc.GetOpacity(f.Texture.Name);
                var t       = await tc.GetTextureItem(f.Texture.Name);

                var transparent = entityHasTransparency || opacity < 0.95f || t?.Flags.HasFlag(TextureFlags.Transparent) == true;

                var texture = t == null ? string.Empty : $"{document.Environment.ID}::{f.Texture.Name}";

                var group = new BufferGroup(
                    pipeline == PipelineType.TexturedOpaque && transparent ? PipelineType.TexturedAlpha : pipeline,
                    CameraType.Perspective, transparent, f.Origin, texture, texOffset, texInd
                    );
                groups.Add(group);

                texOffset += texInd;

                if (t != null)
                {
                    resourceCollector.RequireTexture(t.Name);
                }
            }

            groups.Add(new BufferGroup(PipelineType.Wireframe, obj.IsSelected ? CameraType.Both : CameraType.Orthographic, numSolidIndices, numWireframeIndices));

            builder.Append(points, indices, groups);

            // Also push the untransformed wireframe when selected
            if (obj.IsSelected)
            {
                for (var i = 0; i < points.Length; i++)
                {
                    points[i].Flags = VertexFlags.None;
                }
                var untransformedIndices = indices.Skip((int)numSolidIndices);
                builder.Append(points, untransformedIndices, new[]
                {
                    new BufferGroup(PipelineType.Wireframe, CameraType.Both, 0, numWireframeIndices)
                });
            }
        }
Beispiel #26
0
 public Task Convert(BufferBuilder builder, MapDocument document, IMapObject obj, ResourceCollector resourceCollector)
 {
     return(ConvertFaces(builder, document, obj, obj.Data.Get <Face>().ToList(), resourceCollector));
 }
        public async Task Convert(BufferBuilder builder, MapDocument document, IMapObject obj, ResourceCollector resourceCollector)
        {
            var entity = (Entity)obj;
            var tc     = await document.Environment.GetTextureCollection();

            var sd = GetSpriteData(entity);

            if (sd == null || !sd.ContentsReplaced)
            {
                return;
            }

            var name  = sd.Name;
            var scale = sd.Scale;

            var width  = entity.BoundingBox.Width;
            var height = entity.BoundingBox.Height;

            var t = await tc.GetTextureItem(name);

            var texture = $"{document.Environment.ID}::{name}";

            if (t != null)
            {
                resourceCollector.RequireTexture(t.Name);
            }

            var tint = sd.Color.ToVector4();

            var flags = VertexFlags.None;

            if (entity.IsSelected)
            {
                flags |= VertexFlags.SelectiveTransformed;
            }

            builder.Append(
                new [] { new VertexStandard {
                             Position = entity.Origin, Normal = new Vector3(width, height, 0), Colour = Vector4.One, Tint = tint, Flags = flags
                         } },
                new [] { 0u },
                new [] { new BufferGroup(PipelineType.BillboardAlpha, CameraType.Perspective, entity.BoundingBox.Center, texture, 0, 1) }
                );
        }
Beispiel #28
0
        public Task Convert(BufferBuilder builder, MapDocument document, IMapObject obj, ResourceCollector resourceCollector)
        {
            var c = GetCordon(document);

            if (!c.Enabled)
            {
                return(Task.FromResult(0));
            }

            // It's always a box, these numbers are known
            const uint numVertices         = 4 * 6;
            const uint numWireframeIndices = numVertices * 2;

            var points  = new VertexStandard[numVertices];
            var indices = new uint[numWireframeIndices];

            var colour = new Vector4(1, 0, 0, 1);

            var vi = 0u;
            var wi = 0u;

            foreach (var face in c.Box.GetBoxFaces())
            {
                var offs = vi;

                var normal = new Plane(face[0], face[1], face[2]).Normal;
                foreach (var v in face)
                {
                    points[vi++] = new VertexStandard
                    {
                        Position = v,
                        Colour   = colour,
                        Normal   = normal,
                        Texture  = Vector2.Zero,
                        Tint     = Vector4.One
                    };
                }

                // Lines - [0 1] ... [n-1 n] [n 0]
                for (uint i = 0; i < 4; i++)
                {
                    indices[wi++] = offs + i;
                    indices[wi++] = offs + (i == 4 - 1 ? 0 : i + 1);
                }
            }

            var groups = new[]
            {
                new BufferGroup(PipelineType.Wireframe, CameraType.Both, 0, numWireframeIndices)
            };

            builder.Append(points, indices, groups);

            return(Task.FromResult(0));
        }
        protected override void Render(MapDocument document, BufferBuilder builder, ResourceCollector resourceCollector)
        {
            base.Render(document, builder, resourceCollector);

            var sel = GetSelection(document);

            if (sel.IsEmpty)
            {
                return;
            }

            var verts   = new List <VertexStandard>();
            var indices = new List <int>();
            var groups  = new List <BufferGroup>();

            var hideFaceMask    = ShouldHideFaceMask;
            var selectionColour = Color.FromArgb(32, Color.Red).ToVector4();

            // Add selection highlights
            if (!hideFaceMask)
            {
                foreach (var face in sel)
                {
                    var indOffs = indices.Count;
                    var offs    = verts.Count;

                    verts.AddRange(face.Vertices.Select(x => new VertexStandard
                    {
                        Position = x,
                        Colour   = Vector4.One,
                        Tint     = selectionColour,
                        Flags    = VertexFlags.FlatColour
                    }));

                    for (var i = 2; i < face.Vertices.Count; i++)
                    {
                        indices.Add(offs);
                        indices.Add(offs + i - 1);
                        indices.Add(offs + i);
                    }

                    groups.Add(new BufferGroup(PipelineType.TexturedAlpha, CameraType.Perspective, face.Origin, (uint)indOffs, (uint)(indices.Count - indOffs)));
                }

                builder.Append(verts, indices.Select(x => (uint)x), groups);
            }

            // Add wireframes - selection outlines and texture axes
            var lineColour  = Color.Yellow.ToVector4();
            var uAxisColour = Color.Yellow.ToVector4();
            var vAxisColour = Color.Lime.ToVector4();
            var wfIndOffs   = indices.Count;

            foreach (var face in sel)
            {
                var offs = verts.Count;

                // outlines
                verts.AddRange(face.Vertices.Select(x => new VertexStandard {
                    Position = x, Colour = lineColour, Tint = Vector4.One
                }));
                for (var i = 0; i < face.Vertices.Count; i++)
                {
                    indices.Add(offs + i);
                    indices.Add(offs + (i + 1) % face.Vertices.Count);
                }

                // texture axes
                var lineStart = (face.Vertices.Aggregate(Vector3.Zero, (a, b) => a + b) / face.Vertices.Count) + face.Plane.Normal * 0.5f;
                var uEnd      = lineStart + face.Texture.UAxis * 20;
                var vEnd      = lineStart + face.Texture.VAxis * 20;

                offs = verts.Count;
                verts.Add(new VertexStandard {
                    Position = lineStart, Colour = uAxisColour, Tint = Vector4.One
                });
                verts.Add(new VertexStandard {
                    Position = uEnd, Colour = uAxisColour, Tint = Vector4.One
                });
                verts.Add(new VertexStandard {
                    Position = lineStart, Colour = vAxisColour, Tint = Vector4.One
                });
                verts.Add(new VertexStandard {
                    Position = vEnd, Colour = vAxisColour, Tint = Vector4.One
                });
                indices.Add(offs + 0);
                indices.Add(offs + 1);
                indices.Add(offs + 2);
                indices.Add(offs + 3);
            }

            groups.Add(new BufferGroup(PipelineType.Wireframe, CameraType.Perspective, (uint)wfIndOffs, (uint)(indices.Count - wfIndOffs)));
            builder.Append(verts, indices.Select(x => (uint)x), groups);
        }
		public Resource[] SelectObjects(Entity subject, Entity predicate) {
			Hashtable resources = new Hashtable();
			ResourceCollector collector = new ResourceCollector();
			collector.SPO = 2;
			collector.Table = resources;
			Select(new Statement(subject, predicate, null, null), collector);
			return (Resource[])new ArrayList(resources.Keys).ToArray(typeof(Resource));
		}
 private static RenderObject loadro(
     ResourceCollector.Content.LevelObjectDescription description,
     ResourceCollector.Pack packs)
 {
     ResourceCollector.Content.RenderObjectDescription rod = ResourceCollector.PackList.Instance.GetObject(description.RODName) as ResourceCollector.Content.RenderObjectDescription;
     if (rod.Enginereadedobject.Count == 0)
     {
         XNAevents.Add("creating render object " + description.RODName);
         UnAnimRenderObject.Model[] models = new UnAnimRenderObject.Model[rod.LODs.Count];
         for (int i = 0; i < models.Length; i++)
         {
             UnAnimRenderObject.SubSet[] modelsubsets = new UnAnimRenderObject.SubSet[rod.LODs[i].subsets.Count];
             for (int j = 0; j < modelsubsets.Length; j++)
             {
                 ResourceCollector.PackContent[] objects = ResourceCollector.PackList.Instance.GetObjects(rod.LODs[i].subsets[j].MeshNames);
                 ResourceCollector.MeshSkinned[] subsetmeshes = new ResourceCollector.MeshSkinned[objects.Length];
                 for (int t = 0; t < subsetmeshes.Length; t++)
                     subsetmeshes[t] = objects[t] as ResourceCollector.MeshSkinned;
                 //меши могут быть по-разному сгруппированы поэтому будем их каждый раз по новой загружать
                 EngineMesh subsetmesh = EngineMesh.FromContentMeshes(subsetmeshes);
                 modelsubsets[j] = new UnAnimRenderObject.SubSet(subsetmesh);
             }
             models[i] = new UnAnimRenderObject.Model(modelsubsets);
         }
         //его тоже удалят
         RenderObject result = new UnAnimRenderObject(models, rod.IsShadowCaster, rod.IsShadowReceiver);
         rod.Enginereadedobject.Add(result);
         return result;
     }
     else
     {
         RenderObject result = rod.Enginereadedobject[0] as RenderObject;
         rod.Enginereadedobject.Add(result);
         return result;
     }
 }
Beispiel #32
0
        private async Task Convert(BufferBuilder builder, MapDocument document, IMapObject obj, ResourceCollector resourceCollector)
        {
            var solid = (Solid)obj;
            var faces = solid.Faces.Where(x => x.Vertices.Count > 2).ToList();

            // Pack the vertices like this [ f1v1 ... f1vn ] ... [ fnv1 ... fnvn ]
            var numVertices = (uint)faces.Sum(x => x.Vertices.Count);

            // Pack the indices like this [ solid1 ... solidn ] [ wireframe1 ... wireframe n ]
            var numSolidIndices     = (uint)faces.Sum(x => (x.Vertices.Count - 2) * 3);
            var numWireframeIndices = numVertices * 2;

            var points  = new VertexStandard[numVertices];
            var indices = new uint[numSolidIndices + numWireframeIndices];

            var c      = Color.Turquoise;
            var colour = new Vector4(c.R, c.G, c.B, c.A) / 255f;

            c = Color.FromArgb(192, Color.Turquoise);
            var tint = new Vector4(c.R, c.G, c.B, c.A) / 255f;

            var tc = await document.Environment.GetTextureCollection();

            var vi = 0u;
            var si = 0u;
            var wi = numSolidIndices;

            foreach (var face in faces)
            {
                var t = await tc.GetTextureItem(face.Texture.Name);

                var w = t?.Width ?? 0;
                var h = t?.Height ?? 0;

                var offs         = vi;
                var numFaceVerts = (uint)face.Vertices.Count;

                var textureCoords = face.GetTextureCoordinates(w, h).ToList();

                var normal = face.Plane.Normal;
                for (var i = 0; i < face.Vertices.Count; i++)
                {
                    var v = face.Vertices[i];
                    points[vi++] = new VertexStandard
                    {
                        Position = v,
                        Colour   = colour,
                        Normal   = normal,
                        Texture  = new Vector2(textureCoords[i].Item2, textureCoords[i].Item3),
                        Tint     = tint,
                        Flags    = t == null ? VertexFlags.FlatColour : VertexFlags.None
                    };
                }

                // Triangles - [0 1 2]  ... [0 n-1 n]
                for (uint i = 2; i < numFaceVerts; i++)
                {
                    indices[si++] = offs;
                    indices[si++] = offs + i - 1;
                    indices[si++] = offs + i;
                }

                // Lines - [0 1] ... [n-1 n] [n 0]
                for (uint i = 0; i < numFaceVerts; i++)
                {
                    indices[wi++] = offs + i;
                    indices[wi++] = offs + (i == numFaceVerts - 1 ? 0 : i + 1);
                }
            }

            var groups = new List <BufferGroup>();

            uint texOffset = 0;

            foreach (var f in faces)
            {
                var texInd = (uint)(f.Vertices.Count - 2) * 3;

                var opacity = tc.GetOpacity(f.Texture.Name);
                var t       = await tc.GetTextureItem(f.Texture.Name);

                var transparent = opacity < 0.95f || t?.Flags.HasFlag(TextureFlags.Transparent) == true;

                var texture = t == null ? string.Empty : $"{document.Environment.ID}::{f.Texture.Name}";

                groups.Add(transparent
                    ? new BufferGroup(PipelineType.TexturedAlpha, CameraType.Perspective, f.Origin, texture, texOffset, texInd)
                    : new BufferGroup(PipelineType.TexturedOpaque, CameraType.Perspective, texture, texOffset, texInd)
                           );

                texOffset += texInd;

                if (t != null)
                {
                    resourceCollector.RequireTexture(t.Name);
                }
            }

            groups.Add(new BufferGroup(PipelineType.Wireframe, solid.IsSelected ? CameraType.Both : CameraType.Orthographic, numSolidIndices, numWireframeIndices));

            builder.Append(points, indices, groups);
        }
        public static LevelObject LevelObjectFromDescription(
            ResourceCollector.Content.LevelObjectDescription description,
            ResourceCollector.Pack packs)
        {
            if (description.Enginereadedobject.Count==0)
            {
                //рендераспект - мб один на несколько объектов
                RenderObject renderaspect = loadro(description, packs);
                Material m = loadMaterial(description.matname, packs);
                //его тоже удалят
                RaycastBoundObject raycastaspect = loadrcbo(description, packs);

                #region lalala
                /*switch (description.BehaviourType)
            {
                case ResourceCollector.Content.WorldObjectDescription.objectmovingbehaviourmodel:
                    {
                        throw new Exception("Unsupported behaviour model!");
                    }break;
                case ResourceCollector.Content.WorldObjectDescription.objectphysiccharcontrollerbehaviourmodel:
                    {
                        StillDesign.PhysX.ActorDescription ObjectActorDescription = new StillDesign.PhysX.ActorDescription();

                        if (description.ShapeType == 0)
                        {
                            if (description.PhysXShapeType == 0)
                            {
                                StillDesign.PhysX.BoxShapeDescription boxshape = new StillDesign.PhysX.BoxShapeDescription(description.ShapeSize);
                                boxshape.LocalRotation = Microsoft.Xna.Framework.Matrix.CreateRotationX(Microsoft.Xna.Framework.MathHelper.PiOver2);
                                ObjectActorDescription.Shapes.Add(boxshape);
                            }
                            else if (description.PhysXShapeType == 1)
                            {
                                StillDesign.PhysX.CapsuleShapeDescription capsshape = new StillDesign.PhysX.CapsuleShapeDescription(description.ShapeSize.X, description.ShapeSize.Z);
                                capsshape.LocalRotation = Microsoft.Xna.Framework.Matrix.CreateRotationX(Microsoft.Xna.Framework.MathHelper.PiOver2);
                                ObjectActorDescription.Shapes.Add(capsshape);
                            }
                        }
                        else if (description.ShapeType == 1)
                        {
                            CollisionMesh physicCM = new CollisionMesh();
                            physicCM = packs.GetObject(description.RCCMName, physicCM) as CollisionMesh;

                            ObjectActorDescription.Shapes.Add(physicCM.CreatreConvexShape(scene.Core));
                        }

                        ObjectActorDescription.BodyDescription = new StillDesign.PhysX.BodyDescription(description.Mass);
                        Microsoft.Xna.Framework.Matrix MassCenterMatrix;
                        Microsoft.Xna.Framework.Matrix.CreateTranslation(ref description.CenterOfMass, out MassCenterMatrix);
                        ObjectActorDescription.BodyDescription.MassLocalPose = MassCenterMatrix;

                        ObjectActor = scene.CreateActor(ObjectActorDescription);
                        ObjectActor.RaiseBodyFlag(StillDesign.PhysX.BodyFlag.FrozenRotation);
                        foreach (var c in ObjectActor.Shapes)
                        {
                            c.Group = 31;
                        }

                    } break;
                case ResourceCollector.Content.WorldObjectDescription.objectstaticbehaviourmodel:
                    {

                    }break;
                case ResourceCollector.Content.WorldObjectDescription.objectphysicbehaviourmodel:
                    {
                        StillDesign.PhysX.ActorDescription ObjectActorDescription = new StillDesign.PhysX.ActorDescription();
                        if (description.ShapeType == 0)
                        {
                            if (description.PhysXShapeType == 0)
                            {
                                StillDesign.PhysX.BoxShapeDescription boxshape = new StillDesign.PhysX.BoxShapeDescription(description.ShapeSize);
                                Microsoft.Xna.Framework.Matrix m;
                                Microsoft.Xna.Framework.Vector3 v = description.ShapeRotationAxis;
                                Microsoft.Xna.Framework.Matrix.CreateFromAxisAngle(ref v, description.ShapeRotationAngle, out m);
                                boxshape.LocalRotation = m;

                                ObjectActorDescription.Shapes.Add(boxshape);
                            }
                            else if (description.PhysXShapeType == 1)
                            {
                                StillDesign.PhysX.CapsuleShapeDescription capsshape = new StillDesign.PhysX.CapsuleShapeDescription(description.ShapeSize.X,description.ShapeSize.Z);
                                Microsoft.Xna.Framework.Matrix m;
                                Microsoft.Xna.Framework.Vector3 v = description.ShapeRotationAxis;
                                Microsoft.Xna.Framework.Matrix.CreateFromAxisAngle(ref v, description.ShapeRotationAngle, out m);
                                capsshape.LocalRotation = m;

                                ObjectActorDescription.Shapes.Add(capsshape);
                            }
                        }
                        else if (description.ShapeType == 1)
                        {
                            CollisionMesh physicCM = new CollisionMesh();
                            physicCM = packs.GetObject(description.RCCMName, physicCM) as CollisionMesh;

                            if (description.IsStatic)
                                ObjectActorDescription.Shapes.Add(physicCM.CreateTriangleMeshShape(scene.Core));
                            else
                                ObjectActorDescription.Shapes.Add(physicCM.CreatreConvexShape(scene.Core));
                        }

                        if (description.IsStatic)
                        {
                            ObjectActorDescription.BodyDescription = null;
                        }
                        else
                        {
                            ObjectActorDescription.BodyDescription = new StillDesign.PhysX.BodyDescription(description.Mass);
                            Microsoft.Xna.Framework.Matrix MassCenterMatrix;
                            Microsoft.Xna.Framework.Matrix.CreateTranslation(ref description.CenterOfMass, out MassCenterMatrix);
                            ObjectActorDescription.BodyDescription.MassLocalPose = MassCenterMatrix;
                        }
                        ObjectActor = scene.CreateActor(ObjectActorDescription);
                        if (description.IsStatic)
                        {
                            foreach (var c in ObjectActor.Shapes)
                            {
                                c.Group = 1;
                            }
                        }
                        else
                        {
                            foreach (var c in ObjectActor.Shapes)
                            {
                                c.Group = 31;
                            }
                        }

                        //CONTACT REPORT DISABLED TEMPORARY
                        //ObjectActor.ContactReportFlags = StillDesign.PhysX.ContactPairFlag.All;
                    }break;
                default:
                    {
                        throw new Exception("Unsupported behaviour model!");
                    } break;
            }*/
                #endregion

                Logic.BehaviourModel.ObjectBehaviourModel behaviourmodel = null;
                switch (description.BehaviourType)
                {
                    case ResourceCollector.Content.LevelObjectDescription.objectmovingbehaviourmodel:
                        {
                            throw new Exception("Unsupported behaviour model!");
                        } break;
                    case ResourceCollector.Content.LevelObjectDescription.objectphysiccharcontrollerbehaviourmodel:
                        {
                            behaviourmodel = new Logic.BehaviourModel.ObjectPhysicControllerBehaviourModel(/*_actor*/);
                        } break;
                    case ResourceCollector.Content.LevelObjectDescription.objectstaticbehaviourmodel:
                        {
                            behaviourmodel = new Logic.BehaviourModel.ObjectStaticBehaviourModel();
                        } break;
                    case ResourceCollector.Content.LevelObjectDescription.objectphysicbehaviourmodel:
                        {
                            behaviourmodel = new Logic.BehaviourModel.ObjectPhysicBehaviourModel(/*_actor*/);
                        } break;
                    case ResourceCollector.Content.LevelObjectDescription.objectBonerelatedbehaviourmodel:
                        {
                            behaviourmodel = new Logic.BehaviourModel.ObjectBoneRelatedBehaviourModel(/*_actor*/);
                        } break;

                    default:
                        {
                            throw new Exception("Unsupported behaviour model!");
                        } break;
                }
                //её гк удалит
                EditorData ed = new EditorData(description.name, ObjectEditorType.SolidObject);
                LevelObject createdobject = new LevelObject(behaviourmodel, renderaspect, m, raycastaspect, ed);
                description.Enginereadedobject.Add(createdobject);
                return createdobject;
            }
            else
            {
                LevelObject createdobject = description.Enginereadedobject[0] as LevelObject;
                RenderObject ro = loadro(description, packs);
                Material m = loadMaterial(description.matname, packs);

                Logic.BehaviourModel.ObjectBehaviourModel behaviourmodel = null;
                switch (description.BehaviourType)
                {
                    case ResourceCollector.Content.LevelObjectDescription.objectmovingbehaviourmodel:
                        {
                            throw new Exception("Unsupported behaviour model!");
                        } break;
                    case ResourceCollector.Content.LevelObjectDescription.objectphysiccharcontrollerbehaviourmodel:
                        {
                            behaviourmodel = new Logic.BehaviourModel.ObjectPhysicControllerBehaviourModel(/*_actor*/);
                        } break;
                    case ResourceCollector.Content.LevelObjectDescription.objectstaticbehaviourmodel:
                        {
                            behaviourmodel = new Logic.BehaviourModel.ObjectStaticBehaviourModel();
                        } break;
                    case ResourceCollector.Content.LevelObjectDescription.objectphysicbehaviourmodel:
                        {
                            behaviourmodel = new Logic.BehaviourModel.ObjectPhysicBehaviourModel(/*_actor*/);
                        } break;
                    default:
                        {
                            throw new Exception("Unsupported behaviour model!");
                        } break;
                }

                RaycastBoundObject raycastaspect = loadrcbo(description, packs);
                EditorData ed = new EditorData(createdobject.editorAspect.DescriptionName, createdobject.editorAspect.objtype);
                LevelObject createdobject1 = new LevelObject(behaviourmodel, ro, m, raycastaspect, ed);
                description.Enginereadedobject.Add(createdobject1);
                return createdobject1;
            }
        }
        public async Task Convert(BufferBuilder builder, MapDocument document, IMapObject obj, ResourceCollector resourceCollector)
        {
            var faces = obj.Data.Get <EntityDecal>().SelectMany(x => x.Geometry).ToList();
            await DefaultSolidConverter.ConvertFaces(builder, document, obj, faces, resourceCollector);

            var origin = obj.Data.GetOne <Origin>()?.Location ?? obj.BoundingBox.Center;
            await DefaultEntityConverter.ConvertBox(builder, obj, new Box(origin - Vector3.One * 4, origin + Vector3.One * 4));
        }
Beispiel #35
0
        // Rendering

        protected override void Render(MapDocument document, BufferBuilder builder, ResourceCollector resourceCollector)
        {
            if (_state != EntityState.None)
            {
                var vec  = _location;
                var high = 1024f * 1024f;
                var low  = -high;

                // Draw a box around the point
                var c = new Box(vec - Vector3.One * 10, vec + Vector3.One * 10);

                const uint numVertices         = 4 * 6 + 6;
                const uint numWireframeIndices = numVertices * 2;

                var points  = new VertexStandard[numVertices];
                var indices = new uint[numWireframeIndices];

                var colour = new Vector4(0, 1, 0, 1);

                var vi = 0u;
                var wi = 0u;
                foreach (var face in c.GetBoxFaces())
                {
                    var offs = vi;

                    foreach (var v in face)
                    {
                        points[vi++] = new VertexStandard {
                            Position = v,
                            Colour   = colour,
                            Tint     = Vector4.One
                        };
                    }

                    // Lines - [0 1] ... [n-1 n] [n 0]
                    for (uint i = 0; i < 4; i++)
                    {
                        indices[wi++] = offs + i;
                        indices[wi++] = offs + (i == 4 - 1 ? 0 : i + 1);
                    }
                }

                // Draw 3 lines pinpointing the point
                var lineOffset = vi;

                points[vi++] = new VertexStandard {
                    Position = new Vector3(low, vec.Y, vec.Z), Colour = colour, Tint = Vector4.One
                };
                points[vi++] = new VertexStandard {
                    Position = new Vector3(high, vec.Y, vec.Z), Colour = colour, Tint = Vector4.One
                };
                points[vi++] = new VertexStandard {
                    Position = new Vector3(vec.X, low, vec.Z), Colour = colour, Tint = Vector4.One
                };
                points[vi++] = new VertexStandard {
                    Position = new Vector3(vec.X, high, vec.Z), Colour = colour, Tint = Vector4.One
                };
                points[vi++] = new VertexStandard {
                    Position = new Vector3(vec.X, vec.Y, low), Colour = colour, Tint = Vector4.One
                };
                points[vi++] = new VertexStandard {
                    Position = new Vector3(vec.X, vec.Y, high), Colour = colour, Tint = Vector4.One
                };

                indices[wi++] = lineOffset++;
                indices[wi++] = lineOffset++;
                indices[wi++] = lineOffset++;
                indices[wi++] = lineOffset++;
                indices[wi++] = lineOffset++;
                indices[wi++] = lineOffset++;

                var groups = new[]
                {
                    new BufferGroup(PipelineType.Wireframe, CameraType.Both, 0, numWireframeIndices)
                };

                builder.Append(points, indices, groups);
            }

            base.Render(document, builder, resourceCollector);
        }
        private static RaycastBoundObject loadrcbo( 
            ResourceCollector.Content.LevelObjectDescription description,
            ResourceCollector.Pack packs)
        {
            //клижмеш мб один на несколько объектов//его прекрасно удалит сам гк если что
            EngineCollisionMesh ObjectRCCM = null;
            //бш уникален для каждого //его тож гк удалит
            Logic.SceneGraph.OTBoundingShape bs = null;
            if (description.IsRCCMEnabled)
            {
                ResourceCollector.Content.CollisionMesh cm = ResourceCollector.PackList.Instance.GetObject(description.RCCMName) as ResourceCollector.Content.CollisionMesh;

                if (cm.Enginereadedobject.Count == 0)
                    ObjectRCCM = EngineCollisionMesh.FromcontentCollisionMesh(cm);
                else
                    ObjectRCCM = cm.Enginereadedobject[0] as EngineCollisionMesh;

                cm.Enginereadedobject.Add(ObjectRCCM);
                bs = new Logic.SceneGraph.OTBoundingShape(ObjectRCCM);
            }
            else
                bs = new Logic.SceneGraph.OTBoundingShape(description.RCShapeSize);
            //его тоже удалят
            RaycastBoundObject raycastaspect = new RaycastBoundObject(bs, ObjectRCCM);
            return raycastaspect;
        }
Beispiel #37
0
        protected override void Render(MapDocument document, BufferBuilder builder, ResourceCollector resourceCollector)
        {
            base.Render(document, builder, resourceCollector);

            if (_state != ClipState.None && _clipPlanePoint1 != null && _clipPlanePoint2 != null && _clipPlanePoint3 != null)
            {
                // Draw the lines
                var p1 = _clipPlanePoint1.Value;
                var p2 = _clipPlanePoint2.Value;
                var p3 = _clipPlanePoint3.Value;

                builder.Append(
                    new []
                {
                    new VertexStandard {
                        Position = p1, Colour = Vector4.One, Tint = Vector4.One
                    },
                    new VertexStandard {
                        Position = p2, Colour = Vector4.One, Tint = Vector4.One
                    },
                    new VertexStandard {
                        Position = p3, Colour = Vector4.One, Tint = Vector4.One
                    },
                },
                    new uint [] { 0, 1, 1, 2, 2, 0 },
                    new []
                {
                    new BufferGroup(PipelineType.Wireframe, CameraType.Both, 0, 6)
                }
                    );

                if (!p1.EquivalentTo(p2) &&
                    !p2.EquivalentTo(p3) &&
                    !p1.EquivalentTo(p3) &&
                    !document.Selection.IsEmpty)
                {
                    var plane = new Plane(p1, p2, p3);
                    var pp    = plane.ToPrecisionPlane();

                    // Draw the clipped solids
                    var faces = new List <Polygon>();
                    foreach (var solid in document.Selection.OfType <Solid>().ToList())
                    {
                        var s = solid.ToPolyhedron().ToPrecisionPolyhedron();
                        s.Split(pp, out var back, out var front);

                        if (_side != ClipSide.Front && back != null)
                        {
                            faces.AddRange(back.Polygons.Select(x => x.ToStandardPolygon()));
                        }
                        if (_side != ClipSide.Back && front != null)
                        {
                            faces.AddRange(front.Polygons.Select(x => x.ToStandardPolygon()));
                        }
                    }

                    var verts   = new List <VertexStandard>();
                    var indices = new List <int>();

                    foreach (var polygon in faces)
                    {
                        var c = verts.Count;
                        verts.AddRange(polygon.Vertices.Select(x => new VertexStandard {
                            Position = x, Colour = Vector4.One, Tint = Vector4.One
                        }));
                        for (var i = 0; i < polygon.Vertices.Count; i++)
                        {
                            indices.Add(c + i);
                            indices.Add(c + (i + 1) % polygon.Vertices.Count);
                        }
                    }

                    builder.Append(
                        verts, indices.Select(x => (uint)x),
                        new[] { new BufferGroup(PipelineType.Wireframe, CameraType.Both, 0, (uint)indices.Count) }
                        );

                    // Draw the clipping plane

                    var poly  = new DataStructures.Geometric.Precision.Polygon(pp);
                    var bbox  = document.Selection.GetSelectionBoundingBox();
                    var point = bbox.Center;
                    foreach (var boxPlane in bbox.GetBoxPlanes())
                    {
                        var proj = boxPlane.Project(point);
                        var dist = (point - proj).Length() * 0.1f;
                        var pln  = new Plane(boxPlane.Normal, proj + boxPlane.Normal * Math.Max(dist, 100)).ToPrecisionPlane();
                        if (poly.Split(pln, out var b, out _))
                        {
                            poly = b;
                        }
                    }

                    verts.Clear();
                    indices.Clear();

                    var clipPoly = poly.ToStandardPolygon();
                    var colour   = Color.FromArgb(64, Color.Turquoise).ToVector4();

                    // Add the face in both directions so it renders on both sides
                    var polies = new[] { clipPoly.Vertices.ToList(), clipPoly.Vertices.Reverse().ToList() };
                    foreach (var p in polies)
                    {
                        var offs = verts.Count;
                        verts.AddRange(p.Select(x => new VertexStandard
                        {
                            Position = x,
                            Colour   = Vector4.One,
                            Tint     = colour,
                            Flags    = VertexFlags.FlatColour
                        }));

                        for (var i = 2; i < clipPoly.Vertices.Count; i++)
                        {
                            indices.Add(offs);
                            indices.Add(offs + i - 1);
                            indices.Add(offs + i);
                        }
                    }

                    builder.Append(
                        verts, indices.Select(x => (uint)x),
                        new[] { new BufferGroup(PipelineType.TexturedAlpha, CameraType.Perspective, p1, 0, (uint)indices.Count) }
                        );
                }
            }
        }
		public Entity[] SelectSubjects(Entity predicate, Resource @object) {
			Hashtable resources = new Hashtable();
			ResourceCollector collector = new ResourceCollector();
			collector.SPO = 0;
			collector.Table = resources;
			Select(new Statement(null, predicate, @object, null), collector);
			return (Entity[])new ArrayList(resources.Keys).ToArray(typeof(Entity));
		}