Erty2 months ago2024-02-21 23:56:05 UTC 4 comments
Hi, hope you all are well!

For me I've just been very busy at work and stuff, and most days been too tired to work on any personal projects. Most of these days have just been working, cooking, and trying to sleep. 😅

But had a few days where I managed to force myself to argue with geometric planes and fix up silly mistakes and eventually got the MAP parser and converter finished up and released a new beta version of Map2Prop (and with that also opening the repo to the public).
With that I feel like it's getting near to a state where I can confidently elevate it out of the beta and up to a proper full release. With that comes of course the question of what remains for that.
In the development branch I've already added a config option and CLI argument for auto exiting on finish (instead of waiting for input). I decided to keep the wait-for-input on finish as the default behaviour to give non-CLI-savvy users the opportunity to see the success message or alternatively any possible error/warning messages before the window closes. This option should make it easier to use the application in batch scripts and such, which will later on open up for including it in map compile processes.

Next up is making use of tool textures to accomplish certain tasks. So far I've got this list:
  • ORIGIN: Set a custom origin point for the model instead of using world origin (removed from mesh)
  • BOUNDINGBOX: Set the parameters for the $bbox QC command (removed from mesh)
  • CLIP: Set the parameters for the $cbox QC command (removed from mesh)
  • CONTENTWATER: Mirror all faces of the model
  • BEVEL: Smooth all vertices within this volume (removed from mesh)
  • CLIPBEVEL: Do not smooth the vertices within this volume (removed from mesh)
Lastly I want to create a FGD with a custom brush entity class that will be read by Map2Prop. The idea is to include Map2Prop in the compile process and when fed a MAP file it will read these custom entities, convert their brushes to models, and change these entities to item_generic/cycler_sprite/etc (classname will be specified using a keyvalue) already filled out to use the newly converted model.
The entity class will include keyvalues to configure many of the options already exposed in config/CLI but on a per-entity basis (this will of course also be available outside of the compile process context).

I haven't decided yet whether any of these features will have their own release, or if I'll save all of them for v1.
I want to thank you all for the love you've shown my silly little project already. I'm looking forward to seeing all the maps you guys are making using it and I hope it continues to be helpful 😁
Erty5 months ago2023-12-14 20:04:06 UTC 7 comments
It has been a while since my last journal. I've mostly just been busy with work and being exhausted and had all my project on hold except for my part in this year's Ragemap (a mapping collab for Sven Co-op).

I brought up the fact that func_illusionary will produce cliphulls came up earlier today when helping Sassy Boy with advice on reducing clipnodes, which came as a surprise to some. Understandable, it's always non-solid so why would func_illusionary need cliphulls for in the first place? I thought a journal might be a tidier format for talking about this.
So the thing is, the CSG compiler that comes with the HL SDK makes no classname checks, it's pretty much entity-agnostic in this regard. So the compiler generates clipnodes on all HULLs for func_illusionary just as it does for any other brush entity. It doesn't become non-solid until it's spawned in-game and the game code gives it pev->solid = SOLID_NOT.

Big waste of clipnodes if you ask me.
Surely those who've worked on ZHLT and VHLT would have thought about this too and made sure to skip cliphull generation for func_illusionary. I opened up the source code for VHLT v34 and searched for "func_illusionary" and just as I expected I found a conditional checking for that classname and flagging those entities as "noclip" (which will make them skip cliphull generation). Though then I remembered I had this habit of adding zhlt_noclip 1 to func_illusionary in my FGDs, and I was pretty sure that even in VHLT the entity will still have cliphulls generated by default.

What better way to check than testing it?
So I set up a basic room. That's 6 faces with a clipnode each, times the 3 clipping HULLs, for a total of 18 clipnodes for the room itself.
A box is created and tied to func_illusionary. 6 faces on that one as well, so we can expect an additional 18 clipnodes if the generation isn't skipped. Run compile, and...
User posted image
We have 36 clipnodes total, what we expected if func_illusionary's cliphull were generated after all.
Doing another test with zhlt_noclip 1 on the func_illusionary, and without the entity at all, as controls we get the total of 18 clipnodes we expected to see if it was skipped.

So this confirms that func_illusionary does produce clipnodes in both the HL SDK CSG and VHLT v34's CSG.
But why?

Unfortunately I do not have that answer yet, but I'm curious about finding that out and so I started looking into it today.
I tested the conditional in VHLT's CSG where it checks the classname in isolation and it worked, so that can be ruled out.

I'll be sure to update this journal if I find out more, and if anyone reading this happens to know anything about it, please let me know!

Oxofemple brought to my attention that the -clipeconomy must be on to skip generating cliphulls for func_illusionary (and similar entities).
This was strange to me as I was sure it should be on by default, which used to be the case for ZHLT. Solokiller helped me confirm that the flag was changed to be off by default for whatever reason somewhere early in the VHLT branch.

So to sum it up it's not a bug but rather a change in default behaviour from earlier versions.
Erty9 months ago2023-08-16 13:28:56 UTC 3 comments
Two weeks ago I and my girlfriend went on a trip to visit my hometown and see my family there.

I haven't been there in about 15 years, and I've had little contact with my family there in those years. It's not that I didn't want to, it's just... it has been difficult. Both emotionally, and for many of those years I've been a poor student who couldn't afford making the trip there.

I'm happy to have made that trip, but it's also somewhat bittersweet. The summer house where we spent so many summers is gone. The path we ran down to the sea on is overgrown with vegetation but still slightly visible.
The sea still looks lovely thereThe sea still looks lovely there
Apart from the playground having been turned into a communal grilling spot, my old home and street looks pretty much the same. It has been fun to show all these old places to my girlfriend and share stories about my childhood there.

It was very special to reconnect with that part of the family again. Still so much the same, even with so much changing 16 years ago, and with the passage of time after.

Just as we were going back home, Monday last week, a storm hit us. We woke up early from an awesome thunderstorm and lots of heavy rain, which I'd love the hell out of if we weren't trying to catch some sleep before our journey. Electrical issues with our train caused it to take almost three hours longer to arrive for our connecting train, and if that one wasn't delayed by hours as well we would have missed it.
Arrived back home at about 1 AM, tired, exhausted, and emotionally all over the place.

A week later and not really fully recovered yet. Started working at a new client yesterday though!
Erty9 months ago2023-08-16 10:40:39 UTC 12 comments
So there was this discussion somewhere (don't remember exactly where and when but whatever) and I was reminded about it.
Basically it was about whether one should/need to say thanks for receiving help/answers in the community.
Opponents of the idea may argue that
  • one shouldn't celebrate/reward the bare minimum of basic human decency (which includes helping each other out) since that should be expected
  • that it's not needed because it's not personal ("someone else would show up and help anyway / the one asking for help isn't the only one benefiting from the answer")
  • it doesn't matter
I do agree with the main idea of the first point but I'd say it's applied to the wrong context. Helping each other is of course basic human decency, but there are nuances to consider here for the type of help it applies to. In general it's help that doesn't require one to go far out of their way to accomplish, or helping someone with something necessary things they're not capable of themselves.
This, in my opinion, doesn't extend to receiving help with a specific skill for a past-time endeavour such as modding. Someone spent their own free time and went out of their way to help out. If anything, the basic human decency would be about thanking for the help here.

For the second point, even if the one asking for help holds this view they are forgetting that they are not alone. Those that help would often like at least some response or feedback about whether it worked, and so do anyone else with a similar problem looking for solutions. If one wants to be as rude as not thank for the help, they should at the very least respond somehow.

The third point is one of nihilism and egoism, views that are annoyingly prevalent online. Even if it doesn't matter to you, it doesn't mean it doesn't matter to other people. It can matter to the helper(s), and any sort of feedback of whether it worked or not matters to others looking for answers to similar questions.
Meanwhile the proponent points are very simple:
  • While feedback about whether it works is more useful, it at least gives the helper(s) some response which many appreciate and makes them not feel ignored
  • It's the polite thing to do
For certain people, while it might be easy to forget that even if they're asking for help for themselves, they are in fact still interacting with real people, both passively and directly, who will be affected by the interactions to some degree.
In my own view, I always thank people for the help they give, no matter how big or small. I always appreciate it. Though I don't think it's as important as in the very least giving some feedback, it still matters to thank for the help.

I know that most people that don't say thanks don't do it with outright malicious intent. Some of them might not even be against it but just simply forgetting to do so. Even then it's still rude not to do it.
So to wrap up my thoughts on the topic:
For myself I don't mind not being thanked for helping someone, but I do expect some feedback on if it worked or not (again, it helps others looking for help to know if the solution/answer is viable, and for me to know I wasn't ignored).
Of course I'm not here to police on how anyone acts or behaves, nor do I claim my views are inherently correct or objective. What's considered rude or polite depends on culture and norms and my views of it might differ a lot from someone else's.
Erty9 months ago2023-07-23 20:39:55 UTC 2 comments
For those asking about a reverse Map2Prop, or Prop2Map if you will,
I did some testing to see how it'd work out...


User posted image

...I suppose I better not. The world isn't ready for this.
Erty10 months ago2023-07-20 16:36:51 UTC 2 comments
Hi again!

Juggling a lot of projects right now, both IRL and mapping/developing. Might have more to show/tell later on but for now I've made a page for Map2Prop with info about that little thing as well as download links with changelogs but more importantly it has a subpage for format specifications for some of the formats used in the project.
(Edit: The specifications have made their way to the TWHL wiki now over at Format Specifications)!

I've added a lot of my own findings where I could and hopefully made it easier to read by using consistent notation and style (but I'll gladly welcome any feedback for what can be done differently!)

– Erty
Erty10 months ago2023-07-05 23:20:00 UTC 2 comments
Well that was an entire month spent being mentally and physically exhausted.

Don't get me wrong, our new place is still great!
It's just cumulative exhaustion from the previous months, cleaning and handing over the old apartment, work stuff, not to mention unpacking, tiding and furnishing the new place. I don't do well with heat, so the heatwave last month pretty much destroyed what was left of me.
But we went to see a friend of mine who has a farm two weeks ago. That was a nice distraction. ^^

It finally started raining a week ago, and temperatures have gone down a bit. Enough for me to recuperate a bit at least.
SO! Got back to working on the .rmf support on my obj-to-smd converter.
Got the geometry to work quick enough, but got stuck on projecting the UV coordinates for the textures. Took me a while to figure out the Shift Y value and V projection both had to be negated. Took me even longer to figure out the reason rotations were messed up was because it's already baked into the Right Axis and Down Axis fields, so I had basically just doubled the rotation (d'oh!)
Realised my mistake some hours ago when I stepped through the code and recognised the Right Axis and Down Axis values were pretty spot-on for normal vectors at that angle. After removing the lines applying the rotation matrix, all textures snapped right into place.

I used it to convert a few test .rmf files and it all looked as expected!
We have .rmf support now! \o/
So next steps is to implement .jmf support (which shouldn't take too long as the format should be pretty similar to .rmf), should definitely add some proper arg parsing for the advanced users, and find a better name for my application other than "Obj2GoldSmd" as it's not limited to just .obj files anymore.
How about Goldsrc Propifier?

Once those steps are done, I think it's ready for a public release on here.

– Erty
Erty11 months ago2023-06-04 11:19:28 UTC 3 comments
So the moving went great!

Slowly getting set up at the new place now. I'm exhausted, but it feels great here. Even with boxes and bags and disassembled furniture all over the place, it's still so much more spacious than the old place! The neighbours here say hi back when you greet them unlike back at the old street where they'd just look at you weird for trying to be friendly. The stove and oven are working perfectly and no cabinet doors insisting on staying open! Finally, a home!

– Erty
Erty11 months ago2023-05-31 10:29:27 UTC 3 comments
So here I'm sitting surrounded by moving boxes. Even using a couple as a makeshift desk.
Moving is stressful. Even if I've moved a few times before, it feels a bit extra stressful this time around. Part of it is that I have a job this time, and at that job there was suddenly a lot of extra stuff happening that coincides with the moving (at least I get Friday off so I get to spend that day moving most of the stuff to the new apartment).

I also have some issues with anxiety, and it gets excarberated by cramped spaces. It's not outright claustrophobia, but a persistent discomfort. The bad air ventilation in this tiny underground basement apartment probably isn't helping either. It has been very draining and there was also that whole pandemic business going on too, causing us to spend more time in this tiny basement than what's good for us. Now that we're two days away from the big moving day, that tiny space we had available is now filled with moving boxes and disassembled furniture pieces and bags. In other words, my anxiety is all over the place. 🙃

At the same time I know things will be so much better once this is over with. Just a few more days.
That's also part of why I'm writing these journals. Writing things kinda helps me with stress, as do drawing or painting (though all my drawing/painting things are packed away so writing it is, for now). Apparently writing code is calming too, which I hadn't noticed before.
This is my third journal entry in just a week, after not writing any at all, ever, on this site, and just last night I did my fourth alpha (pre-) release of the Obj2GoldSmd converter and sent it out to the testers today (I sure hope they don't feel like I'm spamming or pestering them at this rate 😅).

Now I don't believe us moving will magically solve everything, but it will make a lot of things better.

Just to be able to stand and stretch without my arms hitting a ceiling, to be able to walk around, and to feel like I have the space to breath, in my own home, I've missed those things so much.

– Erty
Erty11 months ago2023-05-26 18:25:26 UTC 6 comments

Hi again!

I thought that now that I've broken the ice with making journals, I could talk a bit about the obj-to-smd converter I've been working on.
I mentioned it in my previous journal entry and I've talked about it in the Discord server. The project basically began as a test to see how easy it'd be to convert an .obj exported from J.A.C.K into a .smd file that could be compiled into a studio model for goldsrc. Apparently it wasn't that hard and it didn't take too long until I had something basic working.

Other people had shown interest in the project, and I could see the potential it could offer to other mappers, so I decided to build on the project to make it into something others could use. I added a logger to display info in the console and save warnings and errors to a file. I added the functionality for it to write a .qc file for a basic static prop along with the .smd to make compilation easier and faster. I set up a condition to make it skip any faces with NULL texture. I made it collect all textures with {-prefix and write a $texrendermode-entry for each one to make them use the masked mode.

Then I sent out this alpha version of the program to a few select individuals that had agreed to test it.
I've already gotten some very valuable feedback from two of them. The first helped me track down a coordinate system related error I had missed. The other brought to my attention some errors with the logging and input prompt which I hadn't noticed earlier either, and gave me an idea for how to make the program a bit more convenient to use.

During my own testing I had mostly just focused on whether all the polygons seemed right, whether the UV maps were correct, that weird geometry didn't throw exceptions here and there, and that sort of stuff. These two testers were able to notice things I wasn't paying attention to. This is why this sort of testing is very valuable and I appreciate the help a lot! Their names are already included in a special thanks section in the readme that will be included in a full release of the program.
Currently I'm working on a class for reading Wad3 files. This feature was inspired by the second tester.
The problem with the .obj file from J.A.C.K and the assosciated .mtl file is that they only include a reference to the texture used, but not the texture file itself. So in order to compile the model one would need to manually extract the textures from the assosciated .wad package and place it in the work directory. A solution we came up with was to let the program look for .wad packages in the work directory and search them for the textures by name, and automatically extract them. One would still need to place the .wad into the work directory, but that's definitely a whole lot less work than manual extraction. Especially when the model contains many different textures.

Before I started on the above feature I was working on a smooth shading functionality. I'm not completely sure how an user would turn on the feature, but so far I've thought of just looking up a _smooth[x] keyword in the end of the filename where x is the angle threshold and not using x (or using 0) would smooth all edges. I think the Wad3 support is far more useful and should be prioritized, so I switched to working on that instead.
After I finish the two features mentioned above I want to add some commandline support to the program. Currently it works by just drag-and-dropping the .obj file onto the executable which is plenty good enough for the typical use but one might want to be able to mess with various options, such as whether to not skip NULL-textured faces, not automatically set masked rendermode on {-textures, and setting a different output folder. Possibly also the ability to set various .qc options as well, such as $scale, $origin and $gamma.

I also want to add in support for reading .rmf/.jmf as well instead of just .obj (many thanks to Captain P for showing me the MESS code for parsing those!) This will make the program useful to even more mappers and break down the paywall due to the .obj export only being supported by J.A.C.K.

– Erty
Erty11 months ago2023-05-25 23:00:37 UTC 2 comments


So apparently I've been on this site for over 17 years and not even once written a journal entry. I decided it's time to change that.
I don't know if I should introduce myself or if that's a bit too late. Perhaps I should. I've spoken to many here but I doubt any actually know much about me.

I'm Erty. What is there to say about me? I love swimming. Back when I was in high school and uni people called me a "crazy scientist" because I built a lot of cool tech and high voltage stuff, like tesla coils and ion thrusters, and owned a piece of fluorescent uranium ore sample. I'm bisexual and a mess. I'm 30 years old as of writing. I used to draw and paint a lot but haven't done much of that the last years (unless you count making textures). I think bananas are pretty cool. I started my goldsrc mapping adventure about 20 years ago, messing around with an early version of HLSDK and finding Worldcraft.
I guess part of why I haven't written any journal entries, or contributed more than a handful of things for most of that time comes from having been afraid of getting too invested in mapping, or any creative process at all. I've been pretty good at starting projects, but terrible at finishing them. I've only published a handful of vault items, and later removed them. So why bother trying being a part of a community I won't contribute to? I'm just here with nothing to share. I had many such thoughts back then.

Well, a lot of shit happened during those years, the first two decades of the new millenium, an entire third of my entire life just full of chaos.
Looking back I understand better than to blame myself for not being as "productive as I could have been". Maybe participating more in the community could have helped encourage me to finish more projects instead of giving up when I felt like nothing mattered. Hell, perhaps the community here or elsewhere could have helped reminding me that some things do matter.
But all of that is in the past. My life is better now. I have a great partner. We've bought our first apartment together and moving in a week. We're packing like hell for that. There's also much to do at work. While a lot of things are happening right now, it's in a good way. I still have depression and PTSD, and it still gets in the way sometimes, but it's a lot less than it used to and things are stable enough for me to actually finish my projects. I participated in a SC mapping collab (Ragemap) two years in a row and currently participating in this year's collab as well. I've become more active on this site and various other communities. You might even have seen me around in the TWHL or SC discord servers.

Apart from Ragemap I have some other projects I'm working on. There's another unannounced mapping collab, and a pirate-themed map series I've been working on (perhaps I will tell more about it later on, after I finish moving). This week I began working on a program for converting .obj files exported from Jack to .smd files along with a .qc, all ready for compiling. Today I sent out an alpha version of it to a select few members of the mapping communities to help me test it. I hope it works well enough to fully release it soon and hope that at least some people find it useful. I'm planning on adding rmf/jmf support to it after the release of the first full version (thanks to Captain P for showing me the parser from MESS!)
Well there we go. My first journal entry. A bit about myself, a bit about the past, and a bit about the now.
Maybe the "bit" is an understatement. Heh.