Search Unity

[TerrainEngine] Voxel Terrain : Smooth,Cubic,2D,Hexagonal Infinite Procedural Terrain

Discussion in 'Assets and Asset Store' started by dyox, Mar 19, 2013.

  1. Rickmc3280

    Rickmc3280

    Joined:
    Jun 28, 2014
    Posts:
    189
    Well... you had a customer that paid 4000 to whomever for the development, and they never even received the closed source code version... Also you are not on the Unity Asset Store which is more concerning because the trust is in you and you alone to deliver the package (how are payments even handled, can refunds even be made?). Not to mention... the only reason I found out about this software even after searching online for voxel engines for unity...is because one of the people who invested over 4k in it mentioned it in a discord server when I mentioned looking for voxel engines, they never received a thing, but they still talk about how great of a package it is and your ability to design this package, but yet still talk decently about the developer (you) even after the service... so confusing. I think you should honor their committment to you getting paid to create this tool even if it is only the closed source version.


    I do get that you have to be cautious in transmitting certain information especially with the unity asset store popup free sites etc.. but.. I also get that Unity is greedy for a 30% price cut of the package and all the more reason to go elsewhere to make an extra $90 a pop... but $4000 is a lot of money. Its not just like oh I touched your car and left obvious residue...in professional terms... its like hey... i accidentally crashed into your car, damaged your bumper, you have to repair that now with something thats not covered under insurance because you didnt have full coverage, and oh hey I am leaving you a note on your car with a fake number just so it looks good to everyone else.. Its pretty dirty and dishonest. There are ways to handle it, I know its not easy, but its about being professional.
     
    Last edited: Mar 17, 2020
    DesertRaven, dyox and Recon03 like this.
  2. Recon03

    Recon03

    Joined:
    Aug 5, 2013
    Posts:
    845

    No offense, Dyox as I said when this happen I don't believe you did this on purpose, but I sent you my receipt even, and you never reported back or helped our company, and back then we where just starting, it actually caused me to lose an investor as I was blamed for even recommending your tool.... which you had told us to go buy this..I been in this industry since 1990's...and never had this happen..

    So you should of honored those 10 or so people screwed over by Junglee, since you are the developer. I know you didn't intend for it to happen, and I been fair for the past 3 years.. ..I don't believe everyone has been fair, and saying you scammed them, I don't believe that was your intention... but it happen.... it cost you NOTHING, to help those that did lose 4 grand that is a lot of money....to lose..

    anyways...great work its looking good, but I have told people the truth about what happen to our company, when anyone ask me, I also tell them, you are very talented and don't feel you it this on purpose, but how you have handled it, has been very bad....You could of supported those screwed by this.... believe me I have worked with bad partners and help those ever effected its smart business.....

    So don't say you did your best to help us...You have NOT... I was ignored as others have... sure you help the ones who bought from you before this nonsense happen, I been told that..I actually tried to buy from you direct and you told me NO, to buy from Junglee so I did.. So, please sir be fair here. and honest....

    /cheers, good work by the way....but I hope you learned your lesson about who you deal with.. in the future and remember its NOT our fault, you should have dealt with this better.




    What you could do, for the asset store, is sell the closed source for a set price... 100-300 bucks....Then on your own site, sell the source for more. ( this way you get the 100% profit) some free advice. when we make games, Steam, XB1, PS4 take the 30% which is a lot, sadly...glad Epic now has a store for about 12%
    anyways, that is an option for you for the future. this way you have Unity for marketing and to get to people..Then you can use your own site for the Full Source, to get 100% profits. good luck!
     
    Last edited: Mar 17, 2020
    dyox likes this.
  3. Hurtful-Toad

    Hurtful-Toad

    Joined:
    Feb 18, 2016
    Posts:
    20
    I think you need to move into a yearly maintenance type arrangement for open source version. This would allow a lower entry fee but give you a continuing income stream from devs with ongoing projects. The maintenance would be lower than initial charge so that if customers allow it to lapse, they could buy back in by just paying the initial fee again. And I would suggest that you promise and owe absolutely no support other than an occasional glance through discord at your convenience. This keeps you doing what you love and are best at, without all the BS.
     
    Recon03, HakJak and dyox like this.
  4. Recon03

    Recon03

    Joined:
    Aug 5, 2013
    Posts:
    845
    This is actually industry standard. So yes , I know PW started doing this, as I recommended to them awhile ago...Since Auto Desk, The Foundry, World Creator, Substance and many more already do that... So, yes this would be wise.
     
    dyox likes this.
  5. dyox

    dyox

    Joined:
    Aug 19, 2011
    Posts:
    619
    I understand, as i always said,I am available by email for all Junglee team customers: fastmarchingcubes@gmail.com

    TENext Beta 3 Preview :


    I will post the complete new features list soon (Ocean, Erosion, Per biome erosion,Sediments, Instancing, Transvoxel Optimizations, Splatmap/Heightmap optimization, Compression, MeshToSDF Octree/QuadTree, Complete Native Framework for Burst/Job, RealTime Fluids, unlimited decoration/realtime billboards, etc...)
     
    Last edited: Apr 6, 2020
    DJ_Design, HakJak, FlavioIT and 2 others like this.
  6. Tethys

    Tethys

    Joined:
    Jul 2, 2012
    Posts:
    672
    @dyox - I would like to discuss buying a license for the new TENext. Hit me up on Skype when you get a chance or I can email you if you like. Thanks!
     
    dyox likes this.
  7. DJ_Design

    DJ_Design

    Joined:
    Mar 14, 2013
    Posts:
    124
    Is this a permanent license, including future updates?
     
    dyox likes this.
  8. dyox

    dyox

    Joined:
    Aug 19, 2011
    Posts:
    619
    -Thanks, I'm available by mail : fastmarchingcubes@gmail.com

    -It's one year support/updates for free.

    I'm currently working on the new voxel Instancing system : (3ms -> 16ms, WIP)
    -I'm using Pixar Mesh Render Algorithm (GPU) : adapted to Burst/CPU for realtime usage.
    -Working with Fluids
    -Voxelize : Any Mesh/Any Time
    -Fully interactable
    -Using : 255 Textures/Voxels/Clusters
    -Fractures
    -Voxel Scale <0.125m
    -Voxelize/Destruct on demand : Props/Trunk/Structures/Cliffs/Rocks/etc..

    My goal is to provide a simple system to add any prefab, at any position/scale, fully voxelized and destructible. Working with fluids and pathfinding.
    And stay as simple and easy.
    Pixar.png

    I'm sorry for the delay, but since my mail is on Youtuve i receive a LOT of mails.
    I have 4k email now + my job at R&D for few games...
     
    Last edited: Apr 28, 2020
    DJ_Design, Tethys and HakJak like this.
  9. dyox

    dyox

    Joined:
    Aug 19, 2011
    Posts:
    619
    TerrainEngineNext :

    -Fluids
    -Destruction : Voxels
    -Realtime voxelizer : Voxelize any many mesh/at/any position
    -Physics : Sever/Client side

    -Realtime : Erosion
    -Realtime Fluids Flow
    -Realtime HeightMap / Splatmap
    -And ... a lot more features.
     
    Last edited: May 20, 2020
    Tethys likes this.
  10. Tethys

    Tethys

    Joined:
    Jul 2, 2012
    Posts:
    672
    Awesome - I emailed you but haven't heard back - I know you get a lot of email. Feel free to hit me up direct, I have the budget now to pay and am ready to buy - chris@tethysinteractive.com - thanks!
     
    dyox likes this.
  11. Hurtful-Toad

    Hurtful-Toad

    Joined:
    Feb 18, 2016
    Posts:
    20
    Same here.
     
    dyox likes this.
  12. dyox

    dyox

    Joined:
    Aug 19, 2011
    Posts:
    619
    Yes, sorry for the delay.

    It's not exactly what i would like to show, but, i'm working on the new Beta 3.
    -Voxelizer (Mesh to voxels, Max/Min, used for Caves,cliffs,decorations)
    -Underground : Cluster/Voxel ( nodes and noises ready for underground voxels/clusters)
    -Fluids/Decorations
    -Height,Slope,Sediments,VoxelType,Normal Generated in 0.39s

     
    Tethys likes this.
  13. dyox

    dyox

    Joined:
    Aug 19, 2011
    Posts:
    619
    I would like to share the fracture system.
    It uses the plugin and addons interface :


    Code (CSharp):
    1. using Unity.Burst;
    2. using Unity.Collections;
    3. using Unity.Jobs;
    4. using UnityEngine;
    5. using Unity.Mathematics;
    6. using System.Collections.Generic;
    7.  
    8. namespace TerrainEngine
    9. {
    10.     public struct FragmentsData
    11.     {
    12.         public int Id;
    13.         public int3 Min, Max;
    14.     }
    15.  
    16.     public struct FragmentsContainer
    17.     {
    18.         public Vector3 VoronoiFrequency;
    19.         public OperatorShapeData SData;
    20.  
    21.         public BlittableList<FragmentsData> FragmentsData;
    22.         public BlittableList<NativeMeshData> Meshes;
    23.  
    24.         public VoxelDataContainer Container;
    25.  
    26.         public int GetFragmentIndex(ref int Id, ref int Len, ref FragmentsData Data)
    27.         {
    28.             for (int i = 0; i < Len; ++i)
    29.             {
    30.                 Data = FragmentsData[i];
    31.                 if (Data.Id == Id) return i;
    32.             }
    33.  
    34.             return -1;
    35.         }
    36.  
    37.         public int GetId(int x, int y, int z)
    38.         {
    39.             return (int)(LibNoise.Voronoi.GetValue(
    40.                             (Container.HeightMapContainer.px + x) * VoronoiFrequency.x,
    41.                             (Container.HeightMapContainer.py + y) * VoronoiFrequency.y,
    42.                             (Container.HeightMapContainer.pz + z) * VoronoiFrequency.z,
    43.                             1f, 1, 0, false) * 10000f);
    44.         }
    45.     }
    46.  
    47.     [BurstCompile(CompileSynchronously = true)]
    48.     public struct PrepareFragmentsJob : IJob
    49.     {
    50.         public FragmentsContainer Data;
    51.  
    52.         public void Init()
    53.         {
    54.             Data.FragmentsData.Create(16);
    55.             Data.Meshes.Create(16, true);
    56.         }
    57.  
    58.         public void Close()
    59.         {
    60.             //Debug.Log("Close PrepareFramentsJob");
    61.             Data.FragmentsData.Close();
    62.         }
    63.  
    64.         public void Execute()
    65.         {
    66.             // Set Framents Ids
    67.             int index = 0, Id;
    68.             int IndexOf = 0;
    69.             int Len = 0;
    70.             FragmentsData Fragment = new FragmentsData();
    71.             int3 p = new int3();
    72.             int3 TerrainP = new int3();
    73.  
    74.             for (p.x = 0; p.x < Data.SData.Index.Size.x; ++p.x)
    75.             {
    76.                 TerrainP.x = p.x + Data.SData.Box.Min.x;
    77.                 for (p.y = 0; p.y < Data.SData.Index.Size.y; ++p.y)
    78.                 {
    79.                     TerrainP.y = p.y + Data.SData.Box.Min.y;
    80.                     for (p.z = 0; p.z < Data.SData.Index.Size.z; ++p.z, ++index)
    81.                     {
    82.                         TerrainP.z = p.z + Data.SData.Box.Min.z;
    83.  
    84.                         Id = Data.GetId(TerrainP.x, TerrainP.y, TerrainP.z);
    85.                         IndexOf = Data.GetFragmentIndex(ref Id, ref Len, ref Fragment);
    86.  
    87.                         if (IndexOf == -1)
    88.                         {
    89.                             Fragment.Min = Fragment.Max = new int3(TerrainP.x, TerrainP.y, TerrainP.z);
    90.                             Fragment.Id = Id;
    91.                             Data.FragmentsData.Add(ref Fragment);
    92.                             ++Len;
    93.                         }
    94.                         else
    95.                         {
    96.                             Fragment.Min = math.min(Fragment.Min, TerrainP);
    97.                             Fragment.Max = math.max(Fragment.Max, TerrainP);
    98.                             Data.FragmentsData[IndexOf] = Fragment;
    99.                         }
    100.                     }
    101.                 }
    102.             }
    103.         }
    104.     }
    105.  
    106.     [BurstCompile(CompileSynchronously = true)]
    107.     public struct GenerateFragmentsJob : IJobParallelFor
    108.     {
    109.         public int MinVoxelPerObject;
    110.         public FragmentsContainer Data;
    111.         public TransvoxelBurstTables Tables;
    112.         public bool SharpFractures;
    113.         public int Start;
    114.         public BlittableArray<FragmentParticles> Particles;
    115.         public BlittableList<int4> ParticlesPoints;
    116.  
    117.         public void Execute(int index)
    118.         {
    119.             index += Start;
    120.             var Fragment = Data.FragmentsData[index];
    121.             int3 Size = Fragment.Max - Fragment.Min;
    122.             int Resolution = math.ceilpow2(math.cmax(Size) + 2);
    123.  
    124.             TerrainConfiguration Config = Data.Container.Config;
    125.             Config.Set(Resolution);
    126.  
    127.             VoxelInterpolationInfo voxel = new VoxelInterpolationInfo();
    128.             var Mesh = Data.Meshes[index];
    129.             Mesh.Clear();
    130.  
    131.             var TData = new TransvoxelData();
    132.             TData.InitTemp(ref Config);
    133.  
    134.             int3 TerrainP = new int3();
    135.             VoxelData VData = Data.Container.Arounds[13];
    136.             Unity.Mathematics.Random rdn = new Unity.Mathematics.Random((uint)Fragment.Min.GetHashCode() + 1);
    137.             bool HasPositive = false, HasNegative = false;
    138.             for (int x = -1; x < Resolution; ++x)
    139.             {
    140.                 TerrainP.x = x + Fragment.Min.x;
    141.                 for (int y = -1; y < Resolution; ++y)
    142.                 {
    143.                     TerrainP.y = y + Fragment.Min.y;
    144.                     for (int z = -1; z < Resolution; ++z)
    145.                     {
    146.                         TerrainP.z = z + Fragment.Min.z;
    147.  
    148.                         if (TerrainP.x >= Data.SData.Box.Max.x
    149.                             || TerrainP.y >= Data.SData.Box.Max.y
    150.                             || TerrainP.z >= Data.SData.Box.Max.z)
    151.                             continue;
    152.  
    153.                         if (x < 0 || y < 0 || z < 0
    154.                             || TerrainP.x > Fragment.Max.x + 3
    155.                              || TerrainP.y > Fragment.Max.y + 3
    156.                               || TerrainP.z > Fragment.Max.z + 3)
    157.                             voxel.VType = 0;
    158.                         else
    159.                         {
    160.                             if (Data.GetId(TerrainP.x, TerrainP.y, TerrainP.z) == Fragment.Id)
    161.                                 voxel.Volume = Data.Container.GetVoxel(TerrainP.x, TerrainP.y, TerrainP.z, ref voxel.VType, ref VData);
    162.                             else
    163.                             {
    164.                                 Data.Container.GetVoxel(TerrainP.x, TerrainP.y, TerrainP.z, ref voxel.VType, ref VData);
    165.                                 if (!VoxelData.IsEmpty(ref voxel.VType, ref voxel.Volume))
    166.                                 {
    167.                                     var Cont = Particles[voxel.VType];
    168.                                     if (rdn.NextFloat(100f * Config.VoxelResolution) < Cont.Probability)
    169.                                     {
    170.                                         ParticlesPoints.Add(new int4(TerrainP.x, TerrainP.y, TerrainP.z, Particles[voxel.VType].GetRandom(ref rdn)));
    171.                                     }
    172.                                 }
    173.  
    174.                                 voxel.VType = 0;
    175.                             }
    176.                         }
    177.  
    178.                         if (voxel.VType == 0) voxel.Volume = TransvoxelTables.Isofix;
    179.                         else if (SharpFractures)
    180.                         {
    181.                             if (voxel.Volume > TransvoxelTables.Isofix) voxel.Volume = TransvoxelTables.Isolevel;
    182.                             else voxel.Volume = TransvoxelTables.Isofix;
    183.                         }
    184.  
    185.                         TData.Set(x + 1, y + 1, z + 1, ref Config, ref voxel, ref HasPositive, ref HasNegative);
    186.                     }
    187.                 }
    188.             }
    189.  
    190.             OctreeData Node = new OctreeData();
    191.             Node.size = (ushort)Resolution;
    192.             Tables.GenerateDelegate.Invoke(ref Config, ref Node, ref TData, ref Mesh, ref Tables);
    193.  
    194.             Node.x = (ushort)Fragment.Min.x;
    195.             Node.y = (ushort)Fragment.Min.y;
    196.             Node.z = (ushort)Fragment.Min.z;
    197.  
    198.             TransvoxelMeshJob.Process(ref Data.Container, ref Node, ref Mesh);
    199.             Data.Meshes[index] = Mesh;
    200.             TData.DisposeTemp();
    201.         }
    202.     }
    203.  
    204.     public class FragmentsTask : TaskJob<FractureTask>
    205.     {
    206.         public JobHandleFast Handle;
    207.         GenerateFragmentsJob FJob;
    208.  
    209.         public override void Start(int Start, int Count)
    210.         {
    211.             //Debug.Log("Start Fragments:" + Start + "," + Count);
    212.  
    213.             FJob = new GenerateFragmentsJob();
    214.             FJob.MinVoxelPerObject = Parent.Shape.MinVoxelPerObject;
    215.             FJob.Data = Parent.Job.Data;
    216.             FJob.Tables = TransvoxelBurstTables.GetTables();
    217.             FJob.Start = Start;
    218.             FJob.SharpFractures = Parent.Shape.SharpFractures;
    219.             FJob.Particles = Parent.Shape.ParticlesContainer;
    220.             FJob.ParticlesPoints.Create(4);
    221.  
    222.             for (int i = Start; i < Start + Count; ++i)
    223.             {
    224.                 NativeMeshData Mesh = FJob.Data.Meshes[i];
    225.                 Mesh.Init(128);
    226.                 FJob.Data.Meshes[i] = Mesh;
    227.             }
    228.  
    229.             Handle = new JobHandleFast(FJob.Schedule(Count, 1));
    230.         }
    231.  
    232.         public override bool IsJobHandleComplete()
    233.         {
    234.             return Handle.IsCompleted;
    235.         }
    236.  
    237.         public override void OnJobFinished(int Start, int Count)
    238.         {
    239.             Handle.Complete();
    240.         }
    241.  
    242.         static public MaterialPropertyBlock Block;
    243.  
    244.         public override bool IsFinished(int Start, int Count)
    245.         {
    246.             var TParent = Parent.Operator.Container.Script.GetSubSystem("Fracture");
    247.  
    248.             for (int i = Start; i < Start + Count; ++i)
    249.             {
    250.                 var Mesh = Parent.Job.Data.Meshes[i];
    251.                 var Fragment = Parent.Job.Data.FragmentsData[i];
    252.  
    253.                 var Size = Mesh.Bounds[0].size;
    254.                 if (math.abs(Size.x) + math.abs(Size.y) + math.abs(Size.z) > 1)
    255.                 {
    256.                     var Filter = GameObject.Instantiate(OperatorFractureShape.DefaultGameObject).GetComponent<MeshFilter>();
    257.                     var UMesh = new Mesh();
    258.                     UMesh = Mesh.Apply(UMesh);
    259.                     Filter.sharedMesh = UMesh;
    260.  
    261.                     Filter.name = "Fracture";
    262.                     Filter.gameObject.layer = Parent.Shape.GameObjectLayer;
    263.                     MeshRenderer Renderer = Filter.GetComponent<MeshRenderer>();
    264.                     Renderer.sharedMaterial = Parent.mat;
    265.                     Renderer.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.On;
    266.                     Renderer.SetPropertyBlock(Parent.Operator.Container.Script.PropertyBlock);
    267.                     if (Block == null) Block = new MaterialPropertyBlock();
    268.                     Renderer.GetPropertyBlock(Block);
    269.                     Block.SetFloat("_VoxelFadePower", 1f);
    270.                     Block.SetFloat("_UseWorldPosition", 0f);
    271.                     Block.SetVector("_PositionOffset", (Vector3)(float3)Fragment.Min);
    272.                     Renderer.SetPropertyBlock(Block);
    273.  
    274.                     BakeMeshJob BJob = new BakeMeshJob();
    275.                     BJob.MeshId = UMesh.GetInstanceID();
    276.                     BJob.Convex = true;
    277.                     Handle = new JobHandleFast(JobHandle.CombineDependencies(Handle.Handle, BJob.Schedule()));
    278.  
    279.                     var Collider = Filter.GetComponent<MeshCollider>();
    280.                     Collider.convex = true;
    281.                     Filter.transform.parent = TParent;
    282.                     Filter.transform.localPosition = Parent.Job.Data.Container.Config.GetVoxelWorldPosition(Fragment.Min.x, Fragment.Min.y, Fragment.Min.z) - Parent.Job.Data.Container.Config.GetWorldOffset();
    283.  
    284.                     Parent.Colliders.Add(new KeyValuePair<MeshCollider, Mesh>(Collider, UMesh));
    285.                     if (Parent.Shape.Duration > 0)
    286.                         GameObject.Destroy(Filter.gameObject, Parent.Shape.Duration);
    287.                 }
    288.  
    289.                 Mesh.Close();
    290.                 Parent.Job.Data.Meshes[i] = Mesh;
    291.             }
    292.  
    293.             Parent.Operator.Container.Script.PropertyBlock.SetFloat("_VoxelFadePower", 0f);
    294.             Parent.Operator.Container.Script.PropertyBlock.SetFloat("_UseWorldPosition", 1f);
    295.  
    296.             return true;
    297.         }
    298.  
    299.         public override bool Finish(int Start, int Count)
    300.         {
    301.             for (int i = 0; i < FJob.ParticlesPoints.Length; ++i)
    302.             {
    303.                 var p = FJob.ParticlesPoints[i];
    304.                 if ((uint)p.w >= Parent.Shape.ParticlesByIndex.count)
    305.                 {
    306.                     Debug.LogError(p.w + ">=" + Parent.Shape.ParticlesByIndex.count);
    307.  
    308.                     continue;
    309.                 }
    310.                 var Particle = Parent.Shape.ParticlesByIndex[p.w];
    311.                 var Obj = GameObject.Instantiate(Particle);
    312.                 Obj.SetActive(false);
    313.  
    314.                 Obj.transform.rotation = UnityEngine.Random.rotation;
    315.                 Obj.transform.position = FJob.Data.Container.Config.GetVoxelWorldPosition(ref FJob.Data.Container, p.x, p.y, p.z);
    316.                 GameObject.Destroy(Obj, Parent.Shape.ParticlesDespawnTime);
    317.                 Parent.GameObjects.Add(Obj);
    318.             }
    319.  
    320.             FJob.ParticlesPoints.Close();
    321.  
    322.             return base.Finish(Start, Count);
    323.         }
    324.     }
    325.  
    326.     public class FractureTask : TaskJob<FractureTask>
    327.     {
    328.         public JobHandleFast Handle;
    329.         public ITaskHandle THandle;
    330.  
    331.         public TerrainOperator Operator;
    332.         public OperatorFractureShape Shape;
    333.         public PrepareFragmentsJob Job;
    334.         public int FragmentsCount;
    335.         public Material mat;
    336.  
    337.         public List<KeyValuePair<MeshCollider, Mesh>> Colliders = new List<KeyValuePair<MeshCollider, Mesh>>();
    338.         public List<GameObject> GameObjects = new List<GameObject>();
    339.  
    340.         public override void Start(int Start, int Count)
    341.         {
    342.             //Debug.Log("Start Fracture");
    343.             if (mat == null) mat = Operator.Container.WorldModules.Palette.GetMaterial(0);
    344.  
    345.             Job.Init();
    346.             Handle = new JobHandleFast(Job.Schedule());
    347.         }
    348.  
    349.         public override bool IsJobHandleComplete()
    350.         {
    351.             return Handle.IsCompleted;
    352.         }
    353.  
    354.         public override void OnJobFinished(int Start, int Count)
    355.         {
    356.             Handle.Complete();
    357.  
    358.             while (Job.Data.FragmentsData.Length > Shape.MaximumCount)
    359.                 Job.Data.FragmentsData.RemoveAtSwapBack(UnityEngine.Random.Range(0, Job.Data.FragmentsData.Length));
    360.  
    361.             FragmentsCount = Job.Data.FragmentsData.Length;
    362.             for (int i = 0; i < FragmentsCount; ++i)
    363.                 Parent.Job.Data.Meshes.Add(new NativeMeshData());
    364.  
    365.             FragmentsTask Fragment = new FragmentsTask();
    366.             THandle = TaskHandle<FragmentsTask, FractureTask>.Schedule(this, FragmentsCount, 64, Fragment);
    367.             CurrentHandle.AddHandle(THandle);
    368.         }
    369.  
    370.         public override bool IsFinished(int Start, int Count)
    371.         {
    372.             return THandle == null || THandle.IsChildsComplete;
    373.         }
    374.  
    375.         public override bool Finish(int Start, int Count)
    376.         {
    377.             //Debug.Log("Fracture Finished : " + FragmentsCount);
    378.             Job.Data.Meshes.Close();
    379.             Job.Close();
    380.  
    381.             for (int i = 0; i < GameObjects.Count; ++i)
    382.             {
    383.                 GameObjects[i].SetActive(true);
    384.             }
    385.  
    386.             for (int i = 0; i < Colliders.Count; ++i)
    387.                 CollidersManager.CollidersToEnable.Push(Colliders[i]);
    388.  
    389.             Colliders.Clear();
    390.             GameObjects.Clear();
    391.  
    392.             var Parent = Operator.Container.Script.GetSubSystem("Fracture");
    393.  
    394.             if (Shape.MaximumCount > 0)
    395.             {
    396.                 Count = Parent.childCount;
    397.  
    398.                 while (Count > Shape.MaximumCount)
    399.                 {
    400.                     GameObject.Destroy(Parent.GetChild(Count - Shape.MaximumCount).gameObject);
    401.                     --Count;
    402.                 }
    403.             }
    404.  
    405.             return base.Finish(Start, Count);
    406.         }
    407.     }
    408.  
    409.     public struct FragmentParticles
    410.     {
    411.         public BlittableList<int> ParticlesIds;
    412.         public float Probability;
    413.  
    414.         public int GetRandom(ref Unity.Mathematics.Random random)
    415.         {
    416.             return ParticlesIds[random.NextInt(0, ParticlesIds.Length)];
    417.         }
    418.     }
    419.  
    420.     [System.Serializable]
    421.     public class FractureParticles
    422.     {
    423.         public string VoxelPartialName;
    424.         public List<GameObject> Particles;
    425.         public float Probability;
    426.     }
    427.  
    428.  
    429.     [CreateAssetMenu(menuName = "TerrainEngine/Operators/Fracture", fileName = "FractureOperator")]
    430.     [BurstCompile(CompileSynchronously = true)]
    431.     public class OperatorFractureShape : OperatorShapeBase
    432.     {
    433.         static public GameObject DefaultGameObject;
    434.  
    435.         public Vector3 VoronoiFrequency = new Vector3(0.01f, 0.1f, 0.05f);
    436.         public int MinVoxelPerObject = 3;
    437.         public LayerMask Layer;
    438.         public List<FractureParticles> Particles;
    439.         public float ParticlesDespawnTime = 5f;
    440.  
    441.         public BlittableArray<FragmentParticles> ParticlesContainer;
    442.         public QuickList<GameObject> ParticlesByIndex;
    443.  
    444.         [HideInInspector]
    445.         public int GameObjectLayer;
    446.  
    447.         [Header("Fragments Objects")]
    448.         public int MaximumCount = 0;
    449.         public int Duration = 0;
    450.         public bool SharpFractures = false;
    451.  
    452.         public override void DrawShapeGUI(Rect ShapeRect)
    453.         {
    454.             GUILayout.BeginArea(ShapeRect);
    455.             GUILayout.BeginHorizontal("box");
    456.  
    457.             SharpFractures = GUILayout.Toggle(SharpFractures, "Sharp");
    458.             GUILayout.FlexibleSpace();
    459.             MaximumCount = RTGUILayout.IntField("MaxFragments:", MaximumCount);
    460.             GUILayout.FlexibleSpace();
    461.             Duration = RTGUILayout.IntField("Duration:", Duration);
    462.             GUILayout.FlexibleSpace();
    463.  
    464.             GUILayout.Label("Fragments Size:");
    465.             VoronoiFrequency.x = RTGUILayout.FloatField("X", VoronoiFrequency.x);
    466.             VoronoiFrequency.y = RTGUILayout.FloatField("Y", VoronoiFrequency.y);
    467.             VoronoiFrequency.z = RTGUILayout.FloatField("Z", VoronoiFrequency.z);
    468.  
    469.             GUILayout.EndHorizontal();
    470.             GUILayout.EndArea();
    471.         }
    472.  
    473.         public override void OnInit()
    474.         {
    475.             InitFunctions(ApplyShapeBurst);
    476.         }
    477.  
    478.         public void InitParticles(TerrainManager Manager)
    479.         {
    480.             if (!ParticlesContainer.IsCreated || ParticlesByIndex == null)
    481.             {
    482.                 ParticlesContainer.Close();
    483.                 ParticlesContainer.Create(255);
    484.                 ParticlesByIndex = new QuickList<GameObject>();
    485.  
    486.                 var Names = Manager.WorldModules.Palette.Names;
    487.  
    488.                 for (int i = 1; i < Names.Length; ++i)
    489.                 {
    490.                     var Container = ParticlesContainer[i];
    491.                     Container.ParticlesIds.Create(4);
    492.  
    493.                     float TotalProb = 0;
    494.                     float TotalCount = 2;
    495.  
    496.                     foreach (var P in Particles)
    497.                     {
    498.                         if (!string.IsNullOrEmpty(Names[i]) && P != null && Names[i].Contains(P.VoxelPartialName))
    499.                         {
    500.                             TotalProb += P.Probability;
    501.                             TotalCount *= 0.5f;
    502.  
    503.                             foreach (var Obj in P.Particles)
    504.                             {
    505.                                 Debug.Log(Obj + " Add Particle to VoxelId:" + i + "," + P.VoxelPartialName + ":" + Names[i]);
    506.                                 Container.ParticlesIds.Add(ParticlesByIndex.count);
    507.                                 ParticlesByIndex.Add(Obj);
    508.                             }
    509.                         }
    510.                     }
    511.  
    512.                     Container.Probability = TotalProb * TotalCount;
    513.                     if (Container.ParticlesIds.Length <= 0)
    514.                         Container.Probability = -1;
    515.                     ParticlesContainer[i] = Container;
    516.                 }
    517.             }
    518.         }
    519.  
    520.         public override string InitOperatorAddon(TerrainOperator Operator)
    521.         {
    522.             InitParticles(Operator.Container.Manager);
    523.  
    524.             GameObjectLayer = CollidersManager.layermask_to_layer(Layer);
    525.  
    526.             if (DefaultGameObject == null)
    527.             {
    528.                 DefaultGameObject = new GameObject("Fracture");
    529.                 DefaultGameObject.AddComponent<MeshFilter>();
    530.                 DefaultGameObject.AddComponent<MeshRenderer>();
    531.                 DefaultGameObject.AddComponent<MeshCollider>();
    532.  
    533.                 var Rigid = DefaultGameObject.AddComponent<Rigidbody>();
    534.                 Rigid.isKinematic = true;
    535.                 DefaultGameObject.AddComponent<TerrainObject>().SetRigidBody(Rigid);
    536.                 DefaultGameObject.SetActive(false);
    537.             }
    538.  
    539.             FractureTask Fracture = new FractureTask();
    540.             Fracture.Operator = Operator;
    541.             Fracture.Shape = this;
    542.             Fracture.Job.Data.SData = Operator.ShapeData;
    543.             Fracture.Job.Data.VoronoiFrequency = VoronoiFrequency;
    544.             Fracture.Job.Data.Container = Operator.Container.Data;
    545.             Operator.AddonTask = TaskHandle<FractureTask, FractureTask>.Create(Fracture, 0, 1, Operator.AddonTask, Fracture);
    546.             return null;
    547.         }
    548.  
    549.         [BurstCompile(CompileSynchronously = true)]
    550.         static public bool ApplyShapeBurst(ref TerrainOperatorSettings Settings, ref OperatorShapeData SData, ref VoxelInterpolationInfo Result, ref VoxelInterpolationInfo Voxel, ref int3 p)
    551.         {
    552.             Settings.OperatorType = OperatorTypes.SET_TYPE | OperatorTypes.SET_VOLUME;
    553.  
    554.             Result.VType = 0;
    555.             Result.Volume = 0;
    556.             return true;
    557.         }
    558.     }
    559. }
    Feel free to share your comments.

     
    Last edited: Jun 26, 2020
  14. dyox

    dyox

    Joined:
    Aug 19, 2011
    Posts:
    619
    Beta 3 :
     
    jashan, SirStompsalot and Tethys like this.
  15. Tethys

    Tethys

    Joined:
    Jul 2, 2012
    Posts:
    672
    Amazing stuff, great video!
     
    SirStompsalot likes this.
  16. siliwangi

    siliwangi

    Joined:
    Sep 25, 2009
    Posts:
    303
    @dyox
    E-mailed and interested but really worry about the supports. Will i am getting the same support delay as before getting TerrainEngineNext, what would be the medium for TerrainEngineNext supports (forums?,e-mail?,whatsapp?).

    How is the networking going on in TerrainEngineNext?.
     
    dyox likes this.
  17. AtomsInTheVoid

    AtomsInTheVoid

    Joined:
    Jul 27, 2015
    Posts:
    251
    If you're making a decently large world, you might wanna know there's a new way to fly around your scene all the cool kids are using. Once you see this you'll wonder why no ones thought of this before!

    Just point off in the distance and fly! Preview camera let's you know where you'll land and you can even adjust the final view before you jump. You'll save tons of time and even have fun exploring your beautiful worlds.

    https://assetstore.unity.com/packages/tools/utilities/scene-pilot-177244
     
  18. Nibs_1983

    Nibs_1983

    Joined:
    Oct 11, 2020
    Posts:
    1
    Thinking of buying this for our project but would want to import terrain data from another program (Quadspinner Gaea) to this. Is that currently possible?
     
  19. Recon03

    Recon03

    Joined:
    Aug 5, 2013
    Posts:
    845
    I sent many emails, I never get a reply. Email me back as soon as you can. Thanks.
     
  20. kenlem

    kenlem

    Joined:
    Oct 16, 2008
    Posts:
    1,630
    I bought this asset and I get no response when I send e-mails.
     
    Recon03 likes this.
  21. DJ_Design

    DJ_Design

    Joined:
    Mar 14, 2013
    Posts:
    124
    Make sure you guys are on his Discord server, I've seen him more active there than here.
     
  22. Recon03

    Recon03

    Joined:
    Aug 5, 2013
    Posts:
    845
    I don't use Discord. So, I was told to email him... I hate chasing folks, I paid a lot for this.

    dyox was last seen:

    Yesterday at 10:32 PM
     
    Last edited: Jan 21, 2021
  23. kenlem

    kenlem

    Joined:
    Oct 16, 2008
    Posts:
    1,630
    I didn't know there was a discord. Can some DM the url?
     
  24. blacksun666

    blacksun666

    Joined:
    Dec 17, 2015
    Posts:
    214
    dyox and x4000 like this.
  25. x4000

    x4000

    Joined:
    Mar 17, 2010
    Posts:
    353
    It's the right one. Dyox just dumped a TON of very amazing-looking screenshots in there today. He also said:

    "Hello, i've received all your emails and messages. I'm actively working on TerrainEngineNext, V4. This is a major update, i've been working on it every day for the past 6 months, and I will respond to all messages soon when the new version is ready so I can provide a full new demo."

    Figured folks in here might find that useful.
     
    dyox likes this.
  26. dyox

    dyox

    Joined:
    Aug 19, 2011
    Posts:
    619
    Hello, yes i'm working actively on TerrainEngine Next V4.
    I'm working on it since 6+ months, it's the most advanced and complex update i've ever done any video game project.

    I'm preparing a video and a demo showing all features, it will be online soon.
    -Ultra Optimized Procedural Terrain (200ms for 16km² terrain) (Erosion,Convex,Concave,Sediments,etc)
    -Infinite Terrain from any HeightMap
    -Unlimited Textures Count
    -TextureArray Streaming <- (Textures loaded/unloaded in realtime, very low GPU memory)
    -Texture Combiner from any folder (no need to import any texture on your unity project)
    -GPU Async Occlusion culling ( Complex buildings/caves/ships = 0 fps drop)
    -Realtime Procedural Decoration (Instancing, Frustum/Occlusion, and more)
    -Voxels Physics (Destroy, it falls, destroy it again)
    -Voxels Fracture (Per Texture Fracture size)(Marble,Fabric,Grass,Dirt,Rock)(Sharp, smooth, uniform, etc..)
    -Bundles/Resources Async Manager using new Database Manager (Load/Unload Stamps, Terrain Texture, Decoration Prefab, Audio Sound, etc) (Not Adressable, custom system, no spikes)
    -Realtime Fluids
    -Footstep/Audio
    -Voxelizer to modify terrain (any mesh, any form, non destructive workflow)
    -Voxelizer to decorate terrain (as decoration, destrutible and working with fluids)
    The feature list is too long, a video is coming soon.

    Desktop Screenshot 2020.12.27 - 21.34.11.32.png Desktop Screenshot 2021.01.22 - 17.46.34.35.png Desktop Screenshot 2021.01.22 - 18.01.53.15.png Desktop Screenshot 2021.01.22 - 18.09.14.28.png Desktop Screenshot 2020.12.27 - 21.35.59.76.png
     
    Last edited: Jan 23, 2021
  27. dyox

    dyox

    Joined:
    Aug 19, 2011
    Posts:
    619
    Desktop Screenshot 2020.12.27 - 21.36.14.86.png Desktop Screenshot 2020.12.27 - 21.36.24.84.png Desktop Screenshot 2020.12.27 - 21.37.51.81.png Desktop Screenshot 2020.12.27 - 21.38.03.97.png Desktop Screenshot 2020.12.27 - 21.38.20.90.png Built-in
     
  28. dyox

    dyox

    Joined:
    Aug 19, 2011
    Posts:
    619
    Desktop Screenshot 2021.01.22 - 17.49.18.03.png Desktop Screenshot 2021.01.22 - 17.49.41.31.png Desktop Screenshot 2021.01.22 - 17.50.14.19.png Desktop Screenshot 2021.01.22 - 17.50.35.70.png Desktop Screenshot 2021.01.22 - 18.09.14.28.png Decoration
     
  29. dyox

    dyox

    Joined:
    Aug 19, 2011
    Posts:
    619
    Terrain is made using the node editor, (Runtime/In-Editor).
    Voxel Size 0.125m
    Terrain Size : 64 000m
    Desktop Screenshot 2021.01.22 - 17.44.31.06.png Build Screenshot 2021.01.23 - 04.11.32.35.png Build Screenshot 2021.01.23 - 04.13.08.87.png Build Screenshot 2021.01.23 - 04.15.24.11.png

    GPU Occlusion Culling :
    Desktop Screenshot 2021.01.23 - 04.26.54.35.png
     
    Last edited: Jan 23, 2021
    DesertRaven, TerraUnity and DJ_Design like this.
  30. Recon03

    Recon03

    Joined:
    Aug 5, 2013
    Posts:
    845

    I emailed you over the years, Dyox, and recent, I have not heard back. I'm wondering if you have plans to contact folks ? that paid for this? but never got what they paid for? I sent you my receipt as well. I won't get my hopes up, but it would be nice to get what I paid for? Thanks.


    I been pretty fair to you, and this is frustrating, that I can't get a reply even after you asked for this info... to be fair, I run a business, I also have cancer, home schooling kids.. Etc, I call back all of my customers, an email, should take a few mins. Plus sending me a file link would be a few mins a well. So, it would be great to use this in a professional game. This would also helpp promote Terrain Engine in a real game as well.... I been a professional game developer over 28 years who is now retired from working with clients, and working on our own games now...So we have a project we would like to use TE on....

    I got stuck paying back that investor the money he lost, so since i cant get my money back, it would be nice to get the software. I will be looking forward to your email soon. Thanks Thomas.
     
    DesertRaven likes this.
  31. imblue4d

    imblue4d

    Joined:
    May 27, 2016
    Posts:
    110
    The discord link is invalid, anyone got a permalink please?
     
  32. DJ_Design

    DJ_Design

    Joined:
    Mar 14, 2013
    Posts:
    124

    Understandable, just know discord is the standard in online communication in the development community beyond email as far as I'm concerned so it's less chasing and more basic than I think you realize.. emails can get buried, forum posts can get lost discord is a direct line.
     
  33. DJ_Design

    DJ_Design

    Joined:
    Mar 14, 2013
    Posts:
    124
    x4000 and imblue4d like this.
  34. Recon03

    Recon03

    Joined:
    Aug 5, 2013
    Posts:
    845

    I went there and finally after 3 years got a reply... but still got nothing, so we will see if he follows through. Thanks for that info.

    I can't stand social media...but, it was worth a try...
     
    x4000 likes this.
  35. imblue4d

    imblue4d

    Joined:
    May 27, 2016
    Posts:
    110
    DJ_Design likes this.
  36. dyox

    dyox

    Joined:
    Aug 19, 2011
    Posts:
    619
    Hello,

    TerrainEngineNext V4 is almost done.
    Progress/Screens available on Discord :
    https://discord.gg/SHyDqRnn
    Build Screenshot 2021.02.13 - 01.26.19.68.png Desktop Screenshot 2021.02.10 - 16.01.54.89.png Desktop Screenshot 2021.02.01 - 12.52.36.76.png
    A new in game video before the V4 feature video :
     
    Last edited: Feb 17, 2021
  37. dyox

    dyox

    Joined:
    Aug 19, 2011
    Posts:
    619
    Build Screenshot 2021.02.24 - 23.13.14.89.png Build Screenshot 2021.02.24 - 23.17.51.53.png Build Screenshot 2021.02.24 - 23.16.01.08.png Workflow video :
     
    Last edited: Feb 27, 2021
    DesertRaven and Recon03 like this.
  38. dyox

    dyox

    Joined:
    Aug 19, 2011
    Posts:
    619
    TerrainEngineNext V4 is done.
    A demo is available soon on discord.
    https://discord.gg/QNHqwznT

    This is one of multiple biomes available.
     
    officialfonee and DJ_Design like this.
  39. dyox

    dyox

    Joined:
    Aug 19, 2011
    Posts:
    619
    siliwangi, DJ_Design and Ruchir like this.
  40. DJ_Design

    DJ_Design

    Joined:
    Mar 14, 2013
    Posts:
    124
    Give us a ground slam, marvel style! Haha.
    This looks fantastic and the editing interface seems to have come a long way!
     
    dyox likes this.
  41. dyox

    dyox

    Joined:
    Aug 19, 2011
    Posts:
    619
    :D Thanks.
    V4.73 is ready.
    Working on Planets/Networking system.
    A new demo will be available on discord.
     
    DJ_Design likes this.
  42. neoshaman

    neoshaman

    Joined:
    Feb 11, 2011
    Posts:
    6,493
    Post the discord link back, it has expired
     
    dyox likes this.
  43. x4000

    x4000

    Joined:
    Mar 17, 2010
    Posts:
    353
    Here's a discord link that will never expire: https://discord.gg/aCCM4buv8R
     
    bb8_1 and dyox like this.
  44. dyox

    dyox

    Joined:
    Aug 19, 2011
    Posts:
    619
    Thanks.
    The new V4 demo will be available this week.
    I've finished the interface.
     
    Tethys likes this.
  45. dyox

    dyox

    Joined:
    Aug 19, 2011
    Posts:
    619
    Tethys and DJ_Design like this.
  46. fenix888

    fenix888

    Joined:
    May 20, 2021
    Posts:
    1
    Hello,
    I would like to test your Demo.
    Could you provide a valid link please?

    ( great job !!! )
    Thanks in advance.
     
    dyox likes this.
  47. dyox

    dyox

    Joined:
    Aug 19, 2011
    Posts:
    619
    V4 Demo is available on Discord, channel : "demo-feedback"
    Happy 2 years. I'm glad to still working on TerrainEngine and continue to improve it.


    V4.7 demo will be available soon.
     
    Last edited: Aug 9, 2021
    Tethys, SirStompsalot and siliwangi like this.
  48. dyox

    dyox

    Joined:
    Aug 19, 2011
    Posts:
    619
    TerrainEngineNext V4 Demo is available on Discord:
     
  49. Cactus_on_Fire

    Cactus_on_Fire

    Joined:
    Aug 12, 2014
    Posts:
    675
    The last demo looks great. I have a few questions about this asset.
    Does it support custom shaders like amplify shader editor where I can use triplanar tesselated displacement for these voxel terrains? What's the maximum voxel resolution that it can go without lagging? And can it place things like grass, trees and other prefabs automatically based on slopes of the terrains while sculpting it?
     
  50. eKyNoX

    eKyNoX

    Joined:
    Feb 4, 2013
    Posts:
    14
    Hello. Any update here?