Hi! I was accepted to build a Crystal Space World Editor for Google Summer of Code this summer.
A little about me: I'm an 18-year-old computer engineering major at University of Maryland. My main interests beside computers are classical guitar and biking.
In this blog I'll post my ideas and progress on this project. Comments and suggestions will be greatly appreciated.
Here is the abstract as given in the proposal:
Crystal Space, being a 3d engine, deserves a good art pipeline so that applications using it can focus on creating assets, not editing world files by hand. Having worked on several game projects using CS over the past 2 years, I have experienced directly the difficulty of getting art into the engine. I would like to help take a huge step in improving it by creating a usable world editor.
The editor should have a completed framework by the end of the work period, including a working plugin system, undo/redo system, selection system, tool system, save/load functionality, scene browser, factory browser, and property editor. Also, basic selection and transform tools will be implemented. Any remaining time will be used to polish the user interface or implement tools for other CS features, such as terrain.
The project is currently in the design stage, but the ideas are becoming more focused.
Here is some of the progress so far.
Name of the editor
We had nearly an hour-long name-throwing session on IRC about this, but I don't think any of them stuck. The consensus seems to be that the name shouldn't be too serious. Some highlights: Ochre, Composotron IV, Crystal Latte, Crystachino, Deity for Dummies, Quartz, Chainspoon, Turbospoon, CrystalGarden, Plow, Colloid Space. I would choose Anvil, but it is already the name of my old editor. Maybe Anvil Reloaded? ;) Any more ideas?
The editor will use wxWidgets as a GUI library.
I'll use wxAUI and wxPropertyGrid widgets. wxAUI is a really nice docking toolkit that should give a very flexible, modern-looking interface. wxPropertyGrid will be great for the property editor.
wxAUI has been included in wxWidgets 2.8.0+, but wxPropertyGrid is a contrib widget. To handle the dependency, the editor will probably require wxWidgets 2.8.0+ and wxPropertyGrid will be included in the source tree.
I'll use wxFormBuilder to design the more complex dialogs for the editor (options, material editor, etc) and save them as XRCs. The main window will be done in code, using wxAUI.
Tools allow the interface to remain consistent when switching between different editing functions. Tools will handle events like mouse move, mouse click, keyboard press, and draw to allow for extra information to be drawn on top of the scene. Examples of tools are select, move, rotate, scale. Plugins can also add tools. Tools will be available through a toolbar. In addition, tools can provide a panel for tool-specific settings.
There are several types of tools.
Mesh-specific tools: These tools will be shown based on the type of the selected object.
e.g. for particle system editor, an emitter editor. For a terrain editor, a tool to modify heights with a brush.
Creation tools: Tools which create things, e.g. a tool which creates mesh primitives, or a tool which creates an initial flat terrain.
One-shot tools: Tools which perform one "non-interactive" action, like "compress vertices" or "generate normals".
The scene browser is basically a tree that will show all of the instances in the world file (e.g. all the stuff that goes in between <sector> tags).
There could possibly be multiple "view modes" for this: Group by sector, group by object type, sort alphabetically.
Plugins should be able to add 3rd party types to the scene browser (e.g. CEL entities).
This should show some of the files that the world file depends on. It will allow you to link or unlink libraries to the world file.
Formerly named "factory browser", the assets browser will allow you to browse through mesh factories, materials, etc. It should allow you to remove them, or edit their properties when selected (in property editor). Adding mesh factories can be accomplished through importing or linking to a library. Or you can use a tool which creates primitives.
This will show all of the available mesh factories, rendered to textures. The selected one will show a rotating preview.
This will show all of the available materials rendered on tiny spheres. You should also be able to create an empty material from here.
With all of these browsers, there seems to be a commonality between them: they generally provide a view of a certain category of objects, and when selected, they should publish an event to listeners, including the property editor which will allow you to edit the selected object. It seems like they could share a lot of code.
There will be a property editor shown for the selected object.
I will need to implement some custom property types, including one for matrices.
Another thing I would like is a "link" to another object. It would basically allow you to choose one of the available objects of that type. And it will allow you to follow the link and show the linked-to object in the property editor. For example, the mesh instance property editor will have a link property "Material", which will allow you to choose which material is used for the mesh.
Since the saver doesn't fully support saving all CS objects, and since it is desirable to preserve comments in the world files, I'll be supplementing the loader to attach the original DOM nodes to engine objects when they are loaded (and only when the saveable flag is on). The editor will then keep track of which objects are modified, and only save those. This means that all unsupported nodes will be preserved. A main failure of the current way of using the saver is that it obliterates any unsupported nodes. Judging by the rate at which the loader advances versus the rate at which the saver plugins advance, this will be necessary for some time.
The sooner this is implemented, the sooner the editor will be useful for making small tweaks to existing world files. So I do regard it as quite important, although it is not trivial.
Whew! There are a lot of ideas there. I hope I get some good feedback on this.
I still have approximately 2 more weeks of school, so I'll be trying to think of this and post when I'm not taking exams. Then, summer! :)