public override void ApplyFilter(DirectXCanvas canvas, ThreadScroll scroll, HashSet <EventDescription> descriptions) { Filter = EventFilter.Create(EventData, descriptions); if (Filter != null) { DynamicMesh builder = canvas.CreateMesh(); foreach (EventFrame frame in EventData.Events) { Interval interval = scroll.TimeToUnit(frame.Header); builder.AddRect(new Rect(interval.Left, 0.0, interval.Width, 1.0), FilterFrameColor); } foreach (Entry entry in Filter.Entries) { Interval interval = scroll.TimeToUnit(entry); builder.AddRect(new Rect(interval.Left, 0.0, interval.Width, 1.0), FilterEntryColor); } SharpDX.Utilities.Dispose(ref FilterMesh); FilterMesh = builder.Freeze(canvas.RenderDevice); //if (FilterMesh != null) // FilterMesh.UseAlpha = true; } else { SharpDX.Utilities.Dispose(ref FilterMesh); } }
public void DynamicMeshCheck() { dynamicTrackMesh = new DynamicMesh(); dynamicBoundaryMesh = new DynamicMesh(); dynamicOffroadMesh = new DynamicMesh(); dynamicBumperMesh = new DynamicMesh(); dynamicColliderMesh = new DynamicMesh(); }
void Awake() { gameObject.AddComponent <MeshRenderer>().material = material; mesh = new DynamicMesh(4); gameObject.AddComponent <MeshFilter>().mesh = mesh; }
public DynamicMesh GetAllMesh(int x, int y, int z) { DynamicMesh TempMesh = new DynamicMesh(); TempMesh.Add(m_LeftToRight.GetTransMesh(x, y, z)); TempMesh.Add(m_FrontToBack.GetTransMesh(x, y, z)); return(TempMesh); }
protected void Start() { var hexGridSurface = RectangularHexGrid.Create( HexGridDescriptor.CreateSideUp(true, HexGridAxisStyles.StaggeredSymmetric), Vector3.zero, Quaternion.Euler(90f, 0f, 0f), false, false, new IntVector2(topologyWidth, topologyHeight)); _surface = hexGridSurface; Vector3[] vertexPositionsArray; _topology = hexGridSurface.CreateManifold(out vertexPositionsArray); _vertexPositions = vertexPositionsArray.AsVertexAttribute(); _facePositions = FaceAttributeUtility.CalculateFaceCentroidsFromVertexPositions(_topology.internalFaces, _vertexPositions); _faceCornerBisectors = EdgeAttributeUtility.CalculateFaceEdgeBisectorsFromVertexPositions(_topology.internalFaces, _vertexPositions, _facePositions); _faceBlockedStates = new bool[_topology.internalFaces.Count].AsFaceAttribute(); var triangulation = new SeparatedFacesUmbrellaTriangulation(2, (Topology.FaceEdge edge, DynamicMesh.IIndexedVertexAttributes vertexAttributes) => { vertexAttributes.position = _vertexPositions[edge]; vertexAttributes.normal = Vector3.up; vertexAttributes.color = borderColor; vertexAttributes.Advance(); vertexAttributes.position = _vertexPositions[edge] + _faceCornerBisectors[edge] * 0.05f; vertexAttributes.normal = (vertexAttributes.position + Vector3.up - _facePositions[edge.nearFace]).normalized; vertexAttributes.color = normalColor; vertexAttributes.Advance(); }, (Topology.Face face, DynamicMesh.IIndexedVertexAttributes vertexAttributes) => { vertexAttributes.position = _facePositions[face]; vertexAttributes.normal = Vector3.up; vertexAttributes.color = normalColor; vertexAttributes.Advance(); }); _dynamicMesh = DynamicMesh.Create( _topology.enumerableInternalFaces, DynamicMesh.VertexAttributes.Position | DynamicMesh.VertexAttributes.Normal | DynamicMesh.VertexAttributes.Color, triangulation); foreach (var mesh in _dynamicMesh.submeshes) { var meshFilter = Instantiate(submeshPrefab); meshFilter.mesh = mesh; meshFilter.transform.SetParent(transform, false); } var partioning = UniversalFaceSpatialPartitioning.Create(_surface, _topology, _vertexPositions); var picker = GetComponent <FaceSpatialPartitioningPicker>(); picker.partitioning = partioning; }
public override void OnInspectorGUI() { serializedObject.ApplyModifiedProperties(); DynamicMesh EditingMesh = MeshInfo.Mesh; if (GUILayout.Button("Make Front Mesh", GUILayout.Width(200))) { EditingMesh.Clear(); EditingMesh.AddQuad(new Vector3(1, 0, 1), new Vector3(1, 1, 1), new Vector3(0, 1, 1), new Vector3(0, 0, 1)); } if (GUILayout.Button("Make Back Mesh", GUILayout.Width(200))) { EditingMesh.Clear(); EditingMesh.AddQuad(new Vector3(0, 0, 0), new Vector3(0, 1, 0), new Vector3(1, 1, 0), new Vector3(1, 0, 0)); } if (GUILayout.Button("Make Up Mesh", GUILayout.Width(200))) { EditingMesh.Clear(); EditingMesh.AddQuad(new Vector3(0, 1, 0), new Vector3(0, 1, 1), new Vector3(1, 1, 1), new Vector3(1, 1, 0)); } if (GUILayout.Button("Make Down Mesh", GUILayout.Width(200))) { EditingMesh.Clear(); EditingMesh.AddQuad(new Vector3(0, 0, 1), new Vector3(0, 0, 0), new Vector3(1, 0, 0), new Vector3(1, 0, 1)); } if (GUILayout.Button("Make Left Mesh", GUILayout.Width(200))) { EditingMesh.Clear(); EditingMesh.AddQuad(new Vector3(0, 0, 1), new Vector3(0, 1, 1), new Vector3(0, 1, 0), new Vector3(0, 0, 0)); } if (GUILayout.Button("Make Right Mesh", GUILayout.Width(200))) { EditingMesh.Clear(); EditingMesh.AddQuad(new Vector3(1, 0, 0), new Vector3(1, 1, 0), new Vector3(1, 1, 1), new Vector3(1, 0, 1)); } if (GUILayout.Button("Make Left-Right Slice Mesh", GUILayout.Width(200))) { EditingMesh.Clear(); EditingMesh.AddQuad(new Vector3(1, 0, 0.5f), new Vector3(1, 1, 0.5f), new Vector3(0, 1, 0.5f), new Vector3(0, 0, 0.5f)); EditingMesh.AddQuad(new Vector3(0, 0, 0.5f), new Vector3(0, 1, 0.5f), new Vector3(1, 1, 0.5f), new Vector3(1, 0, 0.5f)); } if (GUILayout.Button("Make Front-Back Slice Mesh", GUILayout.Width(200))) { EditingMesh.Clear(); EditingMesh.AddQuad(new Vector3(0.5f, 0, 1), new Vector3(0.5f, 1, 1), new Vector3(0.5f, 1, 0), new Vector3(0.5f, 0, 0)); EditingMesh.AddQuad(new Vector3(0.5f, 0, 0), new Vector3(0.5f, 1, 0), new Vector3(0.5f, 1, 1), new Vector3(0.5f, 0, 1)); } GUILayout.Space(20); base.OnInspectorGUI(); EditorUtility.SetDirty(MeshInfo); }
public override void Start() { base.Start(); m_audioCmpBallLaunch = new AudioComponent("Audio/Sounds.lua::BallShot"); Owner.Attach(m_audioCmpBallLaunch); Sprite sprite1 = Sprite.Create("Graphics/LauncherCentralShield.lua::Sprite"); sprite1.SetAnimation("Normal"); sprite1.Alpha = 0; m_spriteCmp1 = new SpriteComponent(sprite1, "ArenaOverlay5"); m_spriteCmp1.Visible = false; sprite1.Playing = true; m_spriteCmp1.Sprite.Scale = new Vector2(m_scale, m_scale); Owner.Attach(m_spriteCmp1); Sprite sprite2 = Sprite.Create("Graphics/LauncherCentralShield.lua::Sprite2"); sprite2.SetAnimation("Normal"); sprite2.Alpha = 0; m_spriteCmp2 = new SpriteComponent(sprite2, "ArenaOverlay5"); m_spriteCmp2.Visible = false; sprite2.Playing = true; Owner.Attach(m_spriteCmp2); var basicEffect = new BasicEffect(Engine.Renderer.Device); basicEffect.LightingEnabled = false; basicEffect.VertexColorEnabled = true; basicEffect.FogEnabled = false; m_effect = new EffectWrapper(basicEffect); int capacity = 512 * 512 * 4; m_lineMesh = new DynamicMesh <VertexPositionColor>(Engine.Renderer.Device, VertexPositionColor.VertexDeclaration, PrimitiveType.LineList, capacity); m_triangleMesh = new DynamicMesh <VertexPositionColor>(Engine.Renderer.Device, VertexPositionColor.VertexDeclaration, PrimitiveType.TriangleList, capacity); Engine.Renderer.RenderLayers["ArenaOverlay7"].Renderables.Add(this); m_chargeTimerMS = new Timer(Engine.GameTime.Source, 2000); m_chargeTimerMS.OnTime += m_chargeTimerMS_OnTime; m_maxChargeTimerMS = new Timer(Engine.GameTime.Source, 300); m_maxChargeTimerMS.OnTime += m_maxChargeTimerMS_OnTime; m_chargedMax = false; m_launcherTeam = new List <Player>(); m_shield = new LauncherShield(this); Owner.Attach(m_shield); }
public DynamicMesh GetAllMesh(int x, int y, int z) { DynamicMesh TempMesh = new DynamicMesh(); TempMesh.Add(GetUpMesh(x, y, z)); TempMesh.Add(GetDownMesh(x, y, z)); TempMesh.Add(GetLeftMesh(x, y, z)); TempMesh.Add(GetRightMesh(x, y, z)); TempMesh.Add(GetFrontMesh(x, y, z)); TempMesh.Add(GetBackMesh(x, y, z)); return(TempMesh); }
public Layer(World world, int z) { this.world = world; this.mapCells = new MapCell[world.Size * world.Size]; this.zLevel = z; this.visibleMesh = new DynamicMesh<VertexPositionColorNormal>(world.Device); this.hiddenMesh = new DynamicMesh<VertexPositionColorNormal>(world.Device); this.texture = new Texture2D(world.Device, world.Size, world.Size); var texData = new Color[world.Size * world.Size]; for (var i = 0; i < world.Size; i++) texData[i] = Color.Yellow; this.texture.SetData(texData); }
//a==dirt public static void DirtToGrass(DynamicMesh mesh, RenderTile a, RenderTile b, RenderTile c) { Vector3 abMid = (a.position + b.position) * 0.5f; Vector3 acMid = (a.position + c.position) * 0.5f; Vector3 abGround = new Vector3(abMid.x, a.position.y, abMid.z); Vector3 acGround = new Vector3(acMid.x, a.position.y, acMid.z); mesh.SimpleTriangle(a.position, abGround, acGround, a.color, a.color, a.color, a.normal, a.normal, a.normal); mesh.SimpleTriangle(acGround, abGround, abMid, a.color, a.color, b.color, c.normal, b.normal, b.normal); mesh.SimpleTriangle(acGround, abMid, acMid, a.color, b.color, c.color, c.normal, b.normal, c.normal); mesh.SimpleTriangle(acMid, abMid, b.position, c.color, b.color, b.color, c.normal, b.normal, b.normal); mesh.SimpleTriangle(acMid, b.position, c.position, c.color, b.color, c.color, c.normal, b.normal, c.normal); }
private static void OnSourceChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) { VertexManipulator instance = (VertexManipulator)obj; DynamicMesh newMesh = (DynamicMesh)args.NewValue; DynamicMesh oldMesh = (DynamicMesh)args.OldValue; if (oldMesh != null) { instance.UnregisterSource(oldMesh); } if (newMesh != null) { instance.RegisterSource(); } }
public override void Start() { var basicEffect = new BasicEffect(Engine.Renderer.Device); basicEffect.LightingEnabled = false; basicEffect.VertexColorEnabled = true; basicEffect.FogEnabled = false; m_fadeOutTimer = new Timer(Engine.GameTime.Source, 300, TimerBehaviour.Stop); m_fadeOutTimerEvent = new TimerEvent(m_fadeOutTimer_OnTime); m_fadeOutTimer.OnTime += m_fadeOutTimerEvent; m_effect = new EffectWrapper(basicEffect); m_mesh = new DynamicMesh <VertexPositionColor>(Engine.Renderer.Device, VertexPositionColor.VertexDeclaration, Microsoft.Xna.Framework.Graphics.PrimitiveType.TriangleList, 2048); Engine.Renderer.RenderLayers["ArenaOverlay7"].Renderables.Add(this); }
public DebugScreen() { int capacity = 1024 * 1024 * 4; m_lineMesh = new DynamicMesh <VertexPositionColor>(Engine.Renderer.Device, VertexPositionColor.VertexDeclaration, PrimitiveType.LineList, capacity); m_triangleMesh = new DynamicMesh <VertexPositionColor>(Engine.Renderer.Device, VertexPositionColor.VertexDeclaration, PrimitiveType.TriangleList, capacity); m_texts = new List <TextEntry>(); ResetBrush(); var basicEffect = new BasicEffect(Engine.Renderer.Device); basicEffect.LightingEnabled = false; basicEffect.VertexColorEnabled = true; basicEffect.FogEnabled = false; m_effect = new EffectWrapper(basicEffect); }
void Start() { mesh = GetComponent<DynamicMesh>(); var profile = new MeshData(); profile.Vertices.AddRange(new Vector3[] { new Vector3(0.1f, 0.1f, 0), new Vector3(-0.1f, 0.1f, 0), new Vector3(-0.1f, -0.1f, 0), new Vector3(0.1f, -0.1f, 0) }); source = new MeshData(); source.Vertices.AddRange(Path.Select(i => i.position)); mesh.SourceMesh = source; mesh.Modifiers.Add(new ExtrudeAlongPathModifier() { Profile = profile }); mesh.UpdateMesh(); }
private static void ExportCollider(TrackBuildR data) { DynamicMesh COL_MESH = new DynamicMesh(); // COL_MESH.subMeshCount = data.textures.Count; // BuildrBuildingCollider.Build(COL_MESH, data); // COL_MESH.CollapseSubmeshes(); COL_MESH.Build(); ExportMaterial[] exportTextures = new ExportMaterial[1]; ExportMaterial newTexture = new ExportMaterial(); newTexture.name = "blank"; newTexture.filepath = ""; newTexture.generated = true; exportTextures[0] = newTexture; int numberOfColliderMeshes = COL_MESH.meshCount; Mesh[] meshes = COL_MESH.meshes; for (int i = 0; i < numberOfColliderMeshes; i++) { MeshUtility.Optimize(meshes[i]); string ColliderSuffixIndex = ((numberOfColliderMeshes > 1) ? "_" + i : ""); string ColliderFileName = data.exportFilename + COLLIDER_SUFFIX + ColliderSuffixIndex; string ColliderFolder = ROOT_FOLDER + data.exportFilename + "/"; Export(ColliderFileName, ColliderFolder, data, meshes[i], exportTextures); } //string newDirectory = rootFolder+track.exportFilename; //if(!CreateFolder(newDirectory)) // return; // ExportMaterial[] exportTextures = new ExportMaterial[1]; // ExportMaterial newTexture = new ExportMaterial(); // newTexture.customName = ""; // newTexture.filepath = ""; // newTexture.generated = true; // exportTextures[0] = newTexture; // Export(track.exportFilename + COLLIDER_SUFFIX, ROOT_FOLDER + track.exportFilename + "/", track, EXPORT_MESH, exportTextures); // // COL_MESH = null; // EXPORT_MESH = null; }
void Awake() { pos = (float[])startPos.Clone(); vel = new float[4]; lat = new bool[4]; GameObject obj = gameObject; trans = obj.GetComponent <Transform>(); rend = obj.GetComponent <MeshRenderer>(); coll = obj.GetComponent <MeshCollider>(); mesh = obj.GetComponent <DynamicMesh>(); startLoc = trans.position; mesh.InitializeBox(pos, startLoc); state = PlatformState.STILL; }
public override void Start() { //Initialise SpriteComponent base.Start(); m_effect = ColorMaskingEffect.Create("Graphics/Shaders/ColorMasking.fx"); m_quadMesh = new DynamicMesh <VertexPositionTexture>(Engine.Renderer.Device, VertexPositionTexture.VertexDeclaration, PrimitiveType.TriangleStrip, 12); m_quadMesh.Vertex(new VertexPositionTexture(new Vector3(-1, +1, 0), new Vector2(0, 0))); m_quadMesh.Vertex(new VertexPositionTexture(new Vector3(+1, +1, 0), new Vector2(1, 0))); m_quadMesh.Vertex(new VertexPositionTexture(new Vector3(-1, -1, 0), new Vector2(0, 1))); m_quadMesh.Vertex(new VertexPositionTexture(new Vector3(+1, -1, 0), new Vector2(1, 1))); m_quadMesh.Index(0); m_quadMesh.Index(1); m_quadMesh.Index(2); m_quadMesh.Index(3); m_quadMesh.PrepareDraw(); }
public override void Build(IGroup group, DXCanvas canvas) { DynamicMesh meshBuilder = canvas.CreateMesh(DXCanvas.MeshType.Tris); DynamicMesh lineBuilder = canvas.CreateMesh(DXCanvas.MeshType.Lines); double duration = (group.Finish - group.Start).TotalSeconds; ILine line = DataContext; double maxValue = line.Points.Max(p => p.Value); List <Point> points = line.Points.ConvertAll(p => new Point((p.Key - group.Start).TotalSeconds / duration, 1.0 - p.Value / maxValue)); for (int i = 0; i < points.Count - 1; ++i) { lineBuilder.AddLine(points[i], points[i + 1], line.StrokeColor); } Mesh = meshBuilder.Freeze(canvas.RenderDevice); Lines = lineBuilder.Freeze(canvas.RenderDevice); }
// Use this for initialization void Start() { levelBounds = new GameObject[numPlayers]; GameObject go = new GameObject("Mesh"); dynamicMesh = go.AddComponent <DynamicMesh> (); dynamicMesh.transform.parent = transform; InitializeSpawnPoints(); InitializeLevelBounds(); LoadEnvironment(environment); cam = orthoCam.GetComponent <Camera> (); cam.orthographicSize = maxOrthographicSize; EnterEditMode(); ToggleObjects(isShowingObjects); ChangeTool(Tool.BRUSH); }
/// <summary> /// Creates a new instance of the visualizer /// </summary> /// <param name="renderContext"></param> /// <param name="inputData"></param> /// <param name="isoLevel"></param> public VisualizerBackgroundWorker(IRenderContext renderContext, IInputData inputData, int isoLevel) { _inputData = inputData; _isoLevel = isoLevel; _backgroundWorker = new BackgroundWorker(); _backgroundWorker.DoWork += MarchCube; _backgroundWorker.RunWorkerCompleted += CubeMarched; _mesh1 = renderContext.MeshCreator.CreateDynamicMesh(PrimitiveType.TriangleList, typeof(VertexPositionNormal), VertexPositionNormal.VertexDeclaration, DynamicMeshUsage.UpdateOften); _mesh2 = renderContext.MeshCreator.CreateDynamicMesh(PrimitiveType.TriangleList, typeof(VertexPositionNormal), VertexPositionNormal.VertexDeclaration, DynamicMeshUsage.UpdateOften); _vertices = new List <VertexPositionNormal>(); _marchingCubesAlgorithm = new MarchingCubesAlgorithm(false); // setup our indices so we don't have to recheck everytime we need this info // technically the marching cube algorithm will run over all cubes, but we will skip all that have 0 as a value // precalculate all the indices where data exists var data = new List <int>(); for (int z = 0; z < _inputData.ZLength - 1; z++) { for (int y = 0; y < _inputData.YLength - 1; y++) { for (int x = 0; x < _inputData.XLength - 1; x++) { // skipping doesn't work because it will skip edge cases such as flat surfaces // -> the cube doesn't have any data in it, but is next to one that does -> marching cubes will insert flat pane // if we skip it the final result will contain missing parts //if (_inputData[x, y, z] > 0) { var index = x + _inputData.XLength * (y + z * _inputData.YLength); data.Add(index); } } } } _filledDataIndices = data.ToArray(); _primitiveCountPerDataPoint = new int[_filledDataIndices.Length]; }
public void DynamicMeshCheck() { if (dynamicTrackMesh == null) { dynamicTrackMesh = new DynamicMesh(); } if (dynamicBoundaryMesh == null) { dynamicBoundaryMesh = new DynamicMesh(); } if (dynamicOffroadMesh == null) { dynamicOffroadMesh = new DynamicMesh(); } if (dynamicBumperMesh == null) { dynamicBumperMesh = new DynamicMesh(); } if (dynamicColliderMesh1 == null) { dynamicColliderMesh1 = new DynamicMesh(); } if (dynamicColliderMesh2 == null) { dynamicColliderMesh2 = new DynamicMesh(); } if (dynamicColliderMesh3 == null) { dynamicColliderMesh3 = new DynamicMesh(); } if (dynamicColliderMesh4 == null) { dynamicColliderMesh4 = new DynamicMesh(); } if (dynamicBottomMesh == null) { dynamicBottomMesh = new DynamicMesh(); } }
public ThreadView() { InitializeComponent(); scrollBar.Visibility = Visibility.Collapsed; ThreadToolsPanel.Visibility = Visibility.Collapsed; search.DelayedTextChanged += new SearchBox.DelayedTextChangedEventHandler(Search_DelayedTextChanged); surface.SizeChanged += new SizeChangedEventHandler(ThreadView_SizeChanged); surface.OnDraw += OnDraw; InitInputEvent(); InitColors(); SelectionMesh = surface.CreateMesh(); SelectionMesh.Projection = Mesh.ProjectionType.Pixel; SelectionMesh.Geometry = Mesh.GeometryType.Lines; HoverMesh = surface.CreateMesh(); HoverMesh.Projection = Mesh.ProjectionType.Pixel; HoverMesh.Geometry = Mesh.GeometryType.Lines; }
public void InitForegroundLines(List <ITick> lines) { if (ForegroundMesh != null) { ForegroundMesh.Dispose(); } DynamicMesh builder = surface.CreateMesh(); builder.Geometry = Mesh.GeometryType.Lines; // Adding Frame separators if (lines != null) { foreach (ITick line in lines) { double x = Scroll.TimeToUnit(line); builder.AddLine(new Point(x, 0.0), new Point(x, 1.0), OptickAlternativeBackground.Color); } } ForegroundMesh = builder.Freeze(surface.RenderDevice); }
private void CreateMesh(IEnumerable <Topology.Face> faces, DynamicMesh.ITriangulation triangulation, MeshFilter meshPrefab) { var dynamicMesh = DynamicMesh.Create( faces, DynamicMesh.VertexAttributes.Position | DynamicMesh.VertexAttributes.Normal | DynamicMesh.VertexAttributes.UV, triangulation); int existingChildren = transform.childCount; for (int i = 0; i < existingChildren; ++i) { Destroy(transform.GetChild(i).gameObject); } foreach (var submesh in dynamicMesh.submeshes) { var meshObject = Instantiate(meshPrefab); meshObject.mesh = submesh; meshObject.transform.SetParent(transform, false); } }
private void DestroyOldGame() { if (_surface == null) { return; } var existingMeshCount = gameBoardMeshes.childCount; for (int i = 0; i < existingMeshCount; ++i) { Destroy(gameBoardMeshes.GetChild(i).gameObject); } foreach (var face in _topology.internalFaces) { if (_facePieces[face] != null) { Destroy(_facePieces[face].gameObject); } } _surface = null; _topology = null; _vertexPositions = null; _facePositions = null; _innerAngleBisectors = null; _facePieces = null; _faceBoardStates = null; _partitioning = null; _dynamicMesh = null; _picker.partitioning = null; _picker.enabled = false; _gameActive = false; }
private static void ExportModel(TrackBuildR track) { GameObject baseObject = new GameObject(track.exportFilename); baseObject.transform.position = CURRENT_TRANSFORM.position; baseObject.transform.rotation = CURRENT_TRANSFORM.rotation; EditorUtility.DisplayCancelableProgressBar(PROGRESSBAR_TEXT, "", 0.0f); track.ForceFullRecalculation(); EditorUtility.DisplayCancelableProgressBar(PROGRESSBAR_TEXT, "", 0.1f); try { TrackBuildRTrack trackData = track.track; //check overwrites... string newDirectory = ROOT_FOLDER + track.exportFilename; if (!CreateFolder(newDirectory)) { EditorUtility.ClearProgressBar(); return; } EditorUtility.DisplayCancelableProgressBar(PROGRESSBAR_TEXT, "", 0.15f); int numberOfCurves = trackData.numberOfCurves; int numberOfDynMeshes = 9; float exportProgress = 0.75f / (numberOfCurves * numberOfDynMeshes); ExportMaterial[] exportMaterials = new ExportMaterial[1]; ExportMaterial exportTexture = new ExportMaterial(); TrackBuildRTexture[] textures = trackData.GetTexturesArray(); int textureCount = textures.Length; Material[] materials = new Material[textureCount]; for (int t = 0; t < textureCount; t++) { TrackBuildRTexture texture = textures[t]; if (!texture.isSubstance && !texture.isUSer) { string materialPath = string.Format("{0}{1}/{2}.mat", ROOT_FOLDER, track.exportFilename, texture.customName); if (File.Exists(materialPath)) { Material mat = (Material)AssetDatabase.LoadAssetAtPath(materialPath, typeof(Material)); EditorUtility.CopySerialized(texture.material, mat); AssetDatabase.SaveAssets(); materials[t] = mat; continue; } Material tempMat = Object.Instantiate(texture.material); AssetDatabase.CreateAsset(tempMat, materialPath); materials[t] = (Material)AssetDatabase.LoadAssetAtPath(materialPath, typeof(Material)); } else { materials[t] = texture.isUSer ? texture.userMaterial : texture.proceduralMaterial; } } string[] dynNames = { "track", "bumper", "boundary", "bottom", "offroad", "trackCollider" }; string[] colliderNames = { "track collider", "wall collider", "offroad collider", "bumper collider" }; for (int c = 0; c < numberOfCurves; c++) { TrackBuildRPoint curve = trackData[c]; DynamicMesh[] dynMeshes = new DynamicMesh[numberOfDynMeshes]; dynMeshes[0] = curve.dynamicTrackMesh; dynMeshes[1] = curve.dynamicBumperMesh; dynMeshes[2] = curve.dynamicBoundaryMesh; dynMeshes[3] = curve.dynamicBottomMesh; dynMeshes[4] = curve.dynamicOffroadMesh; dynMeshes[5] = curve.dynamicColliderMesh1; //track surface dynMeshes[6] = curve.dynamicColliderMesh2; //walls and roof dynMeshes[7] = curve.dynamicColliderMesh3; //track bottom and offroad dynMeshes[8] = curve.dynamicColliderMesh4; //bumpers int[] textureIndeices = { curve.trackTextureStyleIndex, curve.bumperTextureStyleIndex, curve.boundaryTextureStyleIndex, curve.bottomTextureStyleIndex, curve.offroadTextureStyleIndex, 0 }; PhysicMaterial[] physicMaterials = { trackData.Texture(curve.trackTextureStyleIndex).physicMaterial, trackData.Texture(curve.boundaryTextureStyleIndex).physicMaterial, trackData.Texture(curve.offroadTextureStyleIndex).physicMaterial, trackData.Texture(curve.bumperTextureStyleIndex).physicMaterial }; for (int d = 0; d < numberOfDynMeshes; d++) { int textureIndex = Mathf.Clamp(d, 0, 5); if (EditorUtility.DisplayCancelableProgressBar(PROGRESSBAR_TEXT, "Exporting Track Curve " + c + " " + dynNames[textureIndex], 0.15f + exportProgress * (c * numberOfDynMeshes + d))) { EditorUtility.ClearProgressBar(); return; } DynamicMesh exportDynMesh = dynMeshes[d]; // if(track.includeTangents || exportDynMesh.isEmpty) // exportDynMesh.Build();//rebuild with tangents TrackBuildRTexture texture = trackData.Texture(textureIndeices[textureIndex]); exportTexture.name = texture.customName; exportTexture.material = texture.material; exportTexture.generated = false; exportTexture.filepath = texture.filePath; exportMaterials[0] = exportTexture; Material mat = materials[textureIndeices[textureIndex]]; int meshCount = exportDynMesh.meshCount; Mesh[] meshes = exportDynMesh.meshes; for (int i = 0; i < meshCount; i++) { Mesh exportMesh = meshes[i]; MeshUtility.Optimize(exportMesh); string filenameSuffix = trackModelName(dynNames[textureIndex], c, (meshCount > 1) ? i : -1); // "trackCurve" + c + ((meshCount > 1) ? "_" + i.ToString() : ""); if (d > 4) //colliders { filenameSuffix = string.Format("{0}_{1}", filenameSuffix, (d % 5)); } string filename = track.exportFilename + filenameSuffix; Export(filename, ROOT_FOLDER + track.exportFilename + "/", track, exportMesh, exportMaterials); if (track.createPrefabOnExport) { AssetDatabase.Refresh();//ensure the database is up to date... string modelFilePath = ROOT_FOLDER + track.exportFilename + "/" + filename + FILE_EXTENTION; if (d < numberOfDynMeshes - 4) { GameObject newModel = (GameObject)PrefabUtility.InstantiatePrefab(AssetDatabase.LoadMainAssetAtPath(modelFilePath)); newModel.name = filename; newModel.transform.parent = baseObject.transform; newModel.transform.localPosition = Vector3.zero; newModel.transform.localRotation = Quaternion.identity; MeshRenderer[] renders = newModel.GetComponentsInChildren <MeshRenderer>(); foreach (MeshRenderer rend in renders) { rend.material = mat; } } else { int colliderIndex = d - (numberOfDynMeshes - 4); GameObject colliderObject = new GameObject(colliderNames[colliderIndex]); MeshCollider collider = colliderObject.AddComponent <MeshCollider>(); collider.sharedMesh = (Mesh)AssetDatabase.LoadAssetAtPath(modelFilePath, typeof(Mesh)); collider.material = physicMaterials[colliderIndex]; colliderObject.transform.parent = baseObject.transform; colliderObject.transform.localPosition = Vector3.zero; colliderObject.transform.localRotation = Quaternion.identity; } } } } } if (track.createPrefabOnExport) { string prefabPath = ROOT_FOLDER + track.exportFilename + "/" + track.exportFilename + ".prefab"; Object prefab = AssetDatabase.LoadAssetAtPath(prefabPath, typeof(GameObject)); if (prefab == null) { prefab = PrefabUtility.CreateEmptyPrefab(prefabPath); } PrefabUtility.ReplacePrefab(baseObject, prefab, ReplacePrefabOptions.ConnectToPrefab); } EditorUtility.DisplayCancelableProgressBar(PROGRESSBAR_TEXT, "", 0.70f); AssetDatabase.Refresh();//ensure the database is up to date... } catch (System.Exception e) { Debug.LogError("Track BuildR Export Error: " + e); EditorUtility.ClearProgressBar(); AssetDatabase.Refresh();//ensure the database is up to date... } Object.DestroyImmediate(baseObject); EditorUtility.ClearProgressBar(); EditorUtility.UnloadUnusedAssetsImmediate(); AssetDatabase.Refresh(); }
void InitThreadList(FrameGroup group) { rows.Clear(); id2row.Clear(); ThreadList.RowDefinitions.Clear(); ThreadList.Children.Clear(); if (group == null) { return; } rows.Add(new HeaderThreadRow(group) { GradientTop = Colors.LightGray, GradientBottom = Colors.Gray, SplitLines = Colors.White, TextColor = Colors.Black }); for (int i = 0; i < Math.Min(group.Board.Threads.Count, group.Threads.Count); ++i) { ThreadDescription thread = group.Board.Threads[i]; ThreadData data = group.Threads[i]; bool threadHasData = false; if ((data.Callstacks != null && data.Callstacks.Count > 3) || /*(data.Sync != null && data.Sync.Intervals.Count > 0) || */ (data.Events != null && data.Events.Count > 0)) { threadHasData = true; } if (threadHasData) { EventsThreadRow row = new EventsThreadRow(group, thread, data); rows.Add(row); id2row.Add(i, row); row.EventNodeHover += Row_EventNodeHover; row.EventNodeSelected += Row_EventNodeSelected; } } scroll.TimeSlice = group.Board.TimeSlice; scroll.Height = 0.0; scroll.Width = surface.ActualWidth * RenderSettings.dpiScaleX; rows.ForEach(row => scroll.Height += row.Height); rows.ForEach(row => row.BuildMesh(surface, scroll)); ThreadList.Margin = new Thickness(0, 0, 3, 0); if (BackgroundMesh != null) { BackgroundMesh.Dispose(); } DynamicMesh backgroundBuilder = surface.CreateMesh(); double offset = 0.0; for (int threadIndex = 0; threadIndex < rows.Count; ++threadIndex) { ThreadRow row = rows[threadIndex]; row.Offset = offset; ThreadList.RowDefinitions.Add(new RowDefinition()); Thickness margin = new Thickness(0, 0, 0, 0); Label labelName = new Label() { Content = row.Name, Margin = margin, Padding = new Thickness(), FontWeight = FontWeights.Bold, Height = row.Height / RenderSettings.dpiScaleY, VerticalContentAlignment = VerticalAlignment.Center }; Grid.SetRow(labelName, threadIndex); if (threadIndex % 2 == 1) { labelName.Background = AlternativeBackground; backgroundBuilder.AddRect(new Rect(0.0, offset / scroll.Height, 1.0, row.Height / scroll.Height), AlternativeBackground.Color); } ThreadList.Children.Add(labelName); offset += row.Height; } BackgroundMesh = backgroundBuilder.Freeze(surface.RenderDevice); }
public void StartNewGame() { DestroyOldGame(); Vector3[] vertexPositionsArray; if (squaresToggle.isOn) { IntVector2 boardSize; if (smallToggle.isOn) { boardSize = new IntVector2(9, 9); } else if (mediumToggle.isOn) { boardSize = new IntVector2(13, 13); } else { boardSize = new IntVector2(19, 19); } _surface = RectangularQuadGrid.Create(Vector2.right, Vector2.up, Vector3.zero, Quaternion.identity, false, false, boardSize); _topology = ((RectangularQuadGrid)_surface).CreateManifold(out vertexPositionsArray); _vertexPositions = PositionalVertexAttribute.Create(_surface, vertexPositionsArray); } else if (hexesToggle.isOn) { IntVector2 boardSize; if (smallToggle.isOn) { boardSize = new IntVector2(9, 9); } else if (mediumToggle.isOn) { boardSize = new IntVector2(13, 13); } else { boardSize = new IntVector2(19, 19); } _surface = RectangularHexGrid.Create( HexGridDescriptor.CreateCornerUp(true, HexGridAxisStyles.StaggeredSymmetric), Vector3.zero, Quaternion.identity, false, false, boardSize); _topology = ((RectangularHexGrid)_surface).CreateManifold(out vertexPositionsArray); _vertexPositions = PositionalVertexAttribute.Create(_surface, vertexPositionsArray); } else { IntVector2 boardSize; if (smallToggle.isOn) { boardSize = new IntVector2(9, 9); } else if (mediumToggle.isOn) { boardSize = new IntVector2(13, 13); } else { boardSize = new IntVector2(19, 19); } _surface = RectangularHexGrid.Create( HexGridDescriptor.CreateCornerUp(true, HexGridAxisStyles.StaggeredSymmetric), Vector3.zero, Quaternion.identity, false, false, boardSize); _topology = ((RectangularHexGrid)_surface).CreateManifold(out vertexPositionsArray); _vertexPositions = PositionalVertexAttribute.Create(_surface, vertexPositionsArray); var regularityWeight = 0.5f; var equalAreaWeight = 1f - regularityWeight; var regularityRelaxedVertexPositions = new Vector3[_topology.vertices.Count].AsVertexAttribute(); var equalAreaRelaxedVertexPositions = new Vector3[_topology.vertices.Count].AsVertexAttribute(); var relaxedVertexPositions = regularityRelaxedVertexPositions; var faceCentroids = PositionalFaceAttribute.Create(_surface, _topology.internalFaces.Count); var vertexAreas = new float[_topology.vertices.Count].AsVertexAttribute(); FaceAttributeUtility.CalculateFaceCentroidsFromVertexPositions(_topology.internalFaces, _vertexPositions, faceCentroids); VertexAttributeUtility.CalculateVertexAreasFromVertexPositionsAndFaceCentroids(_topology.vertices, _vertexPositions, faceCentroids, vertexAreas); var totalArea = 0f; foreach (var vertexArea in vertexAreas) { totalArea += vertexArea; } Func <float> relaxIterationFunction = () => { PlanarManifoldUtility.RelaxVertexPositionsForRegularity(_topology, _vertexPositions, true, regularityRelaxedVertexPositions); PlanarManifoldUtility.RelaxVertexPositionsForEqualArea(_topology, _vertexPositions, totalArea, true, equalAreaRelaxedVertexPositions, faceCentroids, vertexAreas); for (int i = 0; i < relaxedVertexPositions.Count; ++i) { relaxedVertexPositions[i] = regularityRelaxedVertexPositions[i] * regularityWeight + equalAreaRelaxedVertexPositions[i] * equalAreaWeight; } var relaxationAmount = PlanarManifoldUtility.CalculateRelaxationAmount(_vertexPositions, relaxedVertexPositions); for (int i = 0; i < _vertexPositions.Count; ++i) { _vertexPositions[i] = relaxedVertexPositions[i]; } return(relaxationAmount); }; Func <bool> repairFunction = () => { return(PlanarManifoldUtility.ValidateAndRepair(_topology, _surface.normal, _vertexPositions, 0.5f, true)); }; Action relaxationLoopFunction = TopologyRandomizer.CreateRelaxationLoopFunction(20, 20, 0.95f, relaxIterationFunction, repairFunction); TopologyRandomizer.Randomize( _topology, 1, 0.1f, 3, 3, 5, 7, true, _random, relaxationLoopFunction); } _facePositions = PositionalFaceAttribute.Create(_surface, _topology.internalFaces.Count); FaceAttributeUtility.CalculateFaceCentroidsFromVertexPositions(_topology.internalFaces, _vertexPositions, _facePositions); _innerAngleBisectors = EdgeAttributeUtility.CalculateFaceEdgeBisectorsFromVertexPositions(_topology.internalFaces, PlanarSurface.Create(Vector3.zero, Quaternion.identity), _vertexPositions); _faceBoardStates = new BoardState[_topology.internalFaces.Count].AsFaceAttribute(); foreach (var face in _topology.internalFaces) { _faceBoardStates[face] = BoardState.Empty; } _facePieces = new Transform[_topology.internalFaces.Count].AsFaceAttribute(); _partitioning = UniversalFaceSpatialPartitioning.Create(_surface, _topology, _vertexPositions); _picker.partitioning = _partitioning; _picker.enabled = true; var centerVertexNormal = _surface.normal.normalized; var triangulation = new SeparatedFacesUmbrellaTriangulation(2, (Topology.FaceEdge edge, DynamicMesh.IIndexedVertexAttributes vertexAttributes) => { vertexAttributes.position = _vertexPositions[edge]; vertexAttributes.normal = (_vertexPositions[edge] + _surface.normal * 5f - _facePositions[edge.nearFace]).normalized; vertexAttributes.uv = new Vector2(0.25f, 0f); vertexAttributes.Advance(); vertexAttributes.position = _vertexPositions[edge] + _innerAngleBisectors[edge] * 0.05f; vertexAttributes.normal = (vertexAttributes.position + _surface.normal * 5f - _facePositions[edge.nearFace]).normalized; vertexAttributes.uv = new Vector2(0.25f, 0.5f); vertexAttributes.Advance(); }, (Topology.Face face, DynamicMesh.IIndexedVertexAttributes vertexAttributes) => { vertexAttributes.position = _facePositions[face]; vertexAttributes.normal = centerVertexNormal; vertexAttributes.uv = new Vector2(0.25f, 1f); vertexAttributes.Advance(); }); _dynamicMesh = DynamicMesh.Create( _topology.enumerableInternalFaces, DynamicMesh.VertexAttributes.Position | DynamicMesh.VertexAttributes.Normal | DynamicMesh.VertexAttributes.UV, triangulation); foreach (var mesh in _dynamicMesh.submeshes) { var meshObject = Instantiate(meshFilterRendererPrefab); meshObject.mesh = mesh; meshObject.transform.SetParent(gameBoardMeshes); } _gameBoardBounds = new Bounds(Vector3.zero, Vector3.zero); foreach (var vertex in _topology.vertices) { _gameBoardBounds.Encapsulate(_vertexPositions[vertex]); } AdjustCamera(); var pickerCollider = GetComponent <BoxCollider>(); pickerCollider.center = _gameBoardBounds.center; pickerCollider.size = _gameBoardBounds.size; _whiteCount = 0; _blackCount = 0; _moveCount = 0; whiteCountText.text = _whiteCount.ToString(); blackCountText.text = _blackCount.ToString(); _gameActive = true; _turn = BoardState.Black; }
internal void Build(IItem root, IItem item, double offset, DynamicMesh meshBuilder, DynamicMesh lineBuilder) { double duration = (root.Finish - root.Start).TotalSeconds; Rect rect = new Rect((item.Start - root.Start).TotalSeconds / duration, offset / MaxHeight, (item.Finish - item.Start).TotalSeconds / duration, item.BaseHeight / MaxHeight); if (!String.IsNullOrEmpty(item.Name)) { TextBlocks.Add(new TextEntry() { Text = item.Name, Position = rect.TopLeft, Width = rect.Width, }); } meshBuilder.AddRect(rect, item.Color); if (item.IsStroke) { lineBuilder.AddRect(rect, Colors.Black); } offset += item.BaseHeight; if (item.Children != null) { foreach (IItem child in item.Children) { Build(root, child, offset, meshBuilder, lineBuilder); } } }
private static void ExportModel(TrackBuildR track) { GameObject baseObject = new GameObject(track.exportFilename); baseObject.transform.position = CURRENT_TRANSFORM.position; baseObject.transform.rotation = CURRENT_TRANSFORM.rotation; EditorUtility.DisplayCancelableProgressBar(PROGRESSBAR_TEXT, "", 0.0f); track.ForceFullRecalculation(); EditorUtility.DisplayCancelableProgressBar(PROGRESSBAR_TEXT, "", 0.1f); try { TrackBuildRTrack trackData = track.track; //check overwrites... string newDirectory = ROOT_FOLDER + track.exportFilename; if(!CreateFolder(newDirectory)) { EditorUtility.ClearProgressBar(); return; } EditorUtility.DisplayCancelableProgressBar(PROGRESSBAR_TEXT, "", 0.15f); int numberOfCurves = trackData.numberOfCurves; int numberOfDynMeshes = 9; float exportProgress = 0.75f / (numberOfCurves * numberOfDynMeshes); ExportMaterial[] exportMaterials = new ExportMaterial[1]; ExportMaterial exportTexture = new ExportMaterial(); TrackBuildRTexture[] textures = trackData.GetTexturesArray(); int textureCount = textures.Length; Material[] materials = new Material[textureCount]; for (int t = 0; t < textureCount; t++) { TrackBuildRTexture texture = textures[t]; if (!texture.isSubstance && !texture.isUSer) { string materialPath = string.Format("{0}{1}/{2}.mat", ROOT_FOLDER, track.exportFilename, texture.customName); if(File.Exists(materialPath)) { Material mat = (Material)AssetDatabase.LoadAssetAtPath(materialPath, typeof(Material)); EditorUtility.CopySerialized(texture.material, mat); AssetDatabase.SaveAssets(); materials[t] = mat; continue; } Material tempMat = Object.Instantiate(texture.material); AssetDatabase.CreateAsset(tempMat, materialPath); materials[t] = (Material)AssetDatabase.LoadAssetAtPath(materialPath, typeof(Material)); } else { materials[t] = texture.isUSer ? texture.userMaterial : texture.proceduralMaterial; } } string[] dynNames = {"track","bumper","boundary","bottom","offroad","trackCollider"}; string[] colliderNames = { "track collider", "wall collider", "offroad collider", "bumper collider" }; for (int c = 0; c < numberOfCurves; c++) { TrackBuildRPoint curve = trackData[c]; DynamicMesh[] dynMeshes = new DynamicMesh[numberOfDynMeshes]; dynMeshes[0] = curve.dynamicTrackMesh; dynMeshes[1] = curve.dynamicBumperMesh; dynMeshes[2] = curve.dynamicBoundaryMesh; dynMeshes[3] = curve.dynamicBottomMesh; dynMeshes[4] = curve.dynamicOffroadMesh; dynMeshes[5] = curve.dynamicColliderMesh1;//track surface dynMeshes[6] = curve.dynamicColliderMesh2;//walls and roof dynMeshes[7] = curve.dynamicColliderMesh3;//track bottom and offroad dynMeshes[8] = curve.dynamicColliderMesh4;//bumpers int[] textureIndeices = { curve.trackTextureStyleIndex ,curve.bumperTextureStyleIndex, curve.boundaryTextureStyleIndex, curve.bottomTextureStyleIndex, curve.offroadTextureStyleIndex, 0}; PhysicMaterial[] physicMaterials = { trackData.Texture(curve.trackTextureStyleIndex).physicMaterial, trackData.Texture(curve.boundaryTextureStyleIndex).physicMaterial, trackData.Texture(curve.offroadTextureStyleIndex).physicMaterial, trackData.Texture(curve.bumperTextureStyleIndex).physicMaterial }; for (int d = 0; d < numberOfDynMeshes; d++) { int textureIndex = Mathf.Clamp(d, 0, 5); if (EditorUtility.DisplayCancelableProgressBar(PROGRESSBAR_TEXT, "Exporting Track Curve " + c + " " + dynNames[textureIndex], 0.15f + exportProgress * (c * numberOfDynMeshes + d))) { EditorUtility.ClearProgressBar(); return; } DynamicMesh exportDynMesh = dynMeshes[d]; // if(track.includeTangents || exportDynMesh.isEmpty) // exportDynMesh.Build();//rebuild with tangents TrackBuildRTexture texture = trackData.Texture(textureIndeices[textureIndex]); exportTexture.name = texture.customName; exportTexture.material = texture.material; exportTexture.generated = false; exportTexture.filepath = texture.filePath; exportMaterials[0] = exportTexture; Material mat = materials[textureIndeices[textureIndex]]; int meshCount = exportDynMesh.meshCount; Mesh[] meshes = exportDynMesh.meshes; for (int i = 0; i < meshCount; i++) { Mesh exportMesh = meshes[i]; MeshUtility.Optimize(exportMesh); string filenameSuffix = trackModelName(dynNames[textureIndex], c, (meshCount > 1) ? i : -1);// "trackCurve" + c + ((meshCount > 1) ? "_" + i.ToString() : ""); if(d > 4)//colliders filenameSuffix = string.Format("{0}_{1}", filenameSuffix, (d % 5)); string filename = track.exportFilename + filenameSuffix; Export(filename, ROOT_FOLDER + track.exportFilename + "/", track, exportMesh, exportMaterials); if(track.createPrefabOnExport) { AssetDatabase.Refresh();//ensure the database is up to date... string modelFilePath = ROOT_FOLDER + track.exportFilename + "/" + filename + FILE_EXTENTION; if(d < numberOfDynMeshes - 4) { GameObject newModel = (GameObject)PrefabUtility.InstantiatePrefab(AssetDatabase.LoadMainAssetAtPath(modelFilePath)); newModel.name = filename; newModel.transform.parent = baseObject.transform; newModel.transform.localPosition = Vector3.zero; newModel.transform.localRotation = Quaternion.identity; MeshRenderer[] renders = newModel.GetComponentsInChildren<MeshRenderer>(); foreach(MeshRenderer rend in renders) rend.material = mat; } else { int colliderIndex = d - (numberOfDynMeshes - 4); GameObject colliderObject = new GameObject(colliderNames[colliderIndex]); MeshCollider collider = colliderObject.AddComponent<MeshCollider>(); collider.sharedMesh = (Mesh)AssetDatabase.LoadAssetAtPath(modelFilePath, typeof(Mesh)); collider.material = physicMaterials[colliderIndex]; colliderObject.transform.parent = baseObject.transform; colliderObject.transform.localPosition = Vector3.zero; colliderObject.transform.localRotation = Quaternion.identity; } } } } } if(track.createPrefabOnExport) { string prefabPath = ROOT_FOLDER + track.exportFilename + "/" + track.exportFilename + ".prefab"; Object prefab = AssetDatabase.LoadAssetAtPath(prefabPath, typeof(GameObject)); if(prefab == null) prefab = PrefabUtility.CreateEmptyPrefab(prefabPath); PrefabUtility.ReplacePrefab(baseObject, prefab, ReplacePrefabOptions.ConnectToPrefab); } EditorUtility.DisplayCancelableProgressBar(PROGRESSBAR_TEXT, "", 0.70f); AssetDatabase.Refresh();//ensure the database is up to date... } catch(System.Exception e) { Debug.LogError("Track BuildR Export Error: "+e); EditorUtility.ClearProgressBar(); AssetDatabase.Refresh();//ensure the database is up to date... } Object.DestroyImmediate(baseObject); EditorUtility.ClearProgressBar(); EditorUtility.UnloadUnusedAssetsImmediate(); AssetDatabase.Refresh(); }
public void PrepareMesh() { if (opaqueMesh == null) opaqueMesh = new DynamicMesh<VertexPositionColorNormal>(_device); else opaqueMesh.Clear(); if (waterMesh == null) waterMesh = new DynamicMesh<VertexPositionColorNormal>(_device); else waterMesh.Clear(); }
public void DynamicMeshCheck() { if (dynamicTrackMesh == null) dynamicTrackMesh = new DynamicMesh(); if (dynamicBoundaryMesh == null) dynamicBoundaryMesh = new DynamicMesh(); if (dynamicOffroadMesh == null) dynamicOffroadMesh = new DynamicMesh(); if (dynamicBumperMesh == null) dynamicBumperMesh = new DynamicMesh(); if (dynamicColliderMesh1 == null) dynamicColliderMesh1 = new DynamicMesh(); if (dynamicColliderMesh2 == null) dynamicColliderMesh2 = new DynamicMesh(); if (dynamicColliderMesh3 == null) dynamicColliderMesh3 = new DynamicMesh(); if (dynamicColliderMesh4 == null) dynamicColliderMesh4 = new DynamicMesh(); if (dynamicBottomMesh == null) dynamicBottomMesh = new DynamicMesh(); }
protected void Start() { orbitalCamera.enabled = !isInverted; pivotalCamera.enabled = isInverted; exteriorLight.enabled = !isInverted; interiorLight.enabled = isInverted; _lightVector = (isInverted ? interiorLight : exteriorLight).transform.position; _lightAxis = Vector3.Cross(Vector3.Cross(Vector3.up, _lightVector), _lightVector); RenderSettings.ambientLight = new Color(0.3f, 0.4f, 0.5f); RenderSettings.ambientIntensity = 0.25f; RenderSettings.customReflection = whiteCubeMap; RenderSettings.reflectionIntensity = 0.125f; RenderSettings.defaultReflectionMode = UnityEngine.Rendering.DefaultReflectionMode.Custom; _picker = GetComponent <FaceSpatialPartitioningPicker>(); _surface = SphericalSurface.Create(Vector3.up, Vector3.right, 10f, isInverted); Vector3[] baseVertexPositionsArray; Topology baseTopology; SphericalManifoldUtility.CreateIcosahedron(_surface, out baseTopology, out baseVertexPositionsArray); Vector3[] vertexPositionsArray; SphericalManifoldUtility.Subdivide(_surface, baseTopology, baseVertexPositionsArray.AsVertexAttribute(), topologySubdivision, out _topology, out vertexPositionsArray); _vertexPositions = PositionalVertexAttribute.Create(_surface, vertexPositionsArray); SphericalManifoldUtility.MakeDual(_surface, _topology, _vertexPositions, out vertexPositionsArray); _vertexPositions = PositionalVertexAttribute.Create(_surface, vertexPositionsArray); var regularityWeight = 0.5f; var equalAreaWeight = 1f - regularityWeight; var regularityRelaxedVertexPositions = new Vector3[_topology.vertices.Count].AsVertexAttribute(); var equalAreaRelaxedVertexPositions = new Vector3[_topology.vertices.Count].AsVertexAttribute(); var relaxedVertexPositions = regularityRelaxedVertexPositions; var faceCentroids = PositionalFaceAttribute.Create(_surface, _topology.internalFaces.Count); var faceCentroidAngles = new float[_topology.faceEdges.Count].AsEdgeAttribute(); var vertexAreas = new float[_topology.vertices.Count].AsVertexAttribute(); FaceAttributeUtility.CalculateFaceCentroidsFromVertexPositions(_topology.internalFaces, _vertexPositions, faceCentroids); VertexAttributeUtility.CalculateVertexAreasFromVertexPositionsAndFaceCentroids(_topology.vertices, _vertexPositions, faceCentroids, vertexAreas); Func <float> relaxIterationFunction = () => { SphericalManifoldUtility.RelaxVertexPositionsForRegularity(_surface, _topology, _vertexPositions, true, regularityRelaxedVertexPositions); SphericalManifoldUtility.RelaxVertexPositionsForEqualArea(_surface, _topology, _vertexPositions, true, equalAreaRelaxedVertexPositions, faceCentroids, faceCentroidAngles, vertexAreas); for (int i = 0; i < relaxedVertexPositions.Count; ++i) { relaxedVertexPositions[i] = regularityRelaxedVertexPositions[i] * regularityWeight + equalAreaRelaxedVertexPositions[i] * equalAreaWeight; } var relaxationAmount = SphericalManifoldUtility.CalculateRelaxationAmount(_vertexPositions, relaxedVertexPositions); for (int i = 0; i < _vertexPositions.Count; ++i) { _vertexPositions[i] = relaxedVertexPositions[i]; } return(relaxationAmount); }; Func <bool> repairFunction = () => { return(SphericalManifoldUtility.ValidateAndRepair(_surface, _topology, _vertexPositions, 0.5f, true)); }; Action relaxationLoopFunction = TopologyRandomizer.CreateRelaxationLoopFunction(20, 20, 0.95f, relaxIterationFunction, repairFunction); TopologyRandomizer.Randomize( _topology, 1, 0.1f, 3, 3, 5, 7, true, _random, relaxationLoopFunction); _facePositions = PositionalFaceAttribute.Create(_surface, _topology.internalFaces.Count); FaceAttributeUtility.CalculateFaceCentroidsFromVertexPositions(_topology.internalFaces, _vertexPositions, _facePositions); _maximumFaceDistance = 0f; foreach (var edge in _topology.faceEdges) { var distance = Geometry.AngleBetweenVectors(_facePositions[edge.nearFace], _facePositions[edge.farFace]) * _surface.radius; _maximumFaceDistance = Mathf.Max(_maximumFaceDistance, distance); } _innerAngleBisectors = EdgeAttributeUtility.CalculateFaceEdgeBisectorsFromVertexPositions(_topology.internalFaces, _vertexPositions, _facePositions); _innerVertexPositions = new Vector3[_topology.faceEdges.Count].AsEdgeAttribute(); foreach (var edge in _topology.faceEdges) { _innerVertexPositions[edge] = _vertexPositions[edge] + _innerAngleBisectors[edge] * 0.03f; } _faceNormals = FaceAttributeUtility.CalculateFaceNormalsFromSurface(_topology.faces, _surface, _facePositions); _faceUVFrames = FaceAttributeUtility.CalculatePerFaceSphericalUVFramesFromFaceNormals(_topology.faces, _faceNormals, Quaternion.identity); _faceOuterEdgeUVs = EdgeAttributeUtility.CalculatePerFaceUnnormalizedUVsFromVertexPositions(_topology.faces, _vertexPositions, _faceUVFrames); _faceInnerEdgeUVs = EdgeAttributeUtility.CalculatePerFaceUnnormalizedUVsFromVertexPositions(_topology.faces, _innerVertexPositions, _faceUVFrames); _faceCenterUVs = FaceAttributeUtility.CalculateUnnormalizedUVsFromFacePositions(_topology.faces, _facePositions, _faceUVFrames); var faceMinUVs = new Vector2[_topology.faces.Count].AsFaceAttribute(); var faceRangeUVs = new Vector2[_topology.faces.Count].AsFaceAttribute(); FaceAttributeUtility.CalculateFaceEdgeMinAndRangeValues(_topology.faces, _faceOuterEdgeUVs, faceMinUVs, faceRangeUVs); foreach (var face in _topology.faces) { var uvMin = faceMinUVs[face]; var uvRange = faceRangeUVs[face]; var adjusted = AspectRatioUtility.Expand(new Rect(uvMin.x, uvMin.y, uvRange.x, uvRange.y), 1f); faceMinUVs[face] = adjusted.min; faceRangeUVs[face] = adjusted.size; } _faceOuterEdgeUVs = EdgeAttributeUtility.CalculatePerFaceUniformlyNormalizedUVsFromFaceUVMinAndRange(_topology.faces, faceMinUVs, faceRangeUVs, _faceOuterEdgeUVs); _faceInnerEdgeUVs = EdgeAttributeUtility.CalculatePerFaceUniformlyNormalizedUVsFromFaceUVMinAndRange(_topology.faces, faceMinUVs, faceRangeUVs, _faceInnerEdgeUVs); _faceCenterUVs = FaceAttributeUtility.CalculateUniformlyNormalizedUVsFromFaceUVMinAndRange(_topology.faces, faceMinUVs, faceRangeUVs, _faceCenterUVs); _partitioning = UniversalFaceSpatialPartitioning.Create(_surface, _topology, _vertexPositions); _picker.partitioning = _partitioning; _picker.enabled = true; _faceTerrainIndices = new int[_topology.faces.Count].AsFaceAttribute(); var terrainWeights = new int[] { grassWeight, waterWeight, desertWeight, mountainWeight }; int terrainWeightSum = 0; foreach (var weight in terrainWeights) { terrainWeightSum += weight; } var rootFaces = new List <Topology.Face>(); var rootFaceEdges = new List <Topology.FaceEdge>(); for (int regionIndex = 0; regionIndex < geographicalRegionCount; ++regionIndex) { Topology.Face face; do { face = _topology.internalFaces[_random.Index(_topology.internalFaces.Count)]; } while (rootFaces.Contains(face)); rootFaces.Add(face); foreach (var edge in face.edges) { rootFaceEdges.Add(edge); } _faceTerrainIndices[face] = _random.WeightedIndex(terrainWeights, terrainWeightSum); } TopologyVisitor.VisitFacesInRandomOrder(rootFaceEdges, (FaceEdgeVisitor visitor) => { _faceTerrainIndices[visitor.edge.farFace] = _faceTerrainIndices[visitor.edge.nearFace]; visitor.VisitInternalNeighborsExceptSource(); }, _random); _faceSeenStates = new bool[_topology.faces.Count].AsFaceAttribute(); _faceSightCounts = new int[_topology.faces.Count].AsFaceAttribute(); var triangulation = new SeparatedFacesUmbrellaTriangulation(2, (Topology.FaceEdge edge, DynamicMesh.IIndexedVertexAttributes vertexAttributes) => { var face = edge.nearFace; var faceNormal = _faceNormals[face]; var gridOverlayU = GetGridOverlayU(false, _faceSeenStates[face], _faceSightCounts[face]); vertexAttributes.position = _vertexPositions[edge]; vertexAttributes.normal = faceNormal; vertexAttributes.uv1 = AdjustSurfaceUV(_faceOuterEdgeUVs[edge], _faceTerrainIndices[face]); vertexAttributes.uv2 = new Vector2(gridOverlayU, 0f); vertexAttributes.Advance(); vertexAttributes.position = _innerVertexPositions[edge]; vertexAttributes.normal = faceNormal; vertexAttributes.uv1 = AdjustSurfaceUV(_faceInnerEdgeUVs[edge], _faceTerrainIndices[face]); vertexAttributes.uv2 = new Vector2(gridOverlayU, 0.5f); vertexAttributes.Advance(); }, (Topology.Face face, DynamicMesh.IIndexedVertexAttributes vertexAttributes) => { vertexAttributes.position = _facePositions[face]; vertexAttributes.normal = _faceNormals[face]; vertexAttributes.uv1 = AdjustSurfaceUV(_faceCenterUVs[face], _faceTerrainIndices[face]); vertexAttributes.uv2 = new Vector2(GetGridOverlayU(false, _faceSeenStates[face], _faceSightCounts[face]), 1f); vertexAttributes.Advance(); }); _dynamicMesh = DynamicMesh.Create( _topology.enumerableInternalFaces, DynamicMesh.VertexAttributes.Position | DynamicMesh.VertexAttributes.Normal | DynamicMesh.VertexAttributes.UV1 | DynamicMesh.VertexAttributes.UV2, triangulation); foreach (var mesh in _dynamicMesh.submeshes) { var meshObject = Instantiate(planetMeshPrefab); meshObject.mesh = mesh; meshObject.transform.SetParent(planetMeshes, false); } _faceUnits = new Transform[_topology.faces.Count].AsFaceAttribute(); for (int i = 0; i < unitCount; ++i) { Topology.Face face; do { face = _topology.internalFaces[_random.Index(_topology.internalFaces.Count)]; } while (_faceTerrainIndices[face] == 1 || _faceUnits[face] != null); var unit = Instantiate(unitPrefab); unit.SetParent(units, false); unit.transform.position = _facePositions[face] + _faceNormals[face] * 0.15f; _faceUnits[face] = unit; RevealUnitVicinity(face); } _dynamicMesh.RebuildMesh(DynamicMesh.VertexAttributes.UV2); }
public static void RenderTriangle(DynamicMesh mesh, RenderTile a, RenderTile b, RenderTile c) { TerrainType tA = a.GetTerrain(); TerrainType tB = b.GetTerrain(); TerrainType tC = c.GetTerrain(); if (tA == tB && tA == tC) { //No terrain transition mesh.SimpleTriangle(a.position, b.position, c.position, a.color, b.color, c.color, a.normal, b.normal, c.normal); } else { //NOTE: Currently I assume height goes: sand, dirt, grass. Height transitions could also be added //Terrain transition. TODO: cache all combination if (tB == tC) { //A unique if (tA == TerrainType.Grass && tB == TerrainType.Dirt) { GrassToDirt(mesh, a, b, c); return; } else if (tA == TerrainType.Dirt && tB == TerrainType.Grass) { DirtToGrass(mesh, a, b, c); return; } } else if (tA == tC) { //B unique if (tB == TerrainType.Grass && tC == TerrainType.Dirt) { GrassToDirt(mesh, b, c, a); return; } else if (tB == TerrainType.Dirt && tC == TerrainType.Grass) { DirtToGrass(mesh, b, c, a); return; } } else if (tA == tB) { //C unique if (tC == TerrainType.Grass && tA == TerrainType.Dirt) { GrassToDirt(mesh, c, a, b); return; } else if (tC == TerrainType.Dirt && tA == TerrainType.Grass) { DirtToGrass(mesh, c, a, b); return; } } else { //All unique } mesh.SimpleTriangle(a.position, b.position, c.position, a.color, b.color, c.color, a.normal, b.normal, c.normal); } }
public void Init(TextureSheet TexSheet) { m_Mesh = OriginMesh.GetClonedMesh(); m_Mesh.SetUV_quad(TexSheet.GetCoord(m_TexID)); }