<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description></description><title>Wait. What?</title><generator>Tumblr (3.0; @schwarzeszeux)</generator><link>http://schwarzeszeux.tumblr.com/</link><item><title>MCP Analytics II</title><description>&lt;p&gt;Upon reading the last post again, I realized that I forgot to explain some technical details.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What do you, as mod-developer, have to do to use the service?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You need to sign up on the website and register your mod. Everymod will be assigned a random key, you will need to drop this key in your jar file (or decorate a class in your mod with an attribute that holds the key).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What exactly is going to happen when the gam crashes?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The mod will collect the information you see in the crash panel along with a list of all installed mods.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Who can see the crash reports?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Only you and the developer of the mods that were somehow involved in the crash (appear in the stacktrace).&lt;br/&gt;How does the website know it is you who sent the report? Well, that&amp;#8217;s only going to work if mojang implements openid/oauth for mojang accounts&amp;#8230;&lt;/p&gt;

&lt;p&gt;I hope that clears some of the confusion the last post created :)&lt;/p&gt;
&lt;p&gt;If you have any questions, you know where to find me!&lt;/p&gt;</description><link>http://schwarzeszeux.tumblr.com/post/48840137330</link><guid>http://schwarzeszeux.tumblr.com/post/48840137330</guid><pubDate>Thu, 25 Apr 2013 03:08:14 -0400</pubDate></item><item><title>MCP Analytics (working title)</title><description>&lt;p&gt;I&amp;#8217;ve been hinting, talking about this before and I initially had the urge to make this mod over two years ago.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What is it?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I want to automatically collect crash-reports from users for mod developers.&lt;br/&gt;Why? Because we as humans are lazy. Even as developer myself, knowing the importance of bugreports, I have to actively force myself to submit bug-reports.&lt;/p&gt;
&lt;p&gt;If noone reports a bug, it doesn&amp;#8217;t exist. At least from the developers point of view.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why would someone install the mod?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Bugs suck.&lt;/p&gt;
&lt;p&gt;Granted, this is going to be a service only geared to developers, but everyone will profit form it in the end - with better quality mods.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How can you help?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Join me in making the mod! :)&lt;/p&gt;
&lt;p&gt;Hop on irc, join &lt;a href="irc://#mcp-analytics@irc.esper.net"&gt;#&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;a href="irc://#mcp-analytics@irc.esper.net"&gt;mcp-analytics@irc.esper.net&lt;/a&gt;, &lt;/span&gt;&lt;span&gt;there&amp;#8217;s a &lt;/span&gt;&lt;a href="https://trello.com/board/java-client/51754a688369d95977008561" title="Trello" target="_blank"&gt;Trello board&lt;/a&gt;&lt;span&gt; setup, there&amp;#8217;s a &lt;/span&gt;&lt;a href="https://github.com/schwarzeszeux/analytics"&gt;repository&lt;/a&gt;&lt;span&gt; on &lt;/span&gt;&lt;a href="https://github.com/schwarzeszeux/analytics"&gt;github&lt;/a&gt;&lt;span&gt; and I&amp;#8217;m going to open up my eclipse workspace using &lt;/span&gt;&lt;a href="http://www.saros-project.org/"&gt;Saros&lt;/a&gt;&lt;span&gt; for some realtime multi-user editing-fun.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;So, if you fell like it, open the board, read the description, join, pick a feature to work on, fork the repo and when you are done submit a pull request!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What I want&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For now all I want is being able to collect the exceptions and have them ready to send to a webserver.&lt;/p&gt;
&lt;p&gt;Speaking of which, the webserver part will be what I&amp;#8217;m going to focus on.&lt;/p&gt;
&lt;p&gt;I hope I can have a test-service up and running soon.&lt;/p&gt;</description><link>http://schwarzeszeux.tumblr.com/post/48619025275</link><guid>http://schwarzeszeux.tumblr.com/post/48619025275</guid><pubDate>Mon, 22 Apr 2013 12:28:00 -0400</pubDate></item><item><title>Techne Online - future plans</title><description>&lt;p&gt;As I was sitting in this awefully long flight from Amsterdam to San Francisco, I had some time to think about what my next steps with techne online are going to be.&lt;/p&gt;
&lt;p&gt;First thing I&amp;#8217;ll do will be to add a page that displays all submissions at once. I thought techne online should be like pastebin where you share links to your things, but it seems to me now that more discoverability is a good thing.&lt;/p&gt;
&lt;p&gt;So, here&amp;#8217;s what&amp;#8217;s going to happen, first I&amp;#8217;ll fiy some bugs I&amp;#8217;ve been made aware of. Once that&amp;#8217;s done I&amp;#8217;ll add and allow registration, through openID or optionally a techne online account.&lt;br/&gt;With that in place, you will have a profile-page that lists all your submissions - there&amp;#8217;s also going to be a global gallery with all models. I realize that not everyone of you would want his/her model to be shared with everyone, so there will be privacy settings as well.&lt;br/&gt;Options are going to be:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;listed - viewable by everyone&lt;/li&gt;
&lt;li&gt;unlisted - those with links can access it&lt;/li&gt;
&lt;li&gt;private - only you have access&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Additionally you can choose to allow the download of the original tcn file.&lt;/p&gt;
&lt;p&gt;At this point I plan to add comments, ratings as well as counter (downloads, views). Note that I&amp;#8217;m not entirely sure about that yet, it might be counter productive.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m also thinking about model-revisions, so you can upload an updated version of your model.&lt;/p&gt;
&lt;p&gt;Some other things I&amp;#8217;ve thought about and aren&amp;#8217;t directly related to techne online, but will affect the website or its functions somehow.&lt;br/&gt;I hope to be able to create screenshots of models automatically, so there can be a preview - preferably so that you can embed them in your mod&amp;#8217;s website/forum thread. Integration into Techne itself, think &amp;#8220;cloud&amp;#8221; storage and embedded sharing. Make techne online the website to download Techne.&lt;/p&gt;
&lt;p&gt;Now it&amp;#8217;s time to start a new day in SF :)&lt;/p&gt;</description><link>http://schwarzeszeux.tumblr.com/post/30997763917</link><guid>http://schwarzeszeux.tumblr.com/post/30997763917</guid><pubDate>Thu, 06 Sep 2012 11:47:00 -0400</pubDate><category>techne</category><category>techne-online</category><category>techne online</category><category>minecraft</category><category>modelling</category><category>modding</category></item><item><title>Techne Online Gallery</title><description>&lt;p&gt;&lt;strong&gt;&lt;a href="http://techne.zeux.me/" title="Techne Online" target="_blank"&gt;Techne Online Gallery&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve been away too long&amp;#8230;&lt;/p&gt;
&lt;p&gt;I spent the past few days programming, something I haven&amp;#8217;t done in a long time and it felt great :)&lt;/p&gt;
&lt;p&gt;I didn&amp;#8217;t want to work on the decompiler because that would have been more &amp;#8220;work&amp;#8221; than fun, so I decided to bring Techne Online, which I started in January ( &lt;a href="https://www.youtube.com/watch?v=qGLZhxH-G3E"&gt;https://www.youtube.com/watch?v=qGLZhxH-G3E&lt;/a&gt; ) online.&lt;/p&gt;
&lt;p&gt;I haven&amp;#8217;t implemented the controls just yet because I want rendering and the backing infrastructure done first.&lt;/p&gt;
&lt;p&gt;A short rundown of what I&amp;#8217;m using:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;IIS7.5 on Windows Server 2008R2&lt;/li&gt;
&lt;li&gt;asp.net mvc4 on .net 4.5&lt;/li&gt;
&lt;li&gt;Sql CE is used as database (only temporary)&lt;/li&gt;
&lt;li&gt;Entity Framework5 as ORM&lt;/li&gt;
&lt;li&gt;Techne&amp;#8217;s javascript was written in CoffeeScript&lt;/li&gt;
&lt;li&gt;THREE.js as 3D library&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;What&amp;#8217;s on my roadmap:&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;&lt;li&gt;Texturesupport (I only need to implement it the javascript)&lt;/li&gt;
&lt;li&gt;Comments/ratings&lt;/li&gt;
&lt;li&gt;Auto-screenshots&lt;/li&gt;
&lt;li&gt;Embedable screenshots&lt;/li&gt;
&lt;li&gt;User login/registration&lt;/li&gt;
&lt;li&gt;Techne integration&lt;/li&gt;
&lt;li&gt;Controls to make it a fully featured alternative to Techne&lt;/li&gt;
&lt;li&gt;Animation support (*cough cough*)&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
&lt;div&gt;I&amp;#8217;ll post a more complete rundown and explanation after I&amp;#8217;m back from my trip, got to go packing :)&lt;/div&gt;
&lt;p&gt;In the meantime, happy uploading and check out: &lt;a href="http://techne.zeux.me/139"&gt;&lt;a href="http://techne.zeux.me/139"&gt;http://techne.zeux.me/139&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://schwarzeszeux.tumblr.com/post/30792377192</link><guid>http://schwarzeszeux.tumblr.com/post/30792377192</guid><pubDate>Mon, 03 Sep 2012 07:06:16 -0400</pubDate><category>techne</category><category>techne-online</category><category>techne online</category></item><item><title>When types Meet()</title><description>&lt;pre&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;/// &amp;lt;summary&amp;gt;&lt;br/&gt;/// Finds common ancestors in class-hierarchy.&lt;br/&gt;/// &amp;lt;/summary&amp;gt;&lt;br/&gt;public TypeSignature Meet(TypeSignature typeA, TypeSignature typeB)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br/&gt;I have been tasked to write this method for the decompiler we are working on. I think the implementation is rather straight forward and simple. So, why write about it then? I wanted to share more things that are going on and update you on the progress we make.&lt;br/&gt;&lt;br/&gt;Now, imagine we are trying to decompile a jar with the following types:&lt;br/&gt;&lt;a href="http://minus.com/mgESbAYEL/1f" target="_blank"&gt;&lt;img alt="Class hierarchy" src="http://i.minus.com/iYVuPdzdp70Fc.png"/&gt;&lt;br/&gt;click for fullsize&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;When we want to meet “Clio” and “Megane”, clearly, the best type to return is “Renault”. Meeting “Phaeton” and “Renault” will give us “Car”. But things aren’t always as clear; say we meet “BarChild” and “FooTwo”, what would be the best result? The answer is, we don’t know yet and return a meta-type that contains “IFoo” and “Bar”. Later down the line we will meet this type with “FooOne” and realize that the best thing to do would be to use “IFoo”.&lt;br/&gt;&lt;br/&gt;I’ll stick with “FooTwo” and “BarChild” as the types to meet to show how to do this programmatically.&lt;br/&gt;The first thing to do is building up a class-hierarchy from the bottom up for both types.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Ancestors of BarChild" height="350" src="http://i.minus.com/ibzAFQHiDxOhqh.png" width="245"/&gt;&lt;img alt="Ancestors of FooTwo" height="350" src="http://i.minus.com/iyJ8MtiUbt3OR.png" width="245"/&gt;&lt;br/&gt;After that is done, I get rid of every relationship between the nodes and only group them by level represented by a&lt;/p&gt;
&lt;pre&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;List&amp;lt;HashSet&amp;lt;string&amp;gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;.&lt;br/&gt;We don’t care who’s who’s parent; the only thing we want is to find common ancestors and that’s simple now, we iterate over both lists and one set and check if we have a match anywhere.&lt;br/&gt;Done.&lt;br/&gt;&lt;br/&gt;I hope this was at least a little bit use- and insightful.&lt;br/&gt;So long.&lt;br/&gt;&lt;br/&gt;For completeness-sake, the Match method:&lt;/p&gt;
&lt;pre&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;internal IEnumerable&amp;lt;string&amp;gt; Match(ClassHierarchyNode other)&lt;br/&gt;{&lt;br/&gt;    var typeBList = other.Condense();&lt;br/&gt;    var typeAList = this.Condense();&lt;br/&gt;    bool found = false;&lt;br/&gt; &lt;br/&gt;    foreach (var item in typeBList)&lt;br/&gt;        foreach (var check in typeAList)&lt;br/&gt;        {&lt;br/&gt;            foreach (var node in item)&lt;br/&gt;            { &lt;br/&gt;               var contains = check.Contains(node);&lt;br/&gt;&lt;br/&gt;                if (!found &amp;amp;&amp;amp; contains)&lt;br/&gt;                    found = contains;&lt;br/&gt;&lt;br/&gt;                if (contains)&lt;br/&gt;                    yield return node;&lt;br/&gt;            } &lt;br/&gt;&lt;br/&gt;            if (found)&lt;br/&gt;                yield break;&lt;br/&gt;        }&lt;br/&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</description><link>http://schwarzeszeux.tumblr.com/post/20957017392</link><guid>http://schwarzeszeux.tumblr.com/post/20957017392</guid><pubDate>Thu, 12 Apr 2012 05:13:00 -0400</pubDate><category>JavaMapper</category><category>C</category><category>Decompiler</category></item><item><title>Raspberry Pi</title><description>&lt;p&gt;I can&amp;#8217;t help but not get excited to get one.&lt;/p&gt;
&lt;p&gt;I tried to stay out avoid it, but it&amp;#8217;s too good of a plaything.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve owned an NSLU2 (pretty much the previous generation&amp;#8217;s rpi) and didn&amp;#8217;t use it as much as I hoped. I guess the hardware was too limited after all. And it was way more expensive, so I couldn&amp;#8217;t just buy more than one. Either way, if you are thinking about buying an rpi, head over to &lt;a href="http://www.nslu2-linux.org/"&gt;&lt;a href="http://www.nslu2-linux.org/"&gt;http://www.nslu2-linux.org/&lt;/a&gt;&lt;/a&gt; and browse for a little while (pretty much the first 6 links in &amp;#8220;General&amp;#8221;), I&amp;#8217;m sure you&amp;#8217;ll find ideas you want to do :)&lt;/p&gt;
&lt;p&gt;What would I do with it?&lt;/p&gt;
&lt;p&gt;Maybe fulfill my lifelong dream of a weather-station in the bathroom. It would pretty much be an lcd behind a one-way-mirror with a custom frontend that displays a forecast and the current temperature. I would have loved to do it in wpf, but I guess that&amp;#8217;s out of the question (too bad mono doesn&amp;#8217;t support it). It also looks like I can&amp;#8217;t use Moonlight either. That basically means I&amp;#8217;ll have to opt for Qt as UI-framework.&lt;/p&gt;
&lt;p&gt;So that&amp;#8217;s one rpi down, I&amp;#8217;m pretty sure I&amp;#8217;m going to install xbmc on another one to use as streaming client so I don&amp;#8217;t have to have my pc turned on when watching tv-shows (got IPTV via UDP-multicast, just need an IGMP-proxy&amp;#8230;).&lt;/p&gt;
&lt;p&gt;Other than that, there&amp;#8217;s loads of things I want to do in various degrees of desire to actually realize it.&lt;/p&gt;
&lt;p&gt;Just wanted to get this out.&lt;/p&gt;</description><link>http://schwarzeszeux.tumblr.com/post/18944169121</link><guid>http://schwarzeszeux.tumblr.com/post/18944169121</guid><pubDate>Thu, 08 Mar 2012 06:10:38 -0500</pubDate></item><item><title>Minecraft Modeling, Pieces and Subparts - Part 3 of x</title><description>&lt;div&gt;This is the third post in this series of posts on &lt;/div&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://schwarzeszeux.tumblr.com/post/13854104445/minecraft-modeling-tutorial-part-1-of-x" title="Part 1"&gt;Part 1, Basic modeling in code&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="http://schwarzeszeux.tumblr.com/post/14176343101/minecraft-modeling-animation-part-2-of-x" title="Part 2"&gt;Part 2, Animation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Part 3, Pieces and Subparts&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Sub-/Childparts are grouped in what I call &amp;#8220;piece&amp;#8221; in Techne.&lt;/p&gt;
&lt;p&gt;The most important part to remember is that you create ModelRenderer instances differently.&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s look at the dragon&amp;#8217;s constructor:&lt;/p&gt;
&lt;pre&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;public ModelDragon(float var1)
{
      this.texWidth = 256;
      this.texHeight = 256;

      this.setTextureOffset("rearleg.main", 0, 0);
      this.setTextureOffset("rearfoot.main", 112, 0);
      this.setTextureOffset("rearlegtip.main", 196, 0);

      this.rearLeg = new ModelPart(this, "rearleg");
      this.rearLeg.setPos(-16.0F, 16.0F, 42.0F);
      this.rearLeg.addBox("main", -8.0F, -4.0F, -8.0F, 16, 32, 16);

      this.rearLegTip = new ModelPart(this, "rearlegtip");
      this.rearLegTip.setPos(0.0F, 32.0F, -4.0F);
      this.rearLegTip.addBox("main", -6.0F, -2.0F, 0.0F, 12, 32, 12);

      this.rearFoot = new ModelPart(this, "rearfoot");
      this.rearFoot.setPos(0.0F, 31.0F, 4.0F);
      this.rearFoot.addBox("main", -9.0F, 0.0F, -20.0F, 18, 6, 24);

      this.rearLeg.addChild(this.rearLegTip);
      this.rearLegTip.addChild(this.rearFoot);
}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;TextureWidth and TextureHeight should be fairly obvious.&lt;br/&gt;Now, setMapTex is a different matter - it obviously takes a string and two ints as parameters. The string can be understood as path to the box the entry is referring to. It&amp;#8217;s not the full path, it&amp;#8217;s &amp;#8220;PieceName.BoxName&amp;#8221;.&lt;br/&gt;The integers are nothing other than the textureOffset, it is what used to be in the ModelRender&amp;#8217;s constructor.&lt;/p&gt;
&lt;p&gt;public ModelRenderer(ModelBase var1, String var2)&lt;/p&gt;
&lt;p&gt;The only reason we need to pass the instance of the model itself is to get the textureoffset, the string is the name of the piece.&lt;/p&gt;
&lt;p&gt;To add boxes, you call addBox, like you did previously. The arguments haven&amp;#8217;t changed, so there is no point in explaining it again.&lt;br/&gt;However, what you can do is add multiple boxes to one piece. All boxes that belong to a piece share the same textureOffset, rotation and position (anchor-point).&lt;/p&gt;
&lt;p&gt;All you need to do to create a piece hierarchy is to call addChild with the chield-piece you want to add.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s an overview of how the leg-hiearchy looks.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lxqmubtfvL1r0fmto.png"/&gt;&lt;/p&gt;
&lt;p&gt;I wanted to write about the rendering of pieces as well, but I think it should go in its own post.&lt;/p&gt;
&lt;p&gt;And for your pleasure, the complete dragon:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lxqmvanpjg1r0fmto.png"/&gt;&lt;/p&gt;</description><link>http://schwarzeszeux.tumblr.com/post/15772700951</link><guid>http://schwarzeszeux.tumblr.com/post/15772700951</guid><pubDate>Fri, 13 Jan 2012 08:00:00 -0500</pubDate><category>minecraft</category><category>techne</category><category>tutorial</category><category>modeling</category></item><item><title>MCP-48h</title><description>&lt;p&gt;I wasn&amp;#8217;t around when the idea was born, but I know that none of us had the time to participate in LD22. Anyway, we are holding our own (private) competition.&lt;/p&gt;
&lt;p&gt;The theme is &amp;#8220;Supernatural &amp;amp; Parallel Universe&amp;#8221;, there&amp;#8217;s no set language to use and the only rule is that you have to make everything yourself.&lt;/p&gt;
&lt;p&gt;I wasn&amp;#8217;t sure if I wanted to participate because I have many RL things to do, don&amp;#8217;t feel like programming at the moment - haven&amp;#8217;t been for three weeks now - and have many other projects I&amp;#8217;d like to have seen finished first.&lt;/p&gt;
&lt;p&gt;Well, I thought I could combine a project and this competition - I present&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Techne online&lt;/strong&gt;! I have an idea how to make a game out of it, let&amp;#8217;s see if I even get the basic functionality for it in before the time runs out ^^&lt;br/&gt;I hope that will save me from countless &amp;#8220;oooh, me need mac version - you sucks&amp;#8221;-comments in the future.&lt;/p&gt;
&lt;p&gt;This is what I have atm, you have an ugly stone block (damn you &amp;#8220;make it yourself&amp;#8221; rule) which will have a proper mc-texture when it&amp;#8217;s over.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://minus.com/mTechneOnline#1o"&gt;&lt;img alt="Current Progress" height="138" src="http://minus.com/jNI4UGI94BiqY_xs.jpg" width="230"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I will try to update the &lt;a href="http://minus.com/mTechneOnline"&gt;gallery&lt;/a&gt; regularly.&lt;/p&gt;</description><link>http://schwarzeszeux.tumblr.com/post/15460876571</link><guid>http://schwarzeszeux.tumblr.com/post/15460876571</guid><pubDate>Sat, 07 Jan 2012 13:30:00 -0500</pubDate></item><item><title>HI there,
the next blog-post in my series will take longer.
I haven&amp;#8217;t been able to work on...</title><description>&lt;p&gt;HI there,&lt;/p&gt;
&lt;p&gt;the next blog-post in my series will take longer.&lt;/p&gt;
&lt;p&gt;I haven&amp;#8217;t been able to work on anything due to personal reasons I don&amp;#8217;t want to go into. And I&amp;#8217;ll be spending a lot of time with my family in the holidays, so I wont be able to work on much either (even if I could bring myself to do something)&lt;/p&gt;
&lt;p&gt;I hope you understand.&lt;/p&gt;</description><link>http://schwarzeszeux.tumblr.com/post/14524397063</link><guid>http://schwarzeszeux.tumblr.com/post/14524397063</guid><pubDate>Tue, 20 Dec 2011 15:57:49 -0500</pubDate></item><item><title>Minecraft Modeling, Animation - Part 2 of x</title><description>&lt;p&gt;In this series I try to tackle topics about modeling in Minecraft, each article will build up on the previous ones - so if this is the first time you visit, you may want to read the previous posts as well.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://schwarzeszeux.tumblr.com/post/13854104445/minecraft-modeling-tutorial-part-1-of-x" title="Part 1"&gt;Part 1, Basic modeling in code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Part 2, Animation&lt;/li&gt;
&lt;li&gt;&lt;a href="http://schwarzeszeux.tumblr.com/post/15772700951/minecraft-modeling-pieces-and-subparts-part-3-of-x"&gt;Part 3, Pieces and Subparts &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;This time I&amp;#8217;m going to talk about the setRoationAngles-method and its parameters.&lt;br/&gt;I already gave a peak in last week&amp;#8217;s post but only superficially (and partially wrong :/ )&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ll repost the code to refresh your memory:&lt;/p&gt;
&lt;pre&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;    @Override
    public void render(Entity entity, float &lt;/span&gt;&lt;/code&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;var1&lt;/span&gt;&lt;/code&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;, float &lt;/span&gt;&lt;/code&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;var2&lt;/span&gt;&lt;/code&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;, float &lt;/span&gt;&lt;/code&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;var3&lt;/span&gt;&lt;/code&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;, float &lt;/span&gt;&lt;/code&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;var4&lt;/span&gt;&lt;/code&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;, float &lt;/span&gt;&lt;/code&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;var5&lt;/span&gt;&lt;/code&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;, float &lt;/span&gt;&lt;/code&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;var6&lt;/span&gt;&lt;/code&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;)
    {
        setRotationAngles(&lt;/span&gt;&lt;/code&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;var1&lt;/span&gt;&lt;/code&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;, &lt;/span&gt;&lt;/code&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;var2&lt;/span&gt;&lt;/code&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;, &lt;/span&gt;&lt;/code&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;var3&lt;/span&gt;&lt;/code&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;, &lt;/span&gt;&lt;/code&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;var4&lt;/span&gt;&lt;/code&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;, &lt;/span&gt;&lt;/code&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;var5&lt;/span&gt;&lt;/code&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;, &lt;/span&gt;&lt;/code&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;var6&lt;/span&gt;&lt;/code&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;);
        body.render(var6);
    }

    @Override
    public void setRotationAngles(float var1, float &lt;/span&gt;&lt;/code&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;var2&lt;/span&gt;&lt;/code&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;, float &lt;/span&gt;&lt;/code&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;var3&lt;/span&gt;&lt;/code&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;, float &lt;/span&gt;&lt;/code&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;var4&lt;/span&gt;&lt;/code&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;, float &lt;/span&gt;&lt;/code&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;var5&lt;/span&gt;&lt;/code&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;, float &lt;/span&gt;&lt;/code&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;var6&lt;/span&gt;&lt;/code&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;)
    {

    }&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Think of the walk animation as a function, a cosine function to be exact.&lt;/p&gt;
&lt;p&gt;&lt;img src="data:image/gif;base64,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"/&gt;&lt;/p&gt;&lt;p&gt;Where y(x) is the rotation in radians at t(x).&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ll use ModelChicken as an example - it&amp;#8217;s decompiled with ff and mcp:&lt;/p&gt;
&lt;pre&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;
leg0.rotationX = MathHelper.cos(var1 * 0.6662F) * 1.4F * var2;
leg1.rotationX = MathHelper.cos(var1 * 0.6662F + 3.1415927F) * 1.4F * var2;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;setRotationAngles arguments&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1st and 2nd argument&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This means that var1 is used for time and var2 modifies the amplitude. And this makes sense, the faster a mob walks, the more/higher their legs move. So I think it&amp;#8217;s safe to call var1 &amp;#8220;time&amp;#8221; and var2 &amp;#8220;walkSpeed&amp;#8221;.&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s look at the next graph.&lt;/p&gt;
&lt;p&gt;&lt;img src="data:image/png;base64,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"/&gt;&lt;/p&gt;&lt;p&gt;Now guess how this would look if it was applied to rotationX of a leg ( y(time) = cos(time) * walkspeed )&lt;/p&gt;
&lt;p&gt;This could describe a mod that stands still, begins to walk, reaches a max speed (of 1) and gradually slows down again.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;How are the values calculated?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The magic happens in RenderLiving.render(Entity entity, double var2, double var4, double var6, float var8, float var9):&lt;/p&gt;
&lt;pre&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;float time = mob.field_703_S - mob.field_704_R * (1 - var6);
float walkSpeed = mob.field_705_Q + (mob.field_704_R - mob.field_705_Q) * var6;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;3rd argument&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m not really sure how to name var3, it&amp;#8217;s being used for three different purposes and the calculation of it is up to the renderer-file.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Wolf: angle for its tail&lt;/li&gt;
&lt;li&gt;Squid: angle for the tentacles&lt;/li&gt;
&lt;li&gt;Chicken: angle for the wings&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;So, it&amp;#8217;s basically up to you what this is, all you need to do is override &lt;em&gt;handleRotationFloat &lt;/em&gt;in the renderfile.&lt;/p&gt;
&lt;p&gt;And it&amp;#8217;s pretty much up to you how you do that as well, the Wolf just gets the tail angle, while squid and chicken calculate it.&lt;/p&gt;
&lt;p&gt;Squid:&lt;/p&gt;
&lt;pre&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;protected float handleRotationFloat(EntitySquid entitysquid, float f)
{
  //f == Timer.renderPartialTicks and represents the passed ticks since  the last rendercall (0.0 - 1.0), it gets passed down from runGameLoop() in  Minecraft.java.
  return entitysquid.lastTentacleAngle + (entitysquid.tentacleAngle - entitysquid.lastTentacleAngle) * f;
}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Since &lt;em&gt;lastTentacleAngle &lt;/em&gt;and &lt;em&gt;tentacleAngle &lt;/em&gt;get set in &lt;em&gt;onLivingUpdate &lt;/em&gt;which is only called 20 times per second, we need to tween between angles to make sure we get a fluid animation and this is done here.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4th and 5th argument&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;They are &lt;em&gt;rotationYaw &lt;/em&gt;and &lt;em&gt;rotationPitch &lt;/em&gt;respectively, tweened like in &lt;em&gt;handleRotationFloat&lt;/em&gt;. In RenderLiving:&lt;/p&gt;
&lt;pre&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;float rotationYaw = entityliving.prevRotationYaw + (entityliving.rotationYaw - entityliving.prevRotationYaw) * f1;
float rotationPitch = entityliving.prevRotationPitch + (entityliving.rotationPitch - entityliving.prevRotationPitch) * f1;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You use them to determine where your model should look, think of it as  headRotationX and headRotationY and this is how it&amp;#8217;s being used as well. In your model-class:&lt;/p&gt;
&lt;pre&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;head.rotateAngleY = f3 / 57.29578F;
head.rotateAngleX = f4 / 57.29578F;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You might wonder why you divide by 57.29578, answer is simple, &lt;em&gt;rotationYaw/rotationPitch &lt;/em&gt; are in degrees and must be converted to radians before assigning it to rotateAngleX/Y :)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;6th argument&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This amounts to scale, but you normally don&amp;#8217;t have to mess with it, you just pass it to the render-method of you ModelRender.&lt;br/&gt;It&amp;#8217;s set to&lt;/p&gt;
&lt;pre&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;float scale = 1 / 16.0f;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;in code, remember 1 block is 16x16 pixels in texturesize.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;To sum up, arguments passed to .setRotationAngeles are&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;time&lt;em&gt; for the&lt;/em&gt; walk animation&lt;/li&gt;
&lt;li&gt;speed for the walk animation&lt;/li&gt;
&lt;li&gt;unsure how to name it, use is pretty much up to you&lt;/li&gt;
&lt;li&gt;rotationYaw&lt;/li&gt;
&lt;li&gt;rotationPitch&lt;/li&gt;
&lt;li&gt;scale&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;I hope this helps you understand how animations are done :)&lt;br/&gt;This post focuses on the setRotationAngles-method on purpose, we need that knowledge for later posts - if you have questions about something that goes deeper than what I wrote leave a comment and I might just write another article answering it :)&lt;/p&gt;
&lt;p&gt;Next up: EnderDragon explained&lt;/p&gt;
&lt;div&gt;&lt;/div&gt;</description><link>http://schwarzeszeux.tumblr.com/post/14176343101</link><guid>http://schwarzeszeux.tumblr.com/post/14176343101</guid><pubDate>Tue, 13 Dec 2011 14:57:00 -0500</pubDate><category>techne</category><category>tutorial</category><category>modeling</category><category>minecraft</category></item><item><title>Minecraft Translations</title><description>&lt;p&gt;The past few days I&amp;#8217;ve been organizing the translation-efforts for Minecraft and it has been an amazing experience.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s been a lot of work, but I think it was worth it.&lt;/p&gt;
&lt;p&gt;I wanted to take this moment to share some statistics with you,&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Accepted contributors: 601&lt;/li&gt;
&lt;li&gt;Contributors on waitinglist: 153&lt;/li&gt;
&lt;li&gt;Total contributors: 754&lt;/li&gt;
&lt;li&gt;Languages: 50&lt;/li&gt;
&lt;li&gt;Contributors / Language (average): 12.02&lt;/li&gt;
&lt;li&gt;Contributros / Language (max): 51&lt;/li&gt;
&lt;li&gt;Contributros / Language (min): 1&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;There are two more languages pending to be added and over 140 unprocessed mails.&lt;/p&gt;
&lt;p&gt;Google-docs isn&amp;#8217;t ideal as it comes with a huge administrative overhead - but I came to the conclusion that it isn&amp;#8217;t the worst tool  after looking at the alternatives. It is actually one of the better ones. If I could start from scratch, I would only change a few things in the workflow. Telling people to mail us if they see a wrong translation wasn&amp;#8217;t a good idea, they should have always used the suggestion sheet instead. There is no way for us to verify if the provided translation is better or not. We could only add them to the suggestions-sheets and that takes a lot of time and is barely manageable.&lt;/p&gt;
&lt;p&gt;You can find the current sheets &lt;a href="https://docs.google.com/open?id=0BwiDjXlvkgFVOGEyZjc1NzItYmJkNC00Y2ZhLThlN2ItMzQ0Y2YyMGJiMzhm" title="Translationsheets" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;And to clarify, it wasn&amp;#8217;t me alone working on it. When it was just one sheet it was just Searge, after that collapsed and we split it up into more it was ProfMobius and I :)&lt;/p&gt;
&lt;p&gt;What&amp;#8217;s left to do is wish you a nice day and I hope I can publish the next tutorial :)&lt;/p&gt;</description><link>http://schwarzeszeux.tumblr.com/post/14163858863</link><guid>http://schwarzeszeux.tumblr.com/post/14163858863</guid><pubDate>Tue, 13 Dec 2011 07:35:00 -0500</pubDate></item><item><title>Minecraft Modeling Tutorial - Part 1 of x</title><description>&lt;p&gt;I thought it was about time to write my own tutorials on modeling.&lt;br/&gt;When I started working on &lt;a href="http://techne.wikkii.com/wiki/Main_Page" title="Techne" target="_blank"&gt;Techne&lt;/a&gt; I didn&amp;#8217;t know the first thing about modeling, so there was a lot of trial an error involved. I didn&amp;#8217;t even write Techne for you, it was meant as a private project for my friends - who never used it&amp;#8230;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Part 1, Basic modeling in code&lt;/li&gt;
&lt;li&gt;&lt;a href="http://schwarzeszeux.tumblr.com/post/14176343101/minecraft-modeling-animation-part-2-of-x" title="Part 2"&gt;Part 2, Animation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://schwarzeszeux.tumblr.com/post/15772700951/minecraft-modeling-pieces-and-subparts-part-3-of-x"&gt;Part 3, Pieces and Subparts&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Anyway, tutorial.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Modeling in Minecraft, without Techne&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This tutorial wont use Techne as I want you to understand how the code in Minecraft actually works, this will help set a foundation for later, for more advanced modeling. However, I will show screenshots from Techne.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s a quick overview of the coordinate-system for in Minecraft (and Techne).&lt;br/&gt;The upper box is at origin (0, 0, 0), the lower one directly on the ground (0, 23, 0).&lt;/p&gt;
&lt;p&gt;Both boxes measure 1x1x1 pixels, all units are in pixels, but it is texture-pixels.&lt;br/&gt;That means that a 1x1x1 box will show one (1x1) pixel per face.&lt;br/&gt;A block measures 16 x 16 x 16 pixels which translates to real 1m x 1m x 1m (yay, spreading metric love). A creeper is 26 pixels high, which means it would be 1.625m tall.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lvt6g9eShd1r0fmto.png"/&gt;&lt;/p&gt;
&lt;p&gt;A Model file extends ModelBase and should override the &lt;em&gt;render &lt;/em&gt;method.&lt;br/&gt;This method will be called every frame, in there you want to call every render method of all ModelRenderers you have.&lt;/p&gt;
&lt;pre&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;package net.minecraft.src;

public class ModelTutorial extends ModelBase
{
    ModelRenderer body;

    public ModelTutorial()
    {
        body = new ModelRenderer(this, 18, 4);
        body.addBox(-6F, -10F, -7F, 12, 18, 10, 0.0F);
        body.setRotationPoint(0.0F, 5F, 2.0F);
        body.rotateAngleX = -0.7854F;
    }

    @Override
    public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5)
    {
        setRotationAngles(f, f1, f2, f3, f4, f5);
        body.render(f5);
    }

    @Override
    public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5)
    {

    }
}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is a very simple model-class that defines one box and renders it every frame.&lt;/p&gt;
&lt;p&gt;Think of ModelRenderer as one box in your model, let&amp;#8217;s look at a snippet of the code.&lt;/p&gt;
&lt;pre&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;
body = new ModelRenderer(this, 18, 4);
body.addBox(-6F, -10F, -7F, 12, 18, 10, 0.0F);
body.setRotationPoint(0.0F, 5F, 2.0F);&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;new ModelRenderer(this, 18, 4);&lt;/em&gt; will create us a new instance of ModelRenderer, you pass an instance of your model-class as first argument, texture-offset-X as second and texture-offset-Y as third.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lvt8x9I9FO1r0fmto.png"/&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;addBox &lt;/em&gt;takes 7 arguments, in order: offsetX, offsetY, offsetZ, sizeX, sizeY, sizeZ and extension. I&amp;#8217;ll explain what &amp;#8220;offset&amp;#8221; does (compared to &amp;#8220;position&amp;#8221; as set by &amp;#8220;setRotationPoint&amp;#8221;) later and we can ignore &amp;#8220;extension&amp;#8221; for now.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;setRotationPoint &lt;/em&gt;will set the position of this box, the rotation-point (or anchor-point) is the point in space around which the model will rotate.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lvtacewKOT1r0fmto.png"/&gt;&lt;/p&gt;
&lt;p&gt;To rotate a box you use the public fields rotateAngleX-Z. Let&amp;#8217;s say we want the tail to be rotated by -45°, as shown in the above image.&lt;br/&gt;It&amp;#8217;s important to note that rotateAngleX-Z take radians. 360° == 2pi in radians, a quick calculation of pi/180 * -45 gives us -0.7854 which means that we end up with.&lt;/p&gt;
&lt;pre&gt;&lt;code class="prettyprint"&gt;&lt;span&gt;body.rotateAngleX = -0.7854F;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You do this for every box your model will contain.&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s move on to the &lt;em&gt;render &lt;/em&gt;method, it takes seven arguments.&lt;br/&gt;The first is the entity you render, you use it to determine state. ModelWolf checks if it&amp;#8217;s sitting or shaking and changes the model accordingly.&lt;/p&gt;
&lt;p&gt;&lt;del&gt;The next 5 arguments define the amplitude of various animations, first is active when a model walks, the second when it flies (eg Chicken flapping their wings) and so on. The last argument is the time.&lt;/del&gt;&lt;strong&gt;&lt;br/&gt;Update:&lt;/strong&gt;  Ok, I apologize, that&amp;#8217;s not exactly true and I&amp;#8217;ll explain in the next post why.&lt;br/&gt;&lt;strong&gt;Update 2&lt;/strong&gt;: You can find the post &lt;a href="http://schwarzeszeux.tumblr.com/post/14176343101/minecraft-modeling-animation-part-2-of-x" title="Part 2"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In this method you call the &lt;em&gt;render &lt;/em&gt;method of all your ModelRenderers, this is what will actually display them on your screen. I&amp;#8217;ll go into detail how that works in a later tutorial, I&amp;#8217;ll also explain how animation works and what the parameters mean another time.&lt;/p&gt;
&lt;p&gt;I hope I got my point across and you got the basics, all following posts will cover more advanced topics, so if you have suggestions on how to make this tutorial easier to understand feel free to let me know.&lt;/p&gt;</description><link>http://schwarzeszeux.tumblr.com/post/13854104445</link><guid>http://schwarzeszeux.tumblr.com/post/13854104445</guid><pubDate>Tue, 06 Dec 2011 21:17:00 -0500</pubDate><category>techne</category><category>tutorial</category><category>modeling</category><category>minecraft</category></item></channel></rss>
