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); }
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); }
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))); }
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"]); }
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)); }
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)); }
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); }
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); }
// 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; } }
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; }
// 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)); }
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) }); } }
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) } ); }
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; } }
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)); }
// 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; }
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)); }