tag:blogger.com,1999:blog-43682549151763313272024-03-05T07:09:19.537+01:00Zaria Dev BlogLeshyhttp://www.blogger.com/profile/01002176403431250667noreply@blogger.comBlogger20125tag:blogger.com,1999:blog-4368254915176331327.post-85179734552523044262020-03-10T22:49:00.001+01:002020-03-10T22:49:11.145+01:00TRVE KVLT<h2>
Small PSA</h2>
As the development of the isometric RPG is progressing, it needs have its own proper identity.<br />
Therefore all development on the game itself will be done under the name of the game studio I'm setting up:<br />
<span style="font-size: x-large;"><br /></span>
<div style="text-align: center;">
<b><span style="font-size: x-large;">TRVE KVLT GAMES</span></b></div>
<div style="text-align: center;">
<b><span style="font-size: x-large;"><br /></span></b></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBHczxS4G-XG8QyWRb-FRcjqNe6mgcK7b31HhGemvvsruHxnKVsIMt2fhObebadsbfr9U3VBJhnhWjecu8UxhZ3XwvjFyB6bipO_pxzGFhmIf9ukz7wMPB9f3JN6QjvkfZGJ5CIjTizwo/s1600/trvekvlt_new+%25281%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="634" data-original-width="634" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBHczxS4G-XG8QyWRb-FRcjqNe6mgcK7b31HhGemvvsruHxnKVsIMt2fhObebadsbfr9U3VBJhnhWjecu8UxhZ3XwvjFyB6bipO_pxzGFhmIf9ukz7wMPB9f3JN6QjvkfZGJ5CIjTizwo/s400/trvekvlt_new+%25281%2529.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
That also means this blog will only post info about the Zaria Game Framework and general Game Development and Tech stuff.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
For more info on the game and the studio:</div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<ul>
<li>Webpage: <a href="http://trvekvlt.eu/" target="_blank">http:/trvekvlt.eu</a></li>
<li>Blog: <a href="https://trvekvltgames.blogspot.com/">https://trvekvltgames.blogspot.com/</a></li>
<li>Twitter: <a href="https://twitter.com/TrveKvltGames">https://twitter.com/TrveKvltGames</a></li>
<li>Instagram: <a href="https://www.instagram.com/trve_kvlt_games/">https://www.instagram.com/trve_kvlt_games/</a></li>
</ul>
Leshyhttp://www.blogger.com/profile/01002176403431250667noreply@blogger.com0tag:blogger.com,1999:blog-4368254915176331327.post-16714417801652510232020-03-10T22:39:00.001+01:002020-03-10T22:39:29.184+01:00Split ViewThe work on the isometric RPG is progressing quite well. Even though the scope of the game is fairly limited the amount of assets that needs to be created is staggering. Given the limited resources I have, the only way to progress is to automate as much as possible and optimise every step of the creation process. To that end I have created a large amount of template assets as well as scripts which are used to process them. <div>
<br /></div>
<div>
And although I will write more about the process and automation I have employed. This post is about editing scripts. </div>
<div>
<br /></div>
<div>
So far I have been using mostly three text editors:</div>
<div>
<ul>
<li><a href="https://netbeans.apache.org/" target="_blank">NetBeans</a> (for Java code)</li>
<li><a href="https://atom.io/" target="_blank">Atom</a> (for Python, GLSL and bash)</li>
<li>Zone Editor (for game and editor scripting)</li>
</ul>
Out of those three the last one is the least mature and when I continue developing the game a find more and more features I feel like adding which are already present in the other two. Recently I found myself editing older scripts and needing a lot of others for reference, which resulted with <b>a lot</b> of tab switching. I wished I had more than one script on screen. Therefore the latest addition to the Zone Editor is the split view.</div>
<div>
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTT5AOhkbCWsDeKHbSFTdcFyQn22FLFTzJejJFMUiHvPq1CMAvrXwLk99r_u0d8f4WXb07tIQBQt-pD3G68COJylJzdetKo2AmgGTX8dcWkkIr0EbH0fTQwOGKaqjNZOtGTcZOyuyHx6I/s1600/Screenshot+from+2020-03-10+00-32-15.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="901" data-original-width="1600" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTT5AOhkbCWsDeKHbSFTdcFyQn22FLFTzJejJFMUiHvPq1CMAvrXwLk99r_u0d8f4WXb07tIQBQt-pD3G68COJylJzdetKo2AmgGTX8dcWkkIr0EbH0fTQwOGKaqjNZOtGTcZOyuyHx6I/s640/Screenshot+from+2020-03-10+00-32-15.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">You are now able to edit two scripts or asset files at the same.</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNvBkv0bHzKI5rIN-AUz8J2QZpL2V7Ui-YhZHit9jQ_IjNgOQCRlwOGjSMJHIQEtEDfBpS1MbOHfPMBRaJle-0sqOWppVeZi8rSya8XIIRqJb3z96cJiiZThbX6svKiTlqPfN8GEHSXq4/s1600/Screenshot+from+2020-03-10+00-33-38.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="901" data-original-width="1600" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNvBkv0bHzKI5rIN-AUz8J2QZpL2V7Ui-YhZHit9jQ_IjNgOQCRlwOGjSMJHIQEtEDfBpS1MbOHfPMBRaJle-0sqOWppVeZi8rSya8XIIRqJb3z96cJiiZThbX6svKiTlqPfN8GEHSXq4/s640/Screenshot+from+2020-03-10+00-33-38.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">It's also possible to have one file in graph view while another is in text view.</td></tr>
</tbody></table>
<div>
Of course you move tabs around and all of the menus are sensitive to the state and type of file that is currently in focus.</div>
<div>
<br /></div>
<div>
There are many other modifications I need to do. However given how the editor is structured it is fairly easy it extend and improve.</div>
Leshyhttp://www.blogger.com/profile/01002176403431250667noreply@blogger.com0tag:blogger.com,1999:blog-4368254915176331327.post-91023602736324712812019-07-16T01:56:00.000+02:002019-07-16T01:56:22.386+02:00Printing!I always found it useful to have something tangible in my hand when trying to solve issues or debugging. I've been known to print out code or game data just to have a condensed overview of what it is I'm working with.<br />
<br />
At some point I figured it might actually be useful to be able to print out game data directly from the game editor. It might be even better if the data was formatted in an easy to read way.<br />
<br />
So... After a couple of evenings looking through how printing in Java works, and trying out different approaches, finally the Zone Editor has a proper printing feature :)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeET6Wsf6M-WBw-pEDZuPBgbYmtDpUfXOC-CZFqJdx-uFfJftuck1a4dyRWiiL5P3gRuPTMnyx3mE2PAanIR4juaKjOPnzg1xDZd3W9IyCds9m2STO94fGNQtDZaBjt93_xuxDqc-jJHU/s1600/Screenshot+from+2019-07-16+00-07-32.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1080" data-original-width="960" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeET6Wsf6M-WBw-pEDZuPBgbYmtDpUfXOC-CZFqJdx-uFfJftuck1a4dyRWiiL5P3gRuPTMnyx3mE2PAanIR4juaKjOPnzg1xDZd3W9IyCds9m2STO94fGNQtDZaBjt93_xuxDqc-jJHU/s640/Screenshot+from+2019-07-16+00-07-32.png" width="568" /></a></div>
<br />
It prints out the data in a hierarchical way, where definitions which are linked to are shown next to the field they are being linked from. The result looks a bit like YAML, but is only meant for human readability. The actual data is still stored in the form of (customized) JSON.Leshyhttp://www.blogger.com/profile/01002176403431250667noreply@blogger.com0tag:blogger.com,1999:blog-4368254915176331327.post-39118378694951137222019-07-11T00:23:00.000+02:002019-07-11T00:38:46.075+02:00Automating Asset Creation<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVtjZ-BoiCi5xf32AAmCTgDrcwMky0mw5694nZPmAYQoTTkiV07mFZRJW-sNnBXWn_i6m9YHqpbS_CtB_HSDeLulKGX7R3J_u_olVYwUNgQwMk9wHV3h6hraAG7oUoT4ioeDxUOZRilzc/s1600/run.gif" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="512" data-original-width="512" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVtjZ-BoiCi5xf32AAmCTgDrcwMky0mw5694nZPmAYQoTTkiV07mFZRJW-sNnBXWn_i6m9YHqpbS_CtB_HSDeLulKGX7R3J_u_olVYwUNgQwMk9wHV3h6hraAG7oUoT4ioeDxUOZRilzc/s400/run.gif" width="400" /></a></div>
I really hate repeating tasks.<br />
<br />
That's one of the reasons why creating art assets can be such a drag for me: because a lot of actions need to be repeated over and over (plus the requirement for manual precision, but that's a different story).<br />
<br />
Thankfully most of the tools out there can be automated to some extent. Allowing for certain tasks to be scripted out, rather than clicked/typed out again and again.<br />
<br />
Good case study would character animation in the isometric RPG I'm working on right now:<br />
<ul>
<li>Each character has 29 animations.</li>
<li>Each animation requires 8 sides to be rendered.</li>
<li>All individual sprites need to be added to a texture atlas.</li>
<li>Sprites in the texture atlas need to have empty margins removed, in order not to store useless information. </li>
<li>The texture atlas itself needs to be compressed. </li>
<li>Texture atlas requires information for the game engine where all sprites are. </li>
<li>Animations need to be mapped to actions in game.</li>
<li>Animations need to be mapped to specific directions in the isometric world. </li>
<li>Certain animations need to be marked as looping.</li>
<li>Certain animations need to be mapped to tags, which are used to start animations in-game "by type".</li>
</ul>
That is <b>a lot</b> of work. Manually that would be days. Even worse if mistakes were made.<br />
<br />
And believe me, initially I did all of this by hand. But with every character I would automate more and more. And at this point adding a new character in game takes about 45 minutes, instead of days, out of which most is waiting for scripts to finish.<br />
<br />
What I would like to show here is specific to my use case (2D isometric RPG using my Zaria Framework). However the logic and principles can be adapted to pretty much everything. Plus I'll add some useful Blender Python scripts.<br />
<br />
<h2>
1. Prequisites</h2>
First of all some preparation.<br />
<br />
What we will be doing here, is importing a humanoid character and applying to it already prepared, rigged skeletal animations.<br />
<br />
Therefore we will need a character model. In this case, a royalty free model in FBX format, in the (kind of) T-pose. <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNDJAumQnIMpKpyssKp3iE_GrhmbMPjPgiqr9myJlGS92XamHe9JuM4zcg4ymgwlJu_g1q6XIYHDpTCqeTai_SBgt9kPmsGUwncgSZlSBtzgPlV0pTmjgX2_QNCx0C-7bGLXrAbckz2z0/s1600/char.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="645" data-original-width="493" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNDJAumQnIMpKpyssKp3iE_GrhmbMPjPgiqr9myJlGS92XamHe9JuM4zcg4ymgwlJu_g1q6XIYHDpTCqeTai_SBgt9kPmsGUwncgSZlSBtzgPlV0pTmjgX2_QNCx0C-7bGLXrAbckz2z0/s400/char.png" width="305" /></a></div>
<br />
We will also need all of the animations used, set up for a base character. With the camera positioned at the proper angle and distance as well. <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8NWqF7x6pIIT48iIR90vU705Lubb-2zFRTnyYZaavFbVFTNpMqWQulkH0xe5HEIlF_VEIcM7wSeSiomfsV2P1EPo6tMNcpxVZ-M_ZLJIyVkZxLSX7B_5YZ9JKqmZRkjuFCMozbn5aj-w/s1600/animations.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="850" data-original-width="1144" height="474" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8NWqF7x6pIIT48iIR90vU705Lubb-2zFRTnyYZaavFbVFTNpMqWQulkH0xe5HEIlF_VEIcM7wSeSiomfsV2P1EPo6tMNcpxVZ-M_ZLJIyVkZxLSX7B_5YZ9JKqmZRkjuFCMozbn5aj-w/s640/animations.png" width="640" /></a></div>
<br />
Essentially what we will be doing, is substituting the character in the base animations for the new imported character, using the existing rig and rendering for all 8 directions.<br />
<br />
<br />
<h2>
2. Mixamo</h2>
For the second step we will be using <a href="https://www.mixamo.com/" target="_blank">Mixamo</a>. Its auto-rigger is just the help we need. The additional fact of having A LOT of good looking animations ready to use, makes it even more appealing of a tool.<br />
<br />
If you have a different way of preparing rigged characters in a consistent manner, you can skip this step. <br />
<br />
To get the model correctly into Mixamo it needs to be exported as FBX, with only the mesh and texture inside.<br />
<br />
Thankfully Blender can do just that. Just click export to FBX and use the settings below:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBKlNlfBeXEq1LidUKCBuOLR2q-772kBKTz0VsGfvCMwXX2KVt20nPYYmQGXfGzaQEg_3au9zCE7ojB1KmcobwkdAL09XnuWXl5Q7kqb7GKB1WgtJcpnQIjzPPzt_8i9RxDcZ65GhMwZ4/s1600/fbx_export.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="584" data-original-width="468" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBKlNlfBeXEq1LidUKCBuOLR2q-772kBKTz0VsGfvCMwXX2KVt20nPYYmQGXfGzaQEg_3au9zCE7ojB1KmcobwkdAL09XnuWXl5Q7kqb7GKB1WgtJcpnQIjzPPzt_8i9RxDcZ65GhMwZ4/s400/fbx_export.png" width="320" /></a></div>
One of the most important elements being setting <b>Path Mode</b> to <b>Copy</b> and making sure that textures are packed inside the output file (icon next to <b>Path Mode</b>).<br />
<br />
<br />
When uploading to Mixamo you will be asked to locate a set of main bones, for the auto-rigger to kick in.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgu0V53fgfMgoNjcp7wnQ1d9QsK5BMLoz0bvQ-2eX6d7C_b0UJxB-XQelJ5YkryXIySbOW8nrH7RRMRZpO0dXjI9gFlrxfEARsVCfENvh5TVOwg22UVzIMH2Aj5_seWsEtYvv_tscT8nO4/s1600/autorig.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="657" data-original-width="998" height="419" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgu0V53fgfMgoNjcp7wnQ1d9QsK5BMLoz0bvQ-2eX6d7C_b0UJxB-XQelJ5YkryXIySbOW8nrH7RRMRZpO0dXjI9gFlrxfEARsVCfENvh5TVOwg22UVzIMH2Aj5_seWsEtYvv_tscT8nO4/s640/autorig.png" width="640" /></a></div>
<br />
Once that is done, download the rigged T-pose as FBX.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<h2>
3. Blender</h2>
Now that our model is rigged exactly as our prepared animations, we can run some magic Blender Python scripts.<br />
<br />
This one imports the input FBX file into the input blend scene and substitutes already existing model for the imported one. The way it does that, is relying on names, therefore naming of (at least) the model root needs to be consistent in all animations.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiM4Ex3ZJshdOfqn5M-PHkk_qOLvXK6Nzis86G-d6D6wXkdkm145TGg9Ei0HPJzmVTBze6IbPTjvs6vuajhZyN42FcSkFAkJlrF_k8qPYMB0VcQE2FWy53_BR55BUiiKXJbnRJDVNoYSOo/s1600/import_blender_script.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="900" data-original-width="1600" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiM4Ex3ZJshdOfqn5M-PHkk_qOLvXK6Nzis86G-d6D6wXkdkm145TGg9Ei0HPJzmVTBze6IbPTjvs6vuajhZyN42FcSkFAkJlrF_k8qPYMB0VcQE2FWy53_BR55BUiiKXJbnRJDVNoYSOo/s640/import_blender_script.png" width="640" /></a></div>
Source: <a href="https://wtools.io/paste-code/y3A" target="_blank">https://wtools.io/paste-code/y3A</a><br />
<br />
This script renders all frames of an animation into png files. It also takes into consideration all of the directions. What is also important here, is that the naming is consistent. Each animation, for each direction, has the same name for each character. This will be useful later.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixEWWPuvnt92iGYuO8sMdlq58OeecogNYN_4wRugVR9yDmFVwkAOkHHeUf8nl0r1JN4Eg4w42vV-tAi-n9R1RMb9p3CnfLMgY44Wbu74Qh5BbjYxu2lrPFqMIlwMABSvdyFYzUOvtkL0k/s1600/character_blender_script.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="900" data-original-width="1600" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixEWWPuvnt92iGYuO8sMdlq58OeecogNYN_4wRugVR9yDmFVwkAOkHHeUf8nl0r1JN4Eg4w42vV-tAi-n9R1RMb9p3CnfLMgY44Wbu74Qh5BbjYxu2lrPFqMIlwMABSvdyFYzUOvtkL0k/s640/character_blender_script.png" width="640" /></a></div>
Source: <a href="https://wtools.io/paste-code/y3B" target="_blank">https://wtools.io/paste-code/y3B</a><br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
Finally we will run the scripts.<br />
<br />
I ran them from a bash script which would run the first (to create the animation blend file) and the the other (to create the animation frame sprites) for all blend files in the input directory.<br />
<br />
I also ran two of them at the same time to max out all of my processor cores.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwRw3d0CtKknEniVCTHlbUoLhmF2Z4qWemNCsoWlKMadw42qQ80vVj-daE-0V9ma7b5g44wyxTeb4M5-QCX1NfAVaEaqXxc1iA-QXSlWU0J2H6Mp-DzdAusk0CNp6rfcTyHtPO7S5qjBo/s1600/script_to_run.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="900" data-original-width="1600" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwRw3d0CtKknEniVCTHlbUoLhmF2Z4qWemNCsoWlKMadw42qQ80vVj-daE-0V9ma7b5g44wyxTeb4M5-QCX1NfAVaEaqXxc1iA-QXSlWU0J2H6Mp-DzdAusk0CNp6rfcTyHtPO7S5qjBo/s640/script_to_run.png" width="640" /></a></div>
Source of the bash script: <a href="https://wtools.io/paste-code/z1q" target="_blank">https://wtools.io/paste-code/z1q</a><br />
<br />
Here are both scripts hard at work.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdpOt3XxGeWZk50a0VFGjCuVd3HlQssYwLNelIFnNoEwRoVtSUqMHqRVG7mV3aZR1RSuconlSC-xtQZPu3SCksl1qsfiN_dZTVU25TLjgXYXyxmxUrcuQ7MinGhck8fDfDHM11Cds1qqI/s1600/script_running_01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="900" data-original-width="1600" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdpOt3XxGeWZk50a0VFGjCuVd3HlQssYwLNelIFnNoEwRoVtSUqMHqRVG7mV3aZR1RSuconlSC-xtQZPu3SCksl1qsfiN_dZTVU25TLjgXYXyxmxUrcuQ7MinGhck8fDfDHM11Cds1qqI/s640/script_running_01.png" width="640" /></a></div>
<br />
The processor usage is quite significant. I found that running two of them at the same time is most optimal. And in my case generating all sprites took about 20 minutes.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAj318uzz6C5FXyX0nxIpGPxb6BwvcRNIeR8I2ceH5aKKgnGnKGOw9GFYbkZv8h8Q-HCMDTOHd60Oq-ibuOT27OcnvMKF7HXxnqSMbc7eIxn1hYbchG9EvDBQmuMC-x8HWgSPGciMQQFM/s1600/blender_cpu.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="900" data-original-width="1600" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAj318uzz6C5FXyX0nxIpGPxb6BwvcRNIeR8I2ceH5aKKgnGnKGOw9GFYbkZv8h8Q-HCMDTOHd60Oq-ibuOT27OcnvMKF7HXxnqSMbc7eIxn1hYbchG9EvDBQmuMC-x8HWgSPGciMQQFM/s640/blender_cpu.png" width="640" /></a></div>
<br />
The result ended up being over 7000 frames of animation.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYQ9VLceIGIb0TXGhf8pEyYQ9ThDyyKD89BZfoGbYKiRGw1JFGg7rgdy45ijvQhKLAGvFU98HulwK5wfiNtiGEySdKfje-iyai47jIdj3Rprf2298e39isp-WsIS1hVaI5CvabA20dou4/s1600/sprites.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="900" data-original-width="1600" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYQ9VLceIGIb0TXGhf8pEyYQ9ThDyyKD89BZfoGbYKiRGw1JFGg7rgdy45ijvQhKLAGvFU98HulwK5wfiNtiGEySdKfje-iyai47jIdj3Rprf2298e39isp-WsIS1hVaI5CvabA20dou4/s640/sprites.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<h2>
4. Zone Editor: Texture Atlas</h2>
Now that we have all animation frames, we need to put them in a single texture. As this is a 2D game, graphics memory will be used heavily. Therefore we need to optimize our textures as much as possible.<br />
<br />
For that we will be using the Texture Atlas Builder in the Zone Editor.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdqLmjHhV4ScIS5_FiwnKD_ZqnXwWTb2GXuNy-vFpLyZ_AjQkVqPcR5IpeA-TSCtYwnPxhTC1nASvI5XRZ3E7d3RVEFulA77vTu_gR7t1_CCueGT2D0cegTNM2qrbNdkh7eeUN1gIj0hk/s1600/atlas_running.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="900" data-original-width="1600" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdqLmjHhV4ScIS5_FiwnKD_ZqnXwWTb2GXuNy-vFpLyZ_AjQkVqPcR5IpeA-TSCtYwnPxhTC1nASvI5XRZ3E7d3RVEFulA77vTu_gR7t1_CCueGT2D0cegTNM2qrbNdkh7eeUN1gIj0hk/s640/atlas_running.png" width="640" /></a></div>
<br />
It has a number of ways to optimize the texture:<br />
<ul>
<li>It removes all duplicate frames.</li>
<li>It cuts out all of the empty margins from all of the images.</li>
<li>It can compress the texture using DXT. </li>
</ul>
Additionally it creates data structures, that are read by the game, which map specific parts of the image to specific animation frames.<br />
<br />
The process (especially looking for duplicates part) can be quite CPU heavy, and take a good while. However it is definitely worth it.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAj318uzz6C5FXyX0nxIpGPxb6BwvcRNIeR8I2ceH5aKKgnGnKGOw9GFYbkZv8h8Q-HCMDTOHd60Oq-ibuOT27OcnvMKF7HXxnqSMbc7eIxn1hYbchG9EvDBQmuMC-x8HWgSPGciMQQFM/s1600/blender_cpu.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="900" data-original-width="1600" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAj318uzz6C5FXyX0nxIpGPxb6BwvcRNIeR8I2ceH5aKKgnGnKGOw9GFYbkZv8h8Q-HCMDTOHd60Oq-ibuOT27OcnvMKF7HXxnqSMbc7eIxn1hYbchG9EvDBQmuMC-x8HWgSPGciMQQFM/s640/blender_cpu.png" width="640" /></a></div>
<br />
The result is a 8192x4096 pixels texture.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwDVzNe6b3STCQ9mkTtFKq-FJpRa_luYoNrPjIFPDhM5ShsRKHYelbosuMWcb_K3OBRMCytp2VvaZAD0Y4pVIZZHdJVqQ8OmM308vkWglIgBfbpPbPwcFrtEbUsLxpYeqKbHA3mRqdsZw/s1600/atlas_full.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="900" data-original-width="1600" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwDVzNe6b3STCQ9mkTtFKq-FJpRa_luYoNrPjIFPDhM5ShsRKHYelbosuMWcb_K3OBRMCytp2VvaZAD0Y4pVIZZHdJVqQ8OmM308vkWglIgBfbpPbPwcFrtEbUsLxpYeqKbHA3mRqdsZw/s640/atlas_full.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Some closeup on the result:</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2NJJQr4jD_JuIJEQwB6LHeWU9c-I46N6UWuE4w_qq6UT0aAIKS2w7twf51c8Z5ZUsZg_ckTG-DNIdjKR4jb_aN1L_1oB729nCgcdtWqszNLIH1OR2CttdfY56ftb1wXGxdWXmuU8C0BQ/s1600/atlas_close.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="900" data-original-width="1600" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2NJJQr4jD_JuIJEQwB6LHeWU9c-I46N6UWuE4w_qq6UT0aAIKS2w7twf51c8Z5ZUsZg_ckTG-DNIdjKR4jb_aN1L_1oB729nCgcdtWqszNLIH1OR2CttdfY56ftb1wXGxdWXmuU8C0BQ/s640/atlas_close.png" width="640" /></a></div>
<br />
<h2>
5. Zone Editor: Game Assets</h2>
The final piece of the puzzle is putting all of this together.<br />
<br />
At some point during development I realized that I'm doing a lot of very mundane things in the Zone Editor. Hooking up components to objects, setting animation transitions etc. I realised that all of that can be automated. So I decided to reuse the script engine (based on Java Script) I put in the game, in the editor to be able to automate it's functions.<br />
<br />
With the API I created, in practice anything that can be done through the UI can be scripted out. This turned out to be very powerful and very useful.<br />
<br />
In this case we will be running script that sets up all of animation related data for a character. It will set up which frames correspond to which logical animations, set up animation events and transition animations.<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKICSbcJ5PQhe3xNZQJQkPvt8Iel8kT-tIlhRJdgwoiG69ObhC9v_aE5TwoSiavP8xugnC9e_rxQyBBDXK-T9JDj88fMNlUuXpVjX1sPfDa78M8FfddxUJwXxIJsW_UnXfgjYivkpybaE/s1600/logic_script.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="900" data-original-width="1600" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKICSbcJ5PQhe3xNZQJQkPvt8Iel8kT-tIlhRJdgwoiG69ObhC9v_aE5TwoSiavP8xugnC9e_rxQyBBDXK-T9JDj88fMNlUuXpVjX1sPfDa78M8FfddxUJwXxIJsW_UnXfgjYivkpybaE/s640/logic_script.png" width="640" /></a></div>
Sources for the editor scripts: <br />
<ul>
<li><a href="https://wtools.io/paste-code/z1J">https://wtools.io/paste-code/z1J</a></li>
<li><a href="https://wtools.io/paste-code/z1K">https://wtools.io/paste-code/z1K</a></li>
<li><a href="https://wtools.io/paste-code/z1L">https://wtools.io/paste-code/z1L</a></li>
<li><a href="https://wtools.io/paste-code/z1M">https://wtools.io/paste-code/z1M</a> </li>
</ul>
The result was creation of all required data structures that define animations for new characters:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8pdVBQfFuJOz7_oI4KZ8neVmgvSWgGobVagpo-leIdBnkQtQaffzNGxVZPCnqOAQyKbgZnOO_CUgFcwnMst_OOYhHobxIElsiiA01YNAhGA-nAc4bcTWFnhMkIkW7DxTWxCqzyOTT3dg/s1600/motion_control.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="900" data-original-width="1600" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8pdVBQfFuJOz7_oI4KZ8neVmgvSWgGobVagpo-leIdBnkQtQaffzNGxVZPCnqOAQyKbgZnOO_CUgFcwnMst_OOYhHobxIElsiiA01YNAhGA-nAc4bcTWFnhMkIkW7DxTWxCqzyOTT3dg/s640/motion_control.png" width="640" /></a></div>
<br />
<br />
With the characters being available in game soon after:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjd15wYYGVrV8il0BsLD1YEyg7EdG60gtJwRRIi4Stz4CIsDgWj2AXARV8VnhwW107gqDO8_-u8Tcl2tI0RjlDbfrQY4nL-S7wL_4j16LH8yClsVcY2zPNXFDyq7yCsWwAuAb5ll2zcaHE/s1600/Screenshot+from+2019-07-10+22-59-22.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="931" data-original-width="1600" height="372" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjd15wYYGVrV8il0BsLD1YEyg7EdG60gtJwRRIi4Stz4CIsDgWj2AXARV8VnhwW107gqDO8_-u8Tcl2tI0RjlDbfrQY4nL-S7wL_4j16LH8yClsVcY2zPNXFDyq7yCsWwAuAb5ll2zcaHE/s640/Screenshot+from+2019-07-10+22-59-22.png" width="640" /></a></div>
<br />
<h2>
6. Conclusion</h2>
In short: <b>Anything that can be automated should be automated.</b><br />
<br />
Employing this process saves me days of work for initial setup as well as for any further tweaks.<br />
<br />
It is not perfect however. Some models might need some tweaking for some animations, due to mesh deforming imperfectly. Even that being the case, the minority of animations for which this happens, can be tweaked and with the used scripts re-rendered quite quickly. Leshyhttp://www.blogger.com/profile/01002176403431250667noreply@blogger.com0tag:blogger.com,1999:blog-4368254915176331327.post-27552463089042596512018-11-05T21:37:00.001+01:002018-11-05T21:37:31.612+01:004C PragueIn October I had a opportunity to speak at the <a href="http://conf4c.com/en/" target="_blank">4C</a> again, this time in Prague.<br />
I talked about a topic I find fascinating, which is Narrative System Design.
<br />
<br />
<center>
<iframe allowfullscreen="" frameborder="0" height="504" src="https://www.youtube.com/embed/wPb-eZJL9v4" width="896"></iframe></center>
<br />Leshyhttp://www.blogger.com/profile/01002176403431250667noreply@blogger.com0tag:blogger.com,1999:blog-4368254915176331327.post-40801180904697179422018-05-18T00:23:00.002+02:002018-05-18T00:24:00.008+02:00DevGAMM Kyiv 2018At the beginning of February I travelled to Kyiv to speak again at <a href="http://devgamm.com/" target="_blank">DevGAMM</a>.<br />
As usual it was an amazing, fun and friendly event. I'm really, really grateful I was invited there again.
This time I talked about the early days - the prototyping phase of development of <a href="https://www.guerrilla-games.com/play/horizon" target="_blank">Horizon Zero Dawn</a>.
<br />
<br />
<center>
<iframe allowfullscreen="" frameborder="0" height="504" src="https://www.youtube.com/embed/llgzqm2MM4o" width="896"></iframe></center>
<br />Leshyhttp://www.blogger.com/profile/01002176403431250667noreply@blogger.com0tag:blogger.com,1999:blog-4368254915176331327.post-25014347456899513462018-05-18T00:17:00.000+02:002018-05-18T00:23:56.381+02:004C St. PetersburgBetween 22th and 23rd of September I had the privilege of speaking at <a href="http://conf4c.com/" target="_blank">4C</a> conference in St. Petersurg.<br />
Apart from seeing this beautiful city I met wonderful Russian devs and people from <a href="http://eu.wargaming.net/" target="_blank">Wargaming.net</a> who organized the conference.
I talked about the Evolution of the Decima Engine from <a href="https://killzone.com/" target="_blank">Killzone</a> to <a href="https://www.guerrilla-games.com/play/horizon" target="_blank">Horizon Zero Dawn</a>.
<br />
<br />
<center>
<iframe allowfullscreen="" frameborder="0" height="504" src="https://www.youtube.com/embed/ucTeAWv5DX8" width="896"></iframe></center>
<br />Leshyhttp://www.blogger.com/profile/01002176403431250667noreply@blogger.com0tag:blogger.com,1999:blog-4368254915176331327.post-61461500485250511342017-07-27T11:40:00.000+02:002017-07-27T11:44:00.832+02:00VirtuaXEarlier this year I started a synthwave/trance/digital hardcore musical project called <a href="https://zariadev.blogspot.nl/p/virtuax.html" target="_blank">VirtuaX</a>. First track from the EP I'm working on, is released and available for listening on YouTube.<br />
<br />
<center>
<iframe allowfullscreen="" frameborder="0" height="504" src="https://www.youtube.com/embed/QkrkkiEXr6M" width="896"></iframe>
</center>
Leshyhttp://www.blogger.com/profile/01002176403431250667noreply@blogger.com0tag:blogger.com,1999:blog-4368254915176331327.post-26681290989845639782017-07-04T18:31:00.000+02:002017-07-27T11:41:05.218+02:00DevGAMM Moscow 2017Between 18th and 19th of May I had the privilege of speaking at <a href="http://devgamm.com/" target="_blank">DevGAMM </a>conference in Moscow.<br />
<br />
It was quite an experience to open the whole conference and meet a lot of wonderful Russian, Ukrainian and Belarus developers. Including the wonderful and very talented people at <a href="http://ice-pick.com/en/" target="_blank">Ice-Pick Lodge</a>, who are hard at work on Pathologic.<br />
<br />
Again I talked about quests and the Quest System in Horizon Zero Dawn, but this time I had the opportunity to get a bit more technical. <br />
<br />
<center>
<iframe allowfullscreen="" frameborder="0" height="504" width="896" src="https://www.youtube.com/embed/a-v2uKImGW8"></iframe></center>
<br />
The conference was unlike I have ever seen before, relaxed, not very formal and very, very friendly. Also a bit crazy as this picture shows:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGZChMZpJYI7vu0dAQbadIVeH7wsgk-nAP5m8YmDFF01uuWD2QoMvs8lpCMKZoW-6Oe-Lv0xfbQz5_V7Paz3CryeXuOoJ7jtYbWUnVnwECmo5H6lJ0NYU7JBBu7PLRAibxLUUTwhlH1Pk/s1600/post_moscow_17-1024x630.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="630" data-original-width="1024" height="393" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGZChMZpJYI7vu0dAQbadIVeH7wsgk-nAP5m8YmDFF01uuWD2QoMvs8lpCMKZoW-6Oe-Lv0xfbQz5_V7Paz3CryeXuOoJ7jtYbWUnVnwECmo5H6lJ0NYU7JBBu7PLRAibxLUUTwhlH1Pk/s640/post_moscow_17-1024x630.jpg" width="640" /></a></div>
Yes that is <a href="https://twitter.com/DeathBot9" target="_blank">Chris Taylor</a> (damn that dude is ripped) and <a href="https://twitter.com/JonCarnage" target="_blank">Jon Carnage</a> on stage :DLeshyhttp://www.blogger.com/profile/01002176403431250667noreply@blogger.com0tag:blogger.com,1999:blog-4368254915176331327.post-82364850871341169392017-04-12T21:33:00.001+02:002017-07-27T11:41:15.237+02:00GDC 2017 Talk on YouTubeMy GDC talk about Non-linear narratives in Horizon Zero Dawn is now available on YouTube :) <br />
<br />
<center>
<iframe allowfullscreen="" frameborder="0" height="504" width="896" src="https://www.youtube.com/embed/ykPZcG8_mPU"></iframe>
</center>
Leshyhttp://www.blogger.com/profile/01002176403431250667noreply@blogger.com0tag:blogger.com,1999:blog-4368254915176331327.post-12656767334816992202017-03-10T16:47:00.000+01:002017-03-14T00:55:42.725+01:00GDC 2017<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyTaZLQRRFK7xY5fJGPmhufcYXmolvXxIsrz-u3Z7g39xkcc8OUQKIcdlgdlLk39i3PRmB-QbOIce5BF6dBYA5y3mKtdjgD8Lt8TkvoyDnKzdUZr33Et89o8vJGCWdxG9ax6f03NkMs3s/s1600/001.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyTaZLQRRFK7xY5fJGPmhufcYXmolvXxIsrz-u3Z7g39xkcc8OUQKIcdlgdlLk39i3PRmB-QbOIce5BF6dBYA5y3mKtdjgD8Lt8TkvoyDnKzdUZr33Et89o8vJGCWdxG9ax6f03NkMs3s/s200/001.jpg" width="156" /></a></div>
A couple of days ago I returned from sunny San Francisco where I was attending <a href="http://www.gdconf.com/" target="_blank">GDC 2017</a>. I'm at a loss for words to describe how amazing the whole event was. It is absolutely mind blowing to meet so many people from the industry, to share ideas and just to nerd out. Talks were super interesting but as everyone knows, the evenings are the heart of the whole event. <br />
<br />
During the first day, on the Narrative Summit I also delivered a talk about Quests and Non-linear Narratives in <a href="https://www.guerrilla-games.com/play/horizon" target="_blank">Horizon: Zero Dawn</a> (full talk is freely available in the <a href="http://www.gdcvault.com/play/1024158/Building-Non-linear-Narratives-in" target="_blank">GDC Vault</a>, presentation slides are already available at the <a href="https://www.guerrilla-games.com/read/building-non-linear-narratives-in-horizon-zero-dawn" target="_blank">Guerrilla Games website</a>). Where I talked about the Quest System I built and designed for Horizon: Zero Dawn, our process in creating it and our approach to non-linear narratives. It's sort of a Engineer's Approach to Game Narrative :P<br />
<br />
I never talked at such a important event before so I was pretty scared and breathless. However it would seem it all went quite well, the I reception I got was amazing. The fact that the game was critically well received undoubtedly helped as well (currently 89 on <a href="http://www.metacritic.com/game/playstation-4/horizon-zero-dawn" target="_blank">Metacritic</a>!). Afterwards I was answering questions for an hour, so I missed the following talk (sorry <a href="https://twitter.com/amyisanartist" target="_blank">Amy</a>!).<br />
<br />
One of the coolest things that happened to me during the conference was meeting <a href="https://twitter.com/gamemagicarcana" target="_blank">Jeff Howard</a>. Who had his own talk: Force and Fire: Making Your Game More Metal (also available on the <a href="http://www.gdcvault.com/browse/gdc-17" target="_blank">GDC Vault</a>, but account is needed for access). He wrote an amazing book about quests in video games (<a href="https://www.amazon.com/Quests-Design-Theory-History-Narratives/dp/1568813473" target="_blank">Quests: Design, Theory, and History in Games and Narratives</a>), which I used to create my talk and even quoted at the very beginning. The meeting was unexpected to say the least :D<br />
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<table cellpadding="3" cellspacing="3" style="margin-left: auto; margin-right: auto; text-align: left; width: 100%;">
<tbody>
<tr align="center">
<td><div class="separator" style="clear: both;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLi9zNCHtgy5JY_2WgH3gPLvCgsbouRMi6Q0ZhgfWsWuV2ZosQGqzokhS8Hp1HguMWVX-hU-Xo-6VUZ1YqWNEa9HCZC0pnz0876KEjhTo-9wErNlEGGf94mvRXpzm51a8UY3WPdnPN1s8/s1600/sched.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLi9zNCHtgy5JY_2WgH3gPLvCgsbouRMi6Q0ZhgfWsWuV2ZosQGqzokhS8Hp1HguMWVX-hU-Xo-6VUZ1YqWNEa9HCZC0pnz0876KEjhTo-9wErNlEGGf94mvRXpzm51a8UY3WPdnPN1s8/s320/sched.JPG" width="320" /></a></div>
</td>
<td><div class="separator" style="clear: both;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9i_AmKA-DgcfhyphenhyphenQzlUm3pu4nb-iF4jyUgmnwoMYmIbiuJOA2ljxzSXyiyip2jInPyl5mYD4gxXqZhzVWY93cOHJcdnC_1BYeN9n4iiIgn-4B2qFnOZkCZloyPYz7mubtkpHum8jQe-Wc/s1600/pres.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="168" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9i_AmKA-DgcfhyphenhyphenQzlUm3pu4nb-iF4jyUgmnwoMYmIbiuJOA2ljxzSXyiyip2jInPyl5mYD4gxXqZhzVWY93cOHJcdnC_1BYeN9n4iiIgn-4B2qFnOZkCZloyPYz7mubtkpHum8jQe-Wc/s320/pres.jpg" width="320" /></a></div>
</td>
</tr>
</tbody></table>
<br />
Apparently some of the game press also found the talk worthwhile, which blows my mind even more:<br />
<ul>
<li><a href="http://www.dualshockers.com/2017/02/28/horizon-zero-dawn-non-linear-quests-guerrilla-games/">http://www.dualshockers.com/2017/02/28/horizon-zero-dawn-non-linear-quests-guerrilla-games/</a></li>
<li><a href="http://www.usgamer.net/articles/horizon-zero-dawns-quest-design-was-inspired-by-everything-from-vampire-the-masquerade-to-skyrim">http://www.usgamer.net/articles/horizon-zero-dawns-quest-design-was-inspired-by-everything-from-vampire-the-masquerade-to-skyrim</a></li>
<li><a href="http://www.4gamer.net/games/305/G030590/20170228142/">http://www.4gamer.net/games/305/G030590/20170228142/</a></li>
<li><a href="http://news.nicovideo.jp/watch/nw2665517">http://news.nicovideo.jp/watch/nw2665517</a></li>
<li><a href="http://game.watch.impress.co.jp/docs/news/1046865.html">http://game.watch.impress.co.jp/docs/news/1046865.html</a></li>
<li><a href="http://www.gamersglobal.de/news/126917/gdc2017-nicht-lineare-erzaehlungen-in-horizon-zero-dawn">http://www.gamersglobal.de/news/126917/gdc2017-nicht-lineare-erzaehlungen-in-horizon-zero-dawn</a></li>
<li><a href="http://revistayumecr.com/horizon-zero-dawn-recogio-inspiracion-varios-juegos/">http://revistayumecr.com/horizon-zero-dawn-recogio-inspiracion-varios-juegos/</a></li>
<li><a href="http://www.meristation.com.mx/noticias/los-juegos-que-influenciaron-la-historia-de-horizon-zero-dawn/2179336">http://www.meristation.com.mx/noticias/los-juegos-que-influenciaron-la-historia-de-horizon-zero-dawn/2179336</a></li>
<li><a href="http://www.vandal.net/noticia/1350687911/guerrilla-analizo-la-historia-de-los-juegos-de-rol-para-horizon/">http://www.vandal.net/noticia/1350687911/guerrilla-analizo-la-historia-de-los-juegos-de-rol-para-horizon/</a></li>
<li><a href="http://www.outcast.it/home/2017/2/28/costruire-la-narrativa-non-regolare-di-horizon-zero-dawn-coi-post-it">http://www.outcast.it/home/2017/2/28/costruire-la-narrativa-non-regolare-di-horizon-zero-dawn-coi-post-it</a></li>
</ul>
My friends at Guerrilla Games also gave talks on other topics:<br />
<ul>
<li>Dan Sumaili & Sander van der Steen - <a href="https://www.guerrilla-games.com/read/creating-a-tools-pipeline-for-horizon-zero-dawn" target="_blank">Creating a Tools Pipeline for Horizon Zero Dawn</a></li>
<li>Paul van Grinsven & Thijs Kruithof - <a href="https://www.guerrilla-games.com/read/player-traversal-mechanics-in-the-vast-world-of-horizon-zero-dawn" target="_blank">Player Traversal Mechanics in the Vast World of Horizon Zero Dawn</a></li>
<li>​Jaap van Muijden - <a href="https://www.guerrilla-games.com/read/gpu-based-procedural-placement-in-horizon-zero-dawn" target="_blank">GPU-Based Procedural Placement in Horizon Zero Dawn</a></li>
</ul>
Leshyhttp://www.blogger.com/profile/01002176403431250667noreply@blogger.com0tag:blogger.com,1999:blog-4368254915176331327.post-23934299904279994582016-07-29T11:20:00.001+02:002016-07-29T11:20:14.252+02:00libGDX and Editor updateOver the past year I've made some significant changes to the Zaria framework and the Zone Editor. Polish, improvements but also I slimmed down it a bit. <br />
<br />
Zaria has been working for a very long time on top of <a href="http://jmonkeyengine.org/" target="_blank">jMonkey Engine 3.0</a>. As amazing as that engine is it proved a bit troublesome at times. Quite a bit of my game projects hit significant delays, because functions that would be expected to just work, would not. All 3d projects hit problems with physics, stable rendering of shadows or general performance. All of these can be worked out of course, but my ambition was never to write a game engine, it was to create a framework for quick development of cRPGs (along with such games).<br />
<br />
Given all that I decided to take a step back and more conservatively look at what can be done. It would seem that for the time being scaling down and developing a 2d game was a good way to go.<br />
<br />
jME3 is great 3d engine, but is not particularly good for 2d projects. I decided to look at the other big Java game engine/framework - <a href="https://libgdx.badlogicgames.com/" target="_blank">libGDX</a> which had very good 2d support (as well as some other really cool features like HTML5 support).<br />
<br />
Switching the backend is never simple. So it took a while to decouple Zaria from jME3. The benefit of that is that Zaria and the Zone Editor is now agnostic in regards to backends. It can be used for any Java game engine and all specific code is now put in separate libraries. It also made development for Android simpler as I abstracted all desktop specific code as well.<br />
<br />
There are many things still to do. Fixing jME3 support to work with the new abstracted logic (I've been working exclusively with libGDX for now), adding a plugin architecture to the editor, so custom, engine specific editors could be added easily, while still making the core editor engine agnostic, adding netbeans/eclipse plugins for common Zaria actions and types, improving documentation and howtos. However this drastic change was good for the whole project. Made me think what it is actually supposed to be doing and how to implement it in a clean way.<br />
<br />
Along the way I managed add two new features to the editor that I really like. One is suggestion support to the script editor, to make scripting even easier:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifVFSYzGygn35CEU9Mx-vjuTUuq9WsJkWY5te4HK9oYbQLE8yy0wkp8X8Lywo-7UYonK32mla1Y-aXR1Nl-XtUWOKh3n84VR5s_wyJBkDButxpSwpA49_0sxt1yVCJEpWnLqaMhMZ9QUw/s1600/script_editor_01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="232" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifVFSYzGygn35CEU9Mx-vjuTUuq9WsJkWY5te4HK9oYbQLE8yy0wkp8X8Lywo-7UYonK32mla1Y-aXR1Nl-XtUWOKh3n84VR5s_wyJBkDButxpSwpA49_0sxt1yVCJEpWnLqaMhMZ9QUw/s400/script_editor_01.png" width="400" /></a></div>
<br />
Now when scripting Ctrl+Space will show a dropdown with all possible functions that can be used at the given moment (pretty much like any IDE).<br />
<br />
Another thing is I added support for <b>Value</b> and <b>Function</b> types. These can be used by different definitions provide a value (like how far the fireball can go in regards to character magic stat). However because thet are definitions by themselves, they are easy to tweak from the editor. Plus the <b>CurveFunction</b> got its own custom editor (strongly inspired by the libGDX Particle Editor):<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmHCByM3f9zDC745AcSrvW5PctIUw9RrMh-q-5B4KndgXl_sgFlrfHA-Iu3CO3DA978SHkviOPz2SZbhYRPC6cRDLmVS4zNsDWKoMpVoKwfkueJNGKPJEYJlobUkOpYU5ye0KhuhvP9BI/s1600/curve_editor_01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="227" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmHCByM3f9zDC745AcSrvW5PctIUw9RrMh-q-5B4KndgXl_sgFlrfHA-Iu3CO3DA978SHkviOPz2SZbhYRPC6cRDLmVS4zNsDWKoMpVoKwfkueJNGKPJEYJlobUkOpYU5ye0KhuhvP9BI/s400/curve_editor_01.png" width="400" /></a></div>
<br />
You can add points which will define the function, zoom in and zoom out. Currently three types of functions are supported: Linear Interpolated, Spline Interpolated and Polynomial.<br />
<br />
And yes I did (finally!) change the color scheme to dark.<br />
<br />
I'm continuing to work on the project. New cool things are coming.<br />
<br />Leshyhttp://www.blogger.com/profile/01002176403431250667noreply@blogger.com0tag:blogger.com,1999:blog-4368254915176331327.post-51910528723126141142015-03-10T01:41:00.001+01:002017-07-27T11:42:50.680+02:00Escaping the vacuumUnless you're an astro-engineer it doesn't make sense to build stuff in a vacuum. Tools, whatever they may be, have to be tested and proved in action. And the best way to test a game editor and framework... is to make a game :D<br />
<br />
So I started working on small hex based project, using Zaria.<br />
<br />
<center>
<iframe height="504" width="896" src="https://www.youtube.com/embed/wSxKmReBG3w" frameborder="0" allowfullscreen></iframe>
</center>
<br />
The game itself is progressing slowly but steadily. I'm able to iterate relatively quickly and it's very easy to make systems data driven. Overall, not bad, although a lot can be still improved. The effect on the framework and the editor has already been very, very positive. I found a million bugs, identified a million more of annoyances, and one by one I'm getting rid of them.<br />
<br />
The biggest problem I have right now is the way objects are identified. Currently the user needs to input a unique string for every object definition. It makes sense for objects that are being used explicitly later on, but the majority are not. What I want to do is to switch to a system, where only some objects have an user generated ID, but all will have an automatically generated UUID (using <a href="http://docs.oracle.com/javase/7/docs/api/java/util/UUID.html">http://docs.oracle.com/javase/7/docs/api/java/util/UUID.html</a>), which will be used internally by all systems to identify definitions.Leshyhttp://www.blogger.com/profile/01002176403431250667noreply@blogger.com0tag:blogger.com,1999:blog-4368254915176331327.post-47034205452213018672014-08-23T10:42:00.001+02:002014-08-23T10:42:25.479+02:00More Editors!<br />
The Zone Editor was made so that any kind of game data could be edited in a single coherent way. However very often specific elements benefit from having custom editors. The map editor is good example of that - it is much easier to create a map using a 3d view than in text or graph format.<br />
<br />
Some time ago I added an additional editor for Entity Instances and now the time has come to add more:<br />
<br />
<br />
Editing particle effect emitters.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhA2K2bqgLrITwuyjHQZd7P5A7_NqfClb7dY1UdgPWrElMGI7zXjgfFAgIvRMUhj5p0Um1p2kuiNaA09uPdBCvOZUV-OPTHQ54Dtw4INLkEM25WyfZVPyJEfxWbkR7uL7Q_nU7g1P7jgXo/s1600/particle.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhA2K2bqgLrITwuyjHQZd7P5A7_NqfClb7dY1UdgPWrElMGI7zXjgfFAgIvRMUhj5p0Um1p2kuiNaA09uPdBCvOZUV-OPTHQ54Dtw4INLkEM25WyfZVPyJEfxWbkR7uL7Q_nU7g1P7jgXo/s1600/particle.png" height="372" width="640" /> </a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Editor for materials. Works for all MaterialDefinitions.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZMTXHkdj_GeMUXSIH5YLH1aFaZzGt_9GO4QzwP-DiL-dLMtYzkjHj7XMayezj3EJfVc3kGcVNP0TQdoYM2ZE_ACYLhfkdEO_hawE5cKiycMlCXIXX3ZsyQchSHwpbKr03FZCOfWSRmbE/s1600/material.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZMTXHkdj_GeMUXSIH5YLH1aFaZzGt_9GO4QzwP-DiL-dLMtYzkjHj7XMayezj3EJfVc3kGcVNP0TQdoYM2ZE_ACYLhfkdEO_hawE5cKiycMlCXIXX3ZsyQchSHwpbKr03FZCOfWSRmbE/s1600/material.png" height="374" width="640" /> </a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Viewer for geometries.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLroUtqKPTPait0RorO1s1x-lksayOEVM1C5n6mwa-7DKN4NKnbQyAGU9jVrFRwQ41-ZYpk1tR47vBk7zFYjMm0WI0r5luNGVtyVMMbkFWI8qvHirvL6JTelmiB-FsmqNAD_K36X-vvEU/s1600/geometry.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLroUtqKPTPait0RorO1s1x-lksayOEVM1C5n6mwa-7DKN4NKnbQyAGU9jVrFRwQ41-ZYpk1tR47vBk7zFYjMm0WI0r5luNGVtyVMMbkFWI8qvHirvL6JTelmiB-FsmqNAD_K36X-vvEU/s1600/geometry.png" height="374" width="640" /></a></div>
<br />
I made a small framework for this type of editors, so adding a new one is as simple as implementing a function that creates a spatial from a object definition.Leshyhttp://www.blogger.com/profile/01002176403431250667noreply@blogger.com0tag:blogger.com,1999:blog-4368254915176331327.post-36155217028859528092014-07-06T22:54:00.001+02:002014-07-06T22:54:52.504+02:00Simplifying scriptingUsing scripting languages in game development has been common for years. And for good reason - most of them are easy to learn, and the lack of compilation decreases iteration time. Right now pretty much every major game engine has a scripting layer. Zaria too. It uses slightly modified JavaScript running on top of <a href="https://developer.mozilla.org/en-US/docs/Mozilla/Projects/Rhino" target="_blank">Rhino</a>.<br />
<br />
During my previous game projects I also used a variety of scripting languages: UnrealScript, NWScript, Lua etc. While working with them I found one thing really annoying - in most cases without browsing through a wiki or looking through documentation I had no idea what the available API was. Going through various web pages, or even printed documentation made it difficult to get back into coding. It's easy to loose focus and more difficult to get it back again.<br />
<br />
With compiled languages it's easier. Their strict structure makes it simpler to implement various code completion and suggestion tools, which in turn makes exploring the available APIs quicker.<br />
<br />
What <a href="http://en.wikipedia.org/wiki/Aurora_toolset" target="_blank">Aurora</a> (and <a href="http://en.wikipedia.org/wiki/Electron_toolset" target="_blank">Electron</a>) toolset had, was a searchable, drag'n'drop list of all available script functions right next to the editing area - extremely useful stuff. I really missed such a feature when working with Unreal Engine 3 on <a href="http://bladelords.com/" target="_blank">Blade Lords</a>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2fPAguzR5Zo6fEXCOnEJLd-73EjT_UluuJA3xoJ1cnVpMkEczFyMflyM-pb6lQj1Toc6xckEUSXbE2kNwrABaBWb8FF3nb2Xn7dw2ASLV12KUg7pHXgWDpnGGWRAUodljsQHL6iLF1fA/s1600/nwn2.jpg" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2fPAguzR5Zo6fEXCOnEJLd-73EjT_UluuJA3xoJ1cnVpMkEczFyMflyM-pb6lQj1Toc6xckEUSXbE2kNwrABaBWb8FF3nb2Xn7dw2ASLV12KUg7pHXgWDpnGGWRAUodljsQHL6iLF1fA/s1600/nwn2.jpg" height="448" width="640" /></a></div>
<br />
In order to not repeat past mistakes and learn from good examples I decided to implement a similar feature in the Zone Editor.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimd0pJPYHE0W7lOuJ9ZVnxiD_3BN2b6urJMIu9BNtlufN4P74sJgxlbhul-NlQp73SwF4ejaenhDsHqkrcDQSdiU8kBiXhSnkNmhZvCZ1nDu-2kf89xG0x42EBDlgFNi6bBL2whn1sAH4/s1600/Script_Editor_3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimd0pJPYHE0W7lOuJ9ZVnxiD_3BN2b6urJMIu9BNtlufN4P74sJgxlbhul-NlQp73SwF4ejaenhDsHqkrcDQSdiU8kBiXhSnkNmhZvCZ1nDu-2kf89xG0x42EBDlgFNi6bBL2whn1sAH4/s1600/Script_Editor_3.png" height="360" width="640" /></a></div>
<br />
A searchable palette on the right lets the user drag any available function right into the script. Functions are grouped by category, which can be defined by whoever creates the script function. Tooltips also provide some basic information on what the function does. Also to make it even more easy, other scripts can be dragged from the file view into the editing area, which will result in a properly resolved import.<br />
<br />
On the code side adding a new script function is really easy. Just create <b>public static</b> method and add the <b>@ScriptFunction</b> annotation. The editor will parse this data and show the function in the palette.<br />
<br />
There are other features I can imagine that could further enhance script writing, but for now I think this already makes stuff much clearer and simpler.Leshyhttp://www.blogger.com/profile/01002176403431250667noreply@blogger.com0tag:blogger.com,1999:blog-4368254915176331327.post-71111468408880667332014-07-03T01:36:00.002+02:002014-07-03T01:36:23.543+02:00Adding lights to entitiesI implemented static lightmap support some time ago with nice results. However moving stuff did not yet have a lighting solution.<br />
<br />
I wanted to have something in which the data for lighting would be common for static and dynamic objects. What I what I came up with is to save the light data (position, color, power, radius) that is used to generate lightmaps and use it also to create localized lights for entities.<br />
<br />
By localized I mean that each entity creates its own set of lights, which affect only it. This allows for attaching quite a lot of them, as the lights will affect only a small amount of geometry and gives a lot opportunity for LOD optimizations. The only down-side is that this method will not support shadow casting. However, in the end, this is not that big of a drawback, as such an amount of dynamic shadows would kill the framerate anyway.<br />
<br />
I created a component for that, so making an entity dynamically lit, is now trivial. The first test can be seen here:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='640' height='360' src='https://www.youtube.com/embed/ZOrgB1WM774?feature=player_embedded' frameborder='0'></iframe></div>
<br />
The map from which this video was taken:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjadOY4UhkqfFhNGibLrwv-94w0VhGcwCUSweY3iXHLWeZRq3e6oTOwNttUXwLS_eHHEHmKGBLXixCav_QrabMRaL3fQPfaiYCWdXtEyCEkubYDLi6Rv7AmhObBBDhbvcd-bxmUQyvnOl4/s1600/Screenshot+from+2014-07-03+00:06:58.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjadOY4UhkqfFhNGibLrwv-94w0VhGcwCUSweY3iXHLWeZRq3e6oTOwNttUXwLS_eHHEHmKGBLXixCav_QrabMRaL3fQPfaiYCWdXtEyCEkubYDLi6Rv7AmhObBBDhbvcd-bxmUQyvnOl4/s1600/Screenshot+from+2014-07-03+00:06:58.png" height="348" width="640" /></a></div>
<br />
The scene had 8 lights and with 7 entities the fps was around 2700. So far not bad.Leshyhttp://www.blogger.com/profile/01002176403431250667noreply@blogger.com0tag:blogger.com,1999:blog-4368254915176331327.post-51503515446685154242014-06-21T20:24:00.001+02:002014-08-26T11:29:46.181+02:00Multiple files from a single wizard in NetBeansI've been fighting with NetBeans modules recently. I wanted to add templates for common class types used in Zaria. Half of them, in order to be useful, go in pairs: Object + ObjectDefinition.<br />
<br />
To make the process as easy as possible, I wanted to be able to crate both files using a single dialog or wizard. Meaning: If I choose to create a new <b>EntityComponent</b> then both <b>NewEntityComponent.java</b> and <b>NewEntityComponentDefinition.java</b> get created with all boilerplate code in place.<br />
<br />
I managed to do that. However, either because of bugs or weird design decisions, it is far from straightforward.<br />
<br />
<h4>
Ok. So how to do it?</h4>
<br />
First have a look at <a href="https://platform.netbeans.org/tutorials/nbm-filetemplates.html">https://platform.netbeans.org/tutorials/nbm-filetemplates.html</a><br />
<br />
It shows how to create a new module that will generate a new file from a template. It is a good beginning and in theory should be all you need.<br />
<br />
The annotation <b>@TemplateRegistration</b> in the field <b>content </b>can take multiple files. Spec says that the default <b>New File</b> wizard should then create both files using the input templates.<br />
<br />
However the reality is different:<br />
<ul>
<li>Only the first file is created. To fix this you need to create your own custom wizard.</li>
</ul>
<ul>
<li>If you want to generate java classes from templates, you need to call the template file <i>xxx.java.template</i> Otherwise the module will not compile.</li>
</ul>
<br />
<h4>
How to create your custom wizard?</h4>
<br />
Although it shows more than needed here, a good initial tutorial can be found at <a href="https://platform.netbeans.org/tutorials/nbm-wizard.html">https://platform.netbeans.org/tutorials/nbm-wizard.html</a> <br />
<br />
In the <b>New Wizard</b> dialog choose <b>New File</b> instead of <b>Custom</b>. This will remove some of the complications and will make the wizard automatically work with New File menu in NetBeans.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIH3NGl0vGn3rFG6MWa0NQ5ZZ2ZvSrOvXJr1-Z5aJXvw44WGiI2Xpk-28arQt-51_jkGcy7CDr5laL3QwVsKHWyY5zcenMz_w1kT5J0HU2UPmfDWSmkPJUt0C2ej6i6rReBlqcQ20QBnI/s1600/Screenshot+from+2014-06-21+19%253A40%253A16.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIH3NGl0vGn3rFG6MWa0NQ5ZZ2ZvSrOvXJr1-Z5aJXvw44WGiI2Xpk-28arQt-51_jkGcy7CDr5laL3QwVsKHWyY5zcenMz_w1kT5J0HU2UPmfDWSmkPJUt0C2ej6i6rReBlqcQ20QBnI/s1600/Screenshot+from+2014-06-21+19%253A40%253A16.png" height="219" width="320" /></a></div>
<span id="goog_1490907765"></span><span id="goog_1490907766"></span>Annotate your wizard as in the first tutorial:<br />
<pre class="brush:java;"> @TemplateRegistration(
folder = "Zaria",
iconBase="eu/cherrytree/zaria/modules/filetemplates/zaria_file.png",
displayName = "#EntityController_displayName",
content = {"EntityController.java.template" , "EntityControllerDefinition.java.template"},
description="EntityControllerDescription.html",
scriptEngine = "freemarker")
@NbBundle.Messages("EntityController_displayName=Entity Controller")
</pre>
<br />
And the whole trick is in the <b>instantiate()</b> method in your <b>WizardIterator</b>:
<br />
<pre class="brush:java;">
private FileObject getDefinition(FileObject fileObject)
{
for(int i = 0 ; i < fileObject.getParent().getChildren().length ; i++)
{
FileObject obj = fileObject.getParent().getChildren()[i];
if(obj.getName().equals(fileObject.getName() + "Definition"))
return obj;
}
return null;
}
@Override
public Set<?> instantiate() throws IOException
{
// Prepare the arguments for passing to the FreeMarker template.
String name = (String) wizard.getProperty(GameObjectVisualPanel.nameProperty);
Map<String, Object> args = new HashMap<String, Object>();
args.put("name", name);
//Get the first template.
FileObject firstTemplate = Templates.getTemplate(wizard);
// Find the second template.
FileObject secondTemplate = getDefinition(firstTemplate);
DataObject dTemplate1 = DataObject.find(firstTemplate);
DataObject dTemplate2 = DataObject.find(secondTemplate);
// Force usage of the script engine.
secondTemplate.setAttribute("javax.script.ScriptEngine", firstTemplate.getAttribute("javax.script.ScriptEngine"));
// Get the package.
FileObject dir = (FileObject) wizard.getProperty(GameObjectVisualPanel.pathProperty);
DataFolder df = DataFolder.findFolder(dir);
// Set the names of the file:
String targetName1 = name;
String targetName2 = name + "Definition";
// Define the templates from the above, passing the package, the file name, and the map of strings to the template:
dTemplate1.createFromTemplate(df, targetName1, args);
dTemplate2.createFromTemplate(df, targetName2, args);
// End.
return Collections.EMPTY_SET;
}
</pre>
<br />
It would seem that there are two issues:<br />
<ul>
<li>The second file in the <b>TemplateRegistration</b> is quirky.<strike> It would seem that the templates are always put one after another.</strike> There no are guarantees when it comes to ordering of FileObjects in regads to templates. Therefore you will need your own trick to associate them with each other. In my case name is sufficient. </li>
<li>The script engine is only assigned to the first file. Therefore you have to copy the <b>ScriptEngine</b> attribute from the first template to the others.</li>
</ul>
With these two tricks everything seems to be working fine :)<br />
<br />
<br />
BTW. If you need to get the currently selected source directory, use:<br />
<pre class="brush:java;"> Project project = Templates.getProject(wizard);
Sources sources = ProjectUtils.getSources(project);
SourceGroup sourceGroup = sources.getSourceGroups("java")[0];
FileObject src_root = sourceGroup.getRootFolder();
</pre>
<br />
I've been testing this in <b>jMonkey Engine SDK 3.0</b> which is modified version of <b>NetBeans 7.x</b>. Maybe <b>NetBeans 8.x</b> does not have this issues. However the Internet suggests that as of June 2014 people are still having problems.Leshyhttp://www.blogger.com/profile/01002176403431250667noreply@blogger.com0tag:blogger.com,1999:blog-4368254915176331327.post-55155730306542344712014-04-21T01:31:00.000+02:002016-09-27T17:48:57.174+02:00Introducing the Zone Editor<span id="goog_1749865931"></span><span id="goog_1749865932"></span>During <a href="http://www.ludumdare.com/compo/ludum-dare-26/" target="_blank">Ludum Dare 26</a> (<a href="http://www.ludumdare.com/compo/ludum-dare-26/?action=preview&uid=33" target="_blank">my entry</a>) <a href="http://www.ludumdare.com/compo/ludum-dare-24/" target="_blank">and 24</a> I lost a great amount of time because of ineffective tools. I used to use <a href="http://www.mapeditor.org/" target="_blank">Tiled Map Editor</a> and <a href="http://www.jedit.org/" target="_blank">jEdit</a>. However they proved to be insufficient (at least for creating what I have in mind). I realized that in order to decrease my iteration time I need a real 3d game editor. jMonkeyEngine doesn't come with one and the <a href="http://hub.jmonkeyengine.org/wiki/doku.php/sdk:scene_composer" target="_blank">Scene Composer</a> is far too simple.<br />
<br />
I try to use as many already existing solutions as possible, so I started looking for stand alone, 3rd party, 3d level editor. Unfortunately I couldn't find a 3d counterpart of Tiled, everything I encountered was closely tied to the engine it was built for. The best solution I could find was <a href="http://icculus.org/gtkradiant/" target="_blank">GtkRadiant</a>, which although powerful and flexible can hardly be used outside id Tech. In the end it meant that none could be made to work with the jMonkeyEngine without heavy modifications.<br />
<br />
I decided to build something on my own. <br />
<br />
Zaria Framework is built to be as data driven as possible. Almost all game objects are created from object definitions that are stored in ZONE format (Zaria Object Notation), which is a slight modification of JSON. The editor would use this format directly, so I called it the <b>Zone Editor</b>.<br />
<br />
The first thing I wanted the editor to do is to be able to edit game files for any executable built with the Zaria Framework without recompilation. To achieve that the editor can read in any .jar file at runtime and parse all object definitions stored there. Using the <a href="http://code.google.com/p/reflections/" target="_blank">Reflections</a> library I was able to easily get all object definitions also from the classpath. <br />
<br />
The next step was to create a text editor that would work with ZONE format, with proper syntax highlighting, validation and a palette of all object definitions that can be used by the framework.<br />
<br />
<table align="center" border="0" style="width: 100%px;">
<tbody>
<tr>
<td><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZMqcMNmTjgQx2f-JFSrgQOuHDScZR8j8VaMOZm_JAizqymoX4dluG8QrkdYaTIICd3hyphenhyphenAGM0Jo5xvCNfOjBweA4m_P55bykihJUhrGwM3dA8RyB0yy7imyOTY73CymIKI63M0FjAjSuE/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="109" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZMqcMNmTjgQx2f-JFSrgQOuHDScZR8j8VaMOZm_JAizqymoX4dluG8QrkdYaTIICd3hyphenhyphenAGM0Jo5xvCNfOjBweA4m_P55bykihJUhrGwM3dA8RyB0yy7imyOTY73CymIKI63M0FjAjSuE/s1600/1.png" width="200" /></a></div>
</td>
<td><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8dzbflPa-VGbVNoqfS25OLMmJW4ZJgjzs6gS4oxRSg5du9gsXDp12mBv6Wf6RhKPhFdi-5dSyu0l_DzjtJATbpdzMEui1ejmHJ27GqMWJz0MNUsRYDGfnTNFjUmYM9q-ed2KPq0Yka_A/s1600/17.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="108" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8dzbflPa-VGbVNoqfS25OLMmJW4ZJgjzs6gS4oxRSg5du9gsXDp12mBv6Wf6RhKPhFdi-5dSyu0l_DzjtJATbpdzMEui1ejmHJ27GqMWJz0MNUsRYDGfnTNFjUmYM9q-ed2KPq0Yka_A/s1600/17.png" width="200" /></a></div>
</td>
<td><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiM5_7JqDNxjWhgt-A1NNrAF_SDQUeLWfHAcvWDbDpedMBxSNnjCNFsbkr1TLhcsANgIqFWXD6Ta5-UVrPjs-EixEOGDw54CghUJRAmAT86T6CJAAx-QLr8QmmFWn65ldn55qwgUDu40Tc/s1600/12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="108" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiM5_7JqDNxjWhgt-A1NNrAF_SDQUeLWfHAcvWDbDpedMBxSNnjCNFsbkr1TLhcsANgIqFWXD6Ta5-UVrPjs-EixEOGDw54CghUJRAmAT86T6CJAAx-QLr8QmmFWn65ldn55qwgUDu40Tc/s1600/12.png" width="200" /></a></div>
</td>
</tr>
</tbody></table>
<br />
The text editing part is built around the <a href="http://fifesoft.com/rsyntaxtextarea/" target="_blank">RSyntaxTextArea</a> which had a lot of stuff already built in that is needed for heavy text editing. All I had to is create a ZONE syntax definition (for syntax highlighting), a parser (for validation) and a transfer handler (for drag'n'drop from the palette).<br />
<br />
After that I had to create a visual editor, that could speed up the
process of editing and creating ZONE files. Because a ZONE file is a list of object definitions, with some of them having
relations between each other, an object diagram editor seemed appropriate.<br />
<br />
<table align="center" border="0" style="width: 100%px;">
<tbody>
<tr>
<td><div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhukrfAj862rNe4S3iOSjTQBvC3QB_2LFF2w-thNeuz3c_9rrIIxSZDvPRzfOaM8oyuXgqY0bWO7HlzlDUwcgcb3M0NiCk24_LZHjIVL554BChjhWzXujsg3KNoNquK4-nzGjW3i9qRhz8/s1600/15.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="173" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhukrfAj862rNe4S3iOSjTQBvC3QB_2LFF2w-thNeuz3c_9rrIIxSZDvPRzfOaM8oyuXgqY0bWO7HlzlDUwcgcb3M0NiCk24_LZHjIVL554BChjhWzXujsg3KNoNquK4-nzGjW3i9qRhz8/s1600/15.png" width="320" /></a></div>
</td>
<td><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkwHNXM2Nd-A3SKPAW2mzFeQZRZEUI5hUU94h6Wr7HjTW-H-Sf8X8VJ26cTfhaESUzsv16Rb49Zl9vVj1oisHIc0CvcPoNHMg6Zljl8XI8jOuzuWU0NU_wuTCIe4_2fI0uuzRGPKgxNBY/s1600/14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="173" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkwHNXM2Nd-A3SKPAW2mzFeQZRZEUI5hUU94h6Wr7HjTW-H-Sf8X8VJ26cTfhaESUzsv16Rb49Zl9vVj1oisHIc0CvcPoNHMg6Zljl8XI8jOuzuWU0NU_wuTCIe4_2fI0uuzRGPKgxNBY/s1600/14.png" width="320" /></a></div>
</td>
</tr>
</tbody>
</table>
<br />
I managed to find a great graph rendering and manipulation library called <a href="https://github.com/jgraph/jgraphx" target="_blank">JGraphX</a>, which allowed me to have a first prototype up and running in a week.<br />
<br />
Apart from that a property editor was needed. The only ready solution I could find was part of the <a href="http://l2fprod.com/common/" target="_blank">L2FProd.com Common Components,</a> which has not been supported since 2007. I had make so many modification to get it up and running, that I ended up ripping out only the property editing logic and integrating it directly into the editor source (thankfully everything I use is FLOSS).<br />
<br />
Finally a 3d map editor could be created. Right now it can be used to place and edit map geometry, entities, markers, triggers, collision volumes and bake lightmaps.<br />
<br />
<table align="center" border="0" style="width: 100%px;">
<tbody>
<tr>
<td><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNFjnIxnjI6kmfPVGptqHtg8LPcN-yInLjKYMESdAqinrXnqJ57ImXJ1aRX4ed6qv5XOooop6-QFGBpvHQOZUTeapDqe8a8bw2GdVm-9oNwtv1n-gg92ILbC6OmClq8I2GtBmpGOfoumw/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="109" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNFjnIxnjI6kmfPVGptqHtg8LPcN-yInLjKYMESdAqinrXnqJ57ImXJ1aRX4ed6qv5XOooop6-QFGBpvHQOZUTeapDqe8a8bw2GdVm-9oNwtv1n-gg92ILbC6OmClq8I2GtBmpGOfoumw/s1600/2.png" width="200" /></a></div>
</td>
<td><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7F8zDeTVjv9JRi7tzMQIklw1Z4gO15G_Eh8qeUGE2SIBIZ4qFWqIcB1itqd5hmqRjcoD03rQlQBP4W0V1Hync_jEyo9UMFTXlE4jOQpQHeYZmRfk1TOSFl7f93bobc92Nph67A0E6XaE/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="109" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7F8zDeTVjv9JRi7tzMQIklw1Z4gO15G_Eh8qeUGE2SIBIZ4qFWqIcB1itqd5hmqRjcoD03rQlQBP4W0V1Hync_jEyo9UMFTXlE4jOQpQHeYZmRfk1TOSFl7f93bobc92Nph67A0E6XaE/s1600/3.png" width="200" /></a></div>
</td>
<td><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgT4MQ4_dGaAOqAp-5xu1DkyRFemJmlVHTD6tsjEuJUyeOF5MtpiU50xx1pvlPsm4qbUxSvktYOcPNE20bYptEX3mqBU86nihyeLcgA7imYaTyizOweuZel_mqqDMDbpJGaDIN6E0sGdI/s1600/16.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="108" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgT4MQ4_dGaAOqAp-5xu1DkyRFemJmlVHTD6tsjEuJUyeOF5MtpiU50xx1pvlPsm4qbUxSvktYOcPNE20bYptEX3mqBU86nihyeLcgA7imYaTyizOweuZel_mqqDMDbpJGaDIN6E0sGdI/s1600/16.png" width="200" /></a></div>
</td>
</tr>
</tbody></table>
<br />
The rendering is done by the jMonkeyEngine. The engine provides a rendering context with a Swing Canvas, which makes it easy to embed in the app window. The way the map is rendered and managed is different from how it is done in game. There is no streaming, no lighting, which makes all of this easier to manage and manipulate. To make it work all objects that can be placed on the map, provide a <a href="http://hub.jmonkeyengine.org/wiki/doku.php/jme3:advanced:spatial" target="_blank">Spatial </a>that is used for rendering and manipulation in the editor.<br />
<br />
One of my favorite features of the editor is integration of the <a href="http://sunflow.sourceforge.net/" target="_blank">Sunflow Global Illumination Rendering System</a>, which enables baking of high quality lightmaps.<br />
<br />
Because the view in the map editor is simplified for performance reasons, a built in map viewer had to be created so that the map could be viewed as if in game, directly from the editor (with all geometries in their final form, entities functioning as defined, LOD mechanism running and all post processing effects in place) .<br />
<br />
<table align="center" border="0" style="width: 100%px;">
<tbody>
<tr>
<td><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLLKz-jLYl1m_WeO8ANqlUJkAIWFg5EKoMkKw-fWt3XByyhm9W4epAr0V4XVITSerUBDgCNKsYcRJBAOP_eV0mVV1FZhqQ12l7qN3ZM9y8wLgKbTvVcr_zve0HWq83UfD-M1WHFEnmCBw/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="118" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLLKz-jLYl1m_WeO8ANqlUJkAIWFg5EKoMkKw-fWt3XByyhm9W4epAr0V4XVITSerUBDgCNKsYcRJBAOP_eV0mVV1FZhqQ12l7qN3ZM9y8wLgKbTvVcr_zve0HWq83UfD-M1WHFEnmCBw/s1600/7.png" width="200" /></a></div>
</td>
<td><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRmxwM9R7IFz2MsIjOuVQyMSLZDFxVg8NvrCNi46J-nXyOKlJLW_qzXKDnlQ9XF6ZGk_InpsPyCPRlqVJDLf28LbpQYlVxdSaU7iRKx8_qc_nMo4DedmpUZU8V77UMFgXofjfyEmQ_5xw/s1600/11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="111" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRmxwM9R7IFz2MsIjOuVQyMSLZDFxVg8NvrCNi46J-nXyOKlJLW_qzXKDnlQ9XF6ZGk_InpsPyCPRlqVJDLf28LbpQYlVxdSaU7iRKx8_qc_nMo4DedmpUZU8V77UMFgXofjfyEmQ_5xw/s1600/11.png" width="200" /></a></div>
</td>
<td><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGgMYJtfUVQD0GAuHlvuIqMcMeqY3Nyy21_SsX9_ewxjMIVosb5-KRN4H96KgIAm0bXM8ZK2Cq0_cMKiCjqm3kU7p6M-wlS3dkNDpR5cqfxrmNZePbw76qMTc3nRYMrjgq7_1NoT1lwXc/s1600/8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="118" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGgMYJtfUVQD0GAuHlvuIqMcMeqY3Nyy21_SsX9_ewxjMIVosb5-KRN4H96KgIAm0bXM8ZK2Cq0_cMKiCjqm3kU7p6M-wlS3dkNDpR5cqfxrmNZePbw76qMTc3nRYMrjgq7_1NoT1lwXc/s1600/8.png" width="200" /></a></div>
</td>
</tr>
</tbody></table>
<br />
Writing the editor in Java proved to be a good idea. A lot of work I'm doing in the framework benefits the editor and vice versa (validation, serialization and other mechanisms are common between the two). Swing also was good choice, even with it's quirks. It is very mature, so almost all problems I encountered were already solved and there is a lot of 3rd party libraries available, which saved me a lot, a lot of time.<br />
<br />
There is still a great deal of work to be done. However
already the editor can significantly speed up the process of making games using jME
3.0 and the Zaria Framework. Leshyhttp://www.blogger.com/profile/01002176403431250667noreply@blogger.com0tag:blogger.com,1999:blog-4368254915176331327.post-26731822620098365812014-01-18T20:40:00.000+01:002016-07-28T11:10:53.986+02:00A gaming keyboard for a game programmer.After years of using the cheapest PC peripherals I could find, I figured I should finally get myself a decent keyboard.<br />
<br />
I started looking with <b>Logitech</b> and <b>Razer</b> (the only two brands making high quality peripherals that I knew about). And I almost chose the Razer Deathstalker Expert.<br />
<br />
It seemed like a nice choice. The reviews were good. I could squeeze all of its basic functionality on Linux (but no macros, probably no backlight control etc.). However I encountered <a href="http://www.phoronix.com/scan.php?page=news_item&px=OTg3NA" target="_blank">this post on Phoronix</a> and I learned about a German manufacturer called <a href="http://www.roccat.org/home/" target="_blank">Roccat</a>. Apperently they also build high quality peripherals but you can get proper Linux support, through <a href="http://roccat.sourceforge.net/" target="_blank">open source drivers</a>.<br />
<br />
I didn't hesitate long and chose the <b><a href="http://www.roccat.org/Products/Gaming-Keyboards/ROCCAT-Isku/" target="_blank">Roccat Isku</a></b>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7YNnAZdKTk_WOXwbCFgcfNXmwHe-INKTjB7ARZrJWtWATB745qYGQLbnJhZTQPuOd3IuIZooQJXIf_ebS6YEW0V-2WAXkJt0s9fbmzOywB1rZDQ0r7xfQzsxxJpY8jQKtJ-uANpk9Dfo/s1600/B006MO924S_overview.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="221" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7YNnAZdKTk_WOXwbCFgcfNXmwHe-INKTjB7ARZrJWtWATB745qYGQLbnJhZTQPuOd3IuIZooQJXIf_ebS6YEW0V-2WAXkJt0s9fbmzOywB1rZDQ0r7xfQzsxxJpY8jQKtJ-uANpk9Dfo/s400/B006MO924S_overview.jpg" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
So after finally getting my device and using it for a couple of days, I'm really, really happy. Not only it is a very good, very responsive and very comfortable keyboard but I can also fully customize it using a graphical tool.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGCaryRSEN2EbYIDhesRVmnPQp7Uv2qkBRFXiS8XHqrMQ7ivb_M6l8om5IBjth9we5y_RyUu_lJSkzHDwADYRty9A1VNLxbfyi6s_GaLrEb44aAJVZYaADww1RyKC3xDtrPRoN63DBrpg/s1600/Screenshot+from+2014-01-18+20:19:19.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGCaryRSEN2EbYIDhesRVmnPQp7Uv2qkBRFXiS8XHqrMQ7ivb_M6l8om5IBjth9we5y_RyUu_lJSkzHDwADYRty9A1VNLxbfyi6s_GaLrEb44aAJVZYaADww1RyKC3xDtrPRoN63DBrpg/s320/Screenshot+from+2014-01-18+20:19:19.png" width="273" /></a></div>
<br />
So I hooked up my NetBeans shortcuts and it works like a charm. Auto complete, refactoring with a press of a single button. Pure awesomeness.<br />
<br />
I am yet to do any serious gaming with it. But for a programmer it is a great device. I will definitely be recommending it to anyone.Leshyhttp://www.blogger.com/profile/01002176403431250667noreply@blogger.com0tag:blogger.com,1999:blog-4368254915176331327.post-67022427691826152182014-01-17T23:51:00.000+01:002014-01-22T02:04:31.983+01:00Steam on Fedora 64-bitIt's really nice that Steam is now in RPFusion repository for Fedora. However getting it to run is not fully straightforward on a 64-bit system. If you try you will most probably get the message:<br />
<br />
<i>OpenGL GLX context is not using direct rendering, which may cause performance problems.</i><br />
<br />
To fix this some 32-bit packages need to be installed. To do that you need login as root and run:<br />
<br />
<i>yum install pulseaudio-libs-glib2.i686 libao.i686 esound-libs.i686 alsa-oss-libs.i686 alsa-plugins-oss.i686 alsa-plugins-pulseaudio.i686 audiofile.i686 mesa-libGLU.i686</i><br />
<br />
Then depending on the graphics card vendor <i> </i><br />
<br />
For NVIDIA: <i>yum install xorg-x11-drv-nvidia-libs.i686</i><br />
For AMD: <i>yum install xorg-x11-drv-catalyst-libs.i686 </i>Leshyhttp://www.blogger.com/profile/01002176403431250667noreply@blogger.com0