Delta Engine Blog

All about multiplatform and game development

Delta Engine Editor exhibited at the Prototypenparty

Yesterday, the Delta Engine participated as a "prototyper" in an event called Prototypenparty (engl. "Prototype Party"). It is meant as an opportunity to let product developers test their creation by a variety of people of different backgrounds.















You can either attend as "prototyper" showcasing your product, or as a "feedbacker" who tries the stuff out and gives criticism. The Delta Engine, among 5 other prototypers, exhibited the editor to the ~ 40 feedbackers. 



By the way, the Prototypenparty itself is also a prototype, since it was hold for the first time. :) . Besides other software prototypes, service-, furniture- and product-prototypes where shown.



At the end of the evening, every feedbacker voted for his/her two favorite prototypes. The winner´s prize was a whole lot of bottles of this prototype beer, brewed by a "Kreativbrauerei" (= creative brewery) from Hamburg: 


(Photo taken from the Prototypenparty Facebook Page)


Sadly, we were not the winner :( . Nonetheless, we are happy about the interest we received. A warm "Thank you" to all feedbackers who took the time to try out the editor, talk to us and stated us their opinion. The next blog entry will show some more cool editor stuff. Stay tuned! :)


How to compose entities - Build a smiley out of Ellipse2D components

This is a small tutorial article from our wiki on how to create entities via our new system, more to come soon:

This article walks you through the steps of creating a custom entity with child entities using the Ellipse2D class. Everything you see here can also be done with the Editor by just dragging components and entity templates into your entity. The Smiley entity can be reused and be combined with any other component as well (rotate, scale, outline, physics, etc.)

The Ellipse2D class combines the following components (the same will be added if you drag in an Ellipse in the Editor):

  • Ellipse2DComponent for the ellipse x and y radius
  • Polygon2DComponent for the polygon points
  • As well as Vector2D for the position, Size (automatically calculated from the points) and Color
  • Many other components can be attached via the properties available in the Entity2D base class (Rotation, Scale, Outline, Pivot, etc.) or just by attaching more components like Image, GradientColor, Rotate, Velocity, Gravity, etc.

Let's build a new entity based on just that entity. Let's start with a unit test like in the other Tutorials:

1:
2:
3:
4:
5:
6:
[Test]
public void BuildSmileyEntity()
{
       
var smileyYellow = new Color(1.0f, 0.9f, 0.2f);
       
var smiley = new Ellipse2D(Vector2D.Zero, 0.25f, smileyYellow);
}

which produces just a yellow circle:

Next we should add 2 ellipses for the eyes and connect them to the parent circle:

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
[Test]
public void BuildSmileyEntity()
{
       
var smileyYellow = new Color(1.0f, 0.9f, 0.2f);
       
var smiley = new Ellipse2D(Vector2D.Zero, 0.25f, smileyYellow);
       
var leftEye = new Ellipse2D(new Vector2D(-0.05f, 0.1f), 0.02f, 0.04f, Color.Black);
       
var rightEye = new Ellipse2D(new Vector2D(0.05f, 0.1f), 0.02f, 0.04f, Color.Black);
        leftEye
.AddParent(smiley.Entity);
        rightEye
.AddParent(smiley.Entity);
}

For the mouth a simple ellipse is not going to cut it, but we can use a trick and just render 2 ellipses with the second smaller one overwriting the first one with yellow again, leaving just the mouth part in black. We should also render the eyes next. Keep in mind that doing this kind of fine-tuning is much easier with the Editor and should not be done in code, we just want to illustrate how things work here.

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
[Test]
public void BuildSmileyEntity()
{
       
var smileyYellow = new Color(1.0f, 0.9f, 0.2f);
       
var smiley = new Ellipse2D(Vector2D.Zero, 0.25f, smileyYellow);
       
var mouth = new Ellipse2D(new Vector2D(0, -0.0225f), 0.18f, 0.165f, Color.Black);
        mouth
.AddParent(smiley.Entity);
       
var mouthOverlay = new Ellipse2D(new Vector2D(0, 0), 0.185f, 0.165f, Color.White);
        mouthOverlay
.AddParent(smiley.Entity);
       
var leftEye = new Ellipse2D(new Vector2D(-0.05f, 0.1f), 0.02f, 0.04f, Color.Black);
        leftEye
.AddParent(smiley.Entity);
       
var rightEye = new Ellipse2D(new Vector2D(0.05f, 0.1f), 0.02f, 0.04f, Color.Black);
        rightEye
.AddParent(smiley.Entity);
}

 

and we are done. Now we are free to use that entity as many times as we want. Lets put it in a method and use it as a template for many more smileys rotating and scaling around on the screen. Keep in mind we do not want to change the Smiley template entity parameters programmatically, just define it once and then change whatever you want in the derived entities based on the template.

Also notice we added a Rotate component and TapGesture trigger with a ChangeColorAction (to Orange) when clicking on a smiley. Each entity created from the template will get all these features as well and any future improvements also.

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:

21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:

34:
35:
36:
37:
38:
[Test]
public void BuildSmileyEntity()
{
       
CreateSmiley();
}

private static Ellipse2D CreateSmiley()
{
       
var smileyYellow = new Color(1.0f, 0.9f, 0.2f);
       
var smiley = new Ellipse2D(Vector2D.Zero, 0.25f, smileyYellow);
       
var mouth = new Ellipse2D(new Vector2D(0, -0.0225f), 0.18f, 0.165f, Color.Black);
        mouth
.AddParent(smiley.Entity);
       
var mouthOverlay = new Ellipse2D(new Vector2D(0, 0), 0.185f, 0.165f, Color.White);
        mouthOverlay
.AddParent(smiley.Entity);
       
var leftEye = new Ellipse2D(new Vector2D(-0.05f, 0.1f), 0.02f, 0.04f, Color.Black);
        leftEye
.AddParent(smiley.Entity);
       
var rightEye = new Ellipse2D(new Vector2D(0.05f, 0.1f), 0.02f, 0.04f, Color.Black);
        rightEye
.AddParent(smiley.Entity);
        smiley
.Entity.AddComponent(new Rotate());
       
Scene.Current.AttachCommand(smiley.Entity, new TapGesture(),
          new ChangeColorAction());
       
return smiley;
}

[Test]
public void CreateManyRotatingAndScalingSmileys()
{
       
var smileyTemplate = CreateSmiley().ConvertToTemplate();
       
var random = Resolve<Randomizer>();
       
var allSmileys = new List<Polygon2D>();
       
for (int num = 0; num < 50; num++)
       
{
               
var smiley = new Polygon2D(smileyTemplate);
                smiley
.Position = new Vector2D(random.Get(-0.45f, 0.45f),
                   random.Get(-0.3f, 0.3f));
                smiley
.Scale = new Scale(random.Get(0.05f, 0.15f));
                smiley
.Rotation = random.Get(0, 360);
                allSmileys
.Add(smiley);
       
}
}

New Editor in Delta Engine


A few weeks ago we started boosting development of the Editor again and we are now catching up to expose new DeltaEngine features. Since the new content and entity systems have been built with the goal to enable easy editing via the Editor, we now see the new design coming together.
The properties of Templates and Entities can be changed via a few clicks and adding new content is as easy as a drag and drop.
The ContentManager of the Editor enables to see scenes and their nested content of other public projects and simply preview them so you can see how we did it or later even re-use some content in your projects. The sole purpose of the Editor is to make developing your games much easier and straight forward.
We are looking forward to see how you will use it and hear your feedback after the next release.

Game Development Tool Essentials book is out

Based on the book article Kirsten and me wrote 2 years ago a new book is out. Nice to see my name on a book cover again :)

The book has 220 pages and just 13 chapters and is a bit expensive at the moment. I suggest to wait until the price drops, the ebook is at least a bit cheaper.

Source code can be found in the DeltaEngine/Samples/Labyrinth directory when the next release is is out or on the book download page. The sample game will be available on the StarterKits page as well.

Automatic Mesh Optimizations via Triangle Welding

Not many news on the Delta Engine side, we have been very busy with an internal project that pays the bills. This is what this post is about. v1.2 is however a pretty good improvement over v1.0 and v1.1 and while not new platform or rendering features are coming (since no one is working on those at the moment) we have completely revamped entities (see last post) and the content system as well. Not only it is much easier to use and develop for, the editor is also in a much better state because of reduced functionality and much cleaner design. We are pretty proud and are planning the v1.2 release after our internal project is done in 1-2 months.

From the new "Automatic Mesh Optimizations via Triangle Welding" article in our public wiki:

Goal: Optimize imported complex 3D data from 180k vertices (140k triangles) to ~20k vertices (~30k triangles)

For an internal project we were given huge meshes with tons of vertices (180k unique vertices per mesh) to be rendered on mobile devices (especially slower Android devices, if possible multiple big meshes visible like 3-10). The process of importing needs to be automatic as we do not know which geometry is going to be imported and rendered, for just one geometry a human 3D modeler can obviously redo the geometry and bring it down to a reasonable polygon count. We found no good tool to do this either manually or programmatically, so we had to write our own library for it (not enough open source in the world as I am sure people have done this before). Rendering performance was really bad since each mesh had to be subdivided into 14 materials as well and some needed too many vertices to keep in index buffers with shorts.

Long story short we did 2 things: First we welded the vertices, everything closer than 0.25cm was collapsed into one vertex point, which reduced the mesh 40%. Next we also started welding triangles, which is much more difficult and constantly destroyed our geometry (while it is nice to have 90% merged, that is not really useful if it does not look like the original anymore). This is why we put a lot of extra checks in place to not merge any corner triangle points away and keep the outlines intact and sharp corners as well, but otherwise everything below 10cm (up to 50cm for straight lines) and below 22.5 degrees is collapsed into bigger triangles.

We are still testing, but in some tests we can get rid of 80% of the triangles, we will update this once we have tested it with huge geometries as well (quite slow, needs optimization and we are still refactoring, tests look good so far). All the code sits in the content service of the Delta Engine, so you won't find it in the rendering code of the Delta Engine.

Read the wiki entry for the rest of the article.