Register a SA Forums Account here!
JOINING THE SA FORUMS WILL REMOVE THIS BIG AD, THE ANNOYING UNDERLINED ADS, AND STUPID INTERSTITIAL ADS!!!

You can: log in, read the tech support FAQ, or request your lost password. This dumb message (and those ads) will appear on every screen until you register! Get rid of this crap by registering your own SA Forums Account and joining roughly 150,000 Goons, for the one-time price of $9.95! We charge money because it costs us money per month for bills, and since we don't believe in showing ads to our users, we try to make the money back through forum registrations.
 
  • Post
  • Reply
Raenir Salazar
Nov 5, 2010

College Slice

jizzy sillage posted:

Okay yeah, my bad, I forgot that this is for your job. I did mean this as "no matter where you look, rakes everywhere", but I can understand wanting to vent about something without being criticised for it; I'm sorry.

Thank you, I appreciate this. :)


roomforthetuna posted:

Since you were jumped on so much last time you said a thing, when it did seem like you were being a bit weird about getting constructive responses to a request for help, I feel like I should say this time that I appreciated your grumbling for what it was and this time the response seemed like the one being weird.

Though I do also kind of appreciate "maybe the engine is not for you", not in that particular context but just in general because I have come to the conclusion that no engine is for me. I really hate all the rakes, and I find that doing stuff on the bare metal is always so easy by comparison to figure out what's wrong and fix it. My personal project at the moment is a web based game project, which I have redone several times because I keep being fooled into thinking some framework or tooling will be better, and I'm now on the third time migrating back to "actually just bare typescript is better". Flutter's webrtc library was buggy as gently caress and its supposed cross-platform widgets also weren't actually consistent. React is the absolute worst thing ever and I have no idea why anyone would use it (I didn't do that for my personal project I did it for a work thing, and what the gently caress the APIs apparently change completely with every major version so searching for "how to" documentation has a 70% chance of referencing functions that no longer exist, or don't exist yet, depending what version you picked). I thought Svelte was good, it's much closer to my philosophy of things, but it turned out when I tried to use viewTransitions the way Svelte works actively gets in the way of that working properly. There's probably a workaround, but it pisses me off so much to have to do workarounds for things that shouldn't need it, so I migrated back to naked typescript, which took me a few days.

So now I'm on just typescript and custom elements and it's *so easy*. It was actually useful to have tried Svelte because I learned a bunch of more modern html capabilities that I wasn't previously aware of (custom elements and templates, and structuring things through custom elements makes overall organization much easier than my previous iteration), but now that I know about those things, using them is much easier without the framework. To be fair, there is a little bit more repetitive boilerplate doing it manually versus Svelte. But calling back to the previous rant, React is somehow more boilerplate than writing everything yourself, and then injects a loving giant library dependency to download too. I guess React Native might be a thing that could potentially make it worth using for some people?

I suppose I don't totally hate Godot, especially now that it has a low-power mode such that it's properly viable for making a mobile game that doesn't eat the battery. Apparently it even has webrtc libraries. But at this point I'm not migrating to another frameworky tool only to get burned again.

Yeah I get it; and for what its worth to jizzy I think there can be definitely cases where someone can learn 'the hard way' including me that "this isn't for me". I taught game programming at a high school for about a year and decided that pursuing something like JET as a means of visiting Japan wasn't going to work out, I enjoy teaching but not teaching children, especially when there's an uncontrollable undisciplined mob of them.

I made a little web based js/html/css visual novel for that course and also learned that I didnt like web programming very much! And switched to making fun little game design puzzles in Unity which I think was much better and wish I thought of it earlier.

I don't think my experiences and annoyances with Unreal point to that this particular engine isn't for me; there are after all mitigating circumstances, like using Blueprints for work reasons over C++ for the time being. I think I do definitely prefer Unity3D for its GameObject/Component system because I can more easily plop down "empties" that only really expose the base minimum and isn't full of a whole bunch of obscure and unnecessary settings and parameters, especially for multiplayer fps poo poo. Plus its a little easier to plop down my pre-existing little libraries into Unity then in Unreal.

But Unreal ultimately is The Big Professional Game Engine that basically most game studios use, and most jobs I interviewed for used it, very few used Unity. This kinda reminds me of the Maya/Blender debate where unfortunately while Blender is probably my preferred (and free) 3D modeling software its also not the one most studios actually use unless they're small or only need assets in an ad hoc manner.

Also I also think its good to be diverse in my tools, I'm always learning a lot everyday using Unreal and I like having that experience, in my previous job we rarely used blueprint and spending the past month mostly using blueprint has removed a lot of my previous apprehensions as I'm more used to it; its just unfortunate that there's less rakes but more like thorns that prick my skin when I grab it a little roughly at times.

The thorns in this case being I wished to use the Pawn in a way to do certain camera trickery I think would be normal things for developers to do. Like due to the weird issues with Unreal's handling of rotations (legitimate issues, a lot of people coming in from Unity face many of the same issues with Gimbal lock that plagues Unreal that don't occur as often in Unity afaik because of Rotators aren't Quaternions) I want to have my "Pawn" actor centered on my "Target" but then offset the camera so all I need to do is rotate the Pawn so I can have full 3D rotations because doing it the other way just kept breaking down due to gimbal lock. And then well woops turns out the pawn despite not having a collision mesh still collides; which sure okay its fine that this is intended. I just wish it would've been more obvious that this is the default pawn-spawn behaviour; which as far as I can tell even googling after the fact knowing the issue, I still couldn't find where this is indicated, maybe its buried in a youtube video.

Adbot
ADBOT LOVES YOU

ArcticZombie
Sep 15, 2010
Is this the place where I ask for help with collision detection math?

I have collision detection working for moving circles and static lines, but I actually need line segments, and the handling the edge (literally) cases have wrecked me. I can solve some edge cases but not all of them and my solution is a bunch of “try this then that” rather than a general solution.

This question on stack exchange is essentially exactly what I’m trying to solve and I’m trying to implement the answer, but the sentence “Consider 𝑡 as given and ⋆ as quadratic equation in 𝑠.” seems to be doing a lot of heavy lifting that I just don’t understand. I understand quadratic equations but this does not look like one and I don’t know how to make it look like one, and even if I did I then don’t know what it means to take 𝑡 as given, just slap a value in?

roomforthetuna
Mar 22, 2005

I don't need to know anything about virii! My CUSTOM PROGRAM keeps me protected! It's not like they'll try to come in through the Internet or something!

ArcticZombie posted:

I have collision detection working for moving circles and static lines, but I actually need line segments, and the handling the edge (literally) cases have wrecked me. I can solve some edge cases but not all of them and my solution is a bunch of “try this then that” rather than a general solution.
This might be helpful: https://github.com/ravenblackx/SharpPhysics/blob/master/Body.cpp#L54-L82

It's solving for time rather than for position, but given you know how the circle is moving you can calculate where it is at the resulting time.

If you don't deal with acceleration then you can simplify that out.

Jabor
Jul 16, 2010

#1 Loser at SpaceChem
If you already have line-circle collisions working, you can find the closest point on the line at the time of contact - if that's not within the endpoints then it's a false collision and you should ignore it.

Then you just need point-circle collisions against the line endpoints - which if you already have circle-circle collisions, is just a special case where one of the circles has radius 0. (Or perhaps a radius related to the line width, if you're doing physics calculations that reflect the width of the lines as drawn on-screen)

Cicero
Dec 17, 2003

Jumpjet, melta, jumpjet. Repeat for ten minutes or until victory is assured.
I've been looking for free/cheapish retro game assets on Itch. It's for a pixel art game, so yeah pixel art, chiptunes, and sound effects in that vein. Are there any other sites that are good for that sort of thing?

Bronze Fonz
Feb 14, 2019




Cicero posted:

I've been looking for free/cheapish retro game assets on Itch. It's for a pixel art game, so yeah pixel art, chiptunes, and sound effects in that vein. Are there any other sites that are good for that sort of thing?

Quality varies but OpenGameArt has some good stuff.

Harminoff
Oct 24, 2005

👽

Cicero posted:

I've been looking for free/cheapish retro game assets on Itch. It's for a pixel art game, so yeah pixel art, chiptunes, and sound effects in that vein. Are there any other sites that are good for that sort of thing?

https://kenney.nl/assets

Mr Shiny Pants
Nov 12, 2012

This and https://opengameart.org/.

Bronze Fonz
Feb 14, 2019




+1 for Kenney. I got the All-in-one pack during a giveaway and it covers so much, for prototyping stuff it's been a godsend.

Raenir Salazar
Nov 5, 2010

College Slice
Is there no straight forward technique in a shader or shader graph/nodes in either Unreal/Blender/Unity of having a wireframe but only of the edges of variable pointy/edginess? I don't mean like a outline shader like for some toon shaders but something that could be used to procedurally shade rust/wear and tear like for a robot?

KillHour
Oct 28, 2007


Raenir Salazar posted:

Is there no straight forward technique in a shader or shader graph/nodes in either Unreal/Blender/Unity of having a wireframe but only of the edges of variable pointy/edginess? I don't mean like a outline shader like for some toon shaders but something that could be used to procedurally shade rust/wear and tear like for a robot?

I would use the smoothing groups on the mesh to bake a UV mapped texture that has the distance to the nearest hard edge. Maybe round the inside corners a bit too. Then sample that in the shader.

jizzy sillage
Aug 13, 2006

Raenir Salazar posted:

Is there no straight forward technique in a shader or shader graph/nodes in either Unreal/Blender/Unity of having a wireframe but only of the edges of variable pointy/edginess? I don't mean like a outline shader like for some toon shaders but something that could be used to procedurally shade rust/wear and tear like for a robot?

Yeah in-engine this is tricky, usually it's done by baking a map as KillHour suggested. "UTC Shader Library" (Epic Marketplace, free) might be able to assist, it's got material functions to generate some useful masks so you don't have to write them yourself. One of those masks is an Edge Detection mask, so you could procedurally add edge wear.

Raenir Salazar
Nov 5, 2010

College Slice
Thanks y'all, I was experimenting with shaders and stuff.

KillHour
Oct 28, 2007


Raenir Salazar posted:

Thanks y'all, I was experimenting with shaders and stuff.

The problem is that the pixel shader doesn't really have access to information about edge groups. I think the newest versions of Unity expose barycentric coordinates in shadergraph (or you can manually pack them in the shader data), which you can use to figure out how close you are to the edge of a triangle. But that won't tell you anything about how sharp that edge is. You might be able to combine that with normal information to figure it out, but it's a lot of math that you'd be doing every frame just to get a constant answer - which is ideal for a baked map.

I think a geometry shader might be able to do it, maybe? I don't know a ton about them, though.

KillHour
Oct 28, 2007


Oh yeah, I came here to share something that I figured out and was very hard to Google.

I'm working with the UI Toolkit in Unity for my graph editor thing and that uses Manipulator classes that implement logic to work with IManipulatable interfaces on the UI elements so you can interact with them. If a UI element has multiple IManipulatable interfaces (like ISelectable and IDraggable), I need a way to figure out if one is already doing something and tell any others to gently caress off. I decided to do this by creating an IReservableManipulator interface that all my IManipulatable interfaces can inherit from, with a default reservation implementation. It looks like this:

C# code:
internal interface IReservableManipulator
{
    protected Manipulator Reservation { get; set; }

    public bool HasReservation() => Reservation is not null;

    public bool TryReserve(Manipulator manipulator)
    {
        if (Reservation != null)
        {
            return false;
        }

        Reservation = manipulator;

        return true;
    }

    public bool TryRelease(Manipulator manipulator)
    {
        if (Reservation != manipulator)
        {
            return false;
        }

        Reservation = null;

        return true;
    }
}
Anyways, the part that was hard to figure out is notice the Reservation property (that you need for the default implementation) is protected. I don't just want any random code to be able to come in and replace the reservation because it will break poo poo. Well, if you actually try to implement a protected property like that, you get all sorts of weird errors that aren't very helpful. It turns out you have to write your implementation explicitly like this prior to C# 10:

C# code:
private Manipulator _reservation;
Manipulator IReservableManipulator.Reservation { get => _reservation; set => _reservation = value; }
Very weird, but there you go.

Edit: An important caveat is that you cannot access a protected property defined this way outside of the default implementation. This doesn't work, for example:

C# code:
internal interface IDraggable : IReservableManipulator
{
    public float2 Position { get; protected set; }

    public event EventHandler<float2> OnMove;

    public void Move(float2 start, float2 current);
}

public partial class Node : VisualElement, IDraggable
{
    #region IDraggable

    float2 _position;
    float2 IDraggable.Position {
        get => _position;
        set {
            style.left = value.x;
            style.top = value.y;
            _position = value;
        }
    }

    public void Move(float2 start, float2 current)
    {
        Position += current - start;
        OnMove?.Invoke(this, Position);
    }

    #endregion
}
You need to do this instead

C# code:
internal interface IDraggable : IReservableManipulator
{
    public float2 Position { get; }

    public event EventHandler<float2> OnMove;

    public void Move(float2 start, float2 current);
}

public partial class Node : VisualElement, IDraggable
{
    #region IDraggable

    float2 _position;
    public float2 Position {
        get => _position;
        private set {
            style.left = value.x;
            style.top = value.y;
            _position = value;
        }
    }

    public void Move(float2 start, float2 current)
    {
        Position += current - start;
        OnMove?.Invoke(this, Position);
    }

    #endregion
}

KillHour fucked around with this message at 03:32 on May 12, 2024

cultureulterior
Jan 27, 2004

Raenir Salazar posted:

Is there no straight forward technique in a shader or shader graph/nodes in either Unreal/Blender/Unity of having a wireframe but only of the edges of variable pointy/edginess? I don't mean like a outline shader like for some toon shaders but something that could be used to procedurally shade rust/wear and tear like for a robot?

You also can do this by sending a lot of extra data to the pixel shader as well, like sending all the corners of each triangle baked into each vertex as extra geometry data. I don't recommend it.

aardvaard
Mar 4, 2013

you belong in the bog of eternal stench

Cicero posted:

I've been looking for free/cheapish retro game assets on Itch. It's for a pixel art game, so yeah pixel art, chiptunes, and sound effects in that vein. Are there any other sites that are good for that sort of thing?

It's worth keeping an eye on the Humble Bundles, they're pretty much always running some sort of game asset bundle. Also, if you're using Unreal or Unity, the marketplace and asset store have some real gems (among a lot of trash). You can usually grab the assets and use them in other engines anyways, but no guarantees.

Red Mike
Jul 11, 2011

KillHour posted:

<C# default interface implementation things>

Just a word of caution: default interface implementation methods/properties are a can of worms and it's hard to get to grips with some of the ways they interact with things. The problem is that you end up trying to use them as a base class (which is what you're already doing), in situations where you're unable to have a real base class (because your class needs to inherit from something already like you do from VirtualElement). There's lots of quirks where basically which interface implementation you get will depend on how the caller is storing a reference to your object (do they have an IReservableManipulator, do they have an IMySubclassedInterface, do they have a MySubclass; does any of those layers redefine the implementation?).

Basically as you call out:

KillHour posted:

I don't just want any random code to be able to come in and replace the reservation because it will break poo poo.

This is a problem, and this approach doesn't do much to stop that. Your IDraggable/classes could just implement their own methods for those reservation methods, and this is the behaviour:

code:
public partial class Node : VisualElement, IDraggable
{
    public bool HasReservation() => false;

   ...
}

Node myNode = GetAlreadyReservedNode();
//myNode.HasReservation() == false; //because you're accessing it via Node and therefore you're getting Node.HasReservation(), not the default implementation
//((IDraggable)myNode).HasReservation() == true; //off the top of my head I'm not even sure this is true; I think it depends on if IDraggable itself also implements a default implementation or not
//((IReservableManipulator)myNode).HasReservation() == true; //this I know for sure is true
As long as you're sure no-one does this, it's fine, but it can happen by accident especially with IDEs sometimes prompting you to implement interfaces (and not necessarily excluding ones with a default implementation).



Since even right now you're reliant on the caller code to correctly call TryReserve/TryRelease, I don't see a reason you can't do it as just a class and compose it instead of using inheritance:

code:
internal class ReservationService
{
    private Manipulator Reservation { get; set; }

    public ReservationService() { }

    public bool HasReservation() => Reservation is not null;

    public bool TryReserve(Manipulator manipulator)
    {
        if (Reservation != null)
        {
            return false;
        }

        Reservation = manipulator;

        return true;
    }

    public bool TryRelease(Manipulator manipulator)
    {
        if (Reservation != manipulator)
        {
            return false;
        }

        Reservation = null;

        return true;
    }
}

internal interface IReservableManipulator
{
    public ReservationService GetReservationService();
}

internal interface IDraggable : IReservableManipulator
{
    public float2 Position { get; protected set; }

    public event EventHandler<float2> OnMove;

    public void Move(float2 start, float2 current);
}

public partial class Node : VisualElement, IDraggable
{
    //you're prompted to implement GetReservationService() so this has to appear somewhere
    // technically you could move this to a default interface implementation with the caveat that an interface/class might override it to do something weird (like having multiple services it uses current class state to pick between, or creating a new one every time, etc), but at least no-one could change the actual implementation of ReservationService by accident
    private readonly ReservationService _reservationService = new ReservationService();
    public ReservationService GetReservationService() => _reservationService;

    #region IDraggable

    float2 _position;
    float2 IDraggable.Position {
        get => _position;
        set {
            style.left = value.x;
            style.top = value.y;
            _position = value;
        }
    }

    public void Move(float2 start, float2 current)
    {
        Position += current - start;
        OnMove?.Invoke(this, Position);
    }

    #endregion
}
Another approach that's a bit more confusing is to set up a big static ReservationService with extension methods, like this:

code:
internal interface IReservableManipulator
{
}

internal static class ReservationService
{
    //can be ConcurrentDictionary to make it thread-safe
    private Dictionary<IReservableManipulator, Manipulator> _reservations = new Dictionary<IReservableManipulator, Manipulator>();

    public static bool HasReservation(IReservableManipulator obj) => _reservations.ContainsKey(obj);

    public static bool TryReserve(IReservableManipulator obj, Manipulator manipulator)
    {
        //check if it exists in the dict and if not then add it (concurrent dict has a single liner for it)
    }

    public static bool TryRelease(IReservableManipulator obj, Manipulator manipulator)
    {
        //just remove it from the dict and return whether it existed
    }
}
internal static class ReservableManipulatorExtensions
{
    public static bool HasReservation(this IReservableManipulator obj) => ReservationService.HasReservation(obj);
    public static bool TryReserve(this IReservableManipulator obj, Manipulator manipulator) => ReservationService.TryReserve(obj, manipulator);
    public static bool TryRelease(this IReservableManipulator obj, Manipulator manipulator) => ReservationService.TryRelease(obj, manipulator);
}


Node myNode = GetNode();
//myNode.HasReservation();
//myNode.TryReserve(...);
The downside of this is that it's a big static class and thus is not simple to extend/replace/test.

e: You can also use extension methods to mitigate the possibility of someone overwriting the default interface implementations though. So with your code, just do:

code:
internal static class ReservableManipulatorExtensions
{
    public static bool HasReservation(this IReservableManipulator obj) => ((IReservableManipulator)obj).HasReservation();
    public static bool TryReserve(this IReservableManipulator obj, Manipulator manipulator) => ...;
    public static bool TryRelease(this IReservableManipulator obj, Manipulator manipulator) => ...;
}
This way if someone does node.HasReservation() without casting, they'll get the extension method unless the extension methods don't cover the place you're calling it from (so a library/another assembly/the same assembly without a using). This highlights why default interface implementations are really hard to work with.

Red Mike fucked around with this message at 12:16 on May 12, 2024

Raenir Salazar
Nov 5, 2010

College Slice

cultureulterior posted:

You also can do this by sending a lot of extra data to the pixel shader as well, like sending all the corners of each triangle baked into each vertex as extra geometry data. I don't recommend it.

Yeah I was curious mainly if there was a decent ish method like this because to some extent as a developer if I can avoid having to boot up artist tools that seems the most convenient to me but the baking the information into a texture route just seems overwhelmingly the better choice; curiosity only goes so far before the effort just seems not worth it.

KillHour
Oct 28, 2007


Raenir Salazar posted:

Yeah I was curious mainly if there was a decent ish method like this because to some extent as a developer if I can avoid having to boot up artist tools that seems the most convenient to me but the baking the information into a texture route just seems overwhelmingly the better choice; curiosity only goes so far before the effort just seems not worth it.

There's nothing saying that as a developer you can't automate the baking of the data procedurally. Think of it as an optimization - you're doing the calculation once and reusing it instead of doing it every frame.



Thanks for this. You're right that default interface implementations are hard to work with. Honestly, this isn't shipping as a public API or even going to be used by anyone but me - I just wanted to have a single place to change the implementation if I need to do that instead of needing to remember to do it in each class. The composition approach of having a helper class for this might be a better way to go, but for some reason, I tend do avoid making classes like that. I'd prefer if the component was responsible for its own state instead of needing another class object that could get lost somewhere (I know I could make it readonly). Just how I think about things, I guess.

In practice, it probably won't matter - I'll never override that implementation, and even if I did, I would never call that method from the child class, always from the interface. And even if I did THAT, it would only ever break that specific component. What I wanted to avoid was getting into a state where one component accidentally releases a reservation that another component has, and now I'm into undefined behavior territory and it's a pain in the rear end to debug because the component that broke doesn't actually have anything wrong with it. I think my implementation covers that, since there's no way to set that property for everyone else without going through the default implementation.

In any case, thanks for going over that code. I learned some stuff, even if I probably will leave good enough alone until it does something to annoy me / make me rip it out.

The bigger annoyance is that I have to set things up in the order that I want things to lock unlock, because a single "mouse up" event on one manipulator might unreserve that component before another manipulator gets a chance to check to see if it's reserved, and both manipulators apply their effects instead of just one. I can resolve that by tracking the event that caused the unlock to happen and ignoring that same event, but events are pooled and I don't want to keep a reference around. There's an event ID in the base event type, but it's internal so I can't use it. I might have to add a timestamp or ID to my custom event.

Edit: I just realized I can use StopImmediatePropagation() to consume the event.

KillHour fucked around with this message at 20:41 on May 12, 2024

Red Mike
Jul 11, 2011
Honestly it's this exact sort of scenario that C# just has no good way to deal with right now, so whatever works for your use-case is best.

I tend to avoid default interface implementations where possible only because IDEs love to suggest refactoring changes that end up breaking them sometimes, or when I refactor out a method it'll pick the wrong type for a parameter and all of a sudden it breaks halfway through some method call. And because usually it's something like UI or performance-important update methods, it ends up being such a pain to track down because there's not enough logging/tracking of it.

Raenir Salazar
Nov 5, 2010

College Slice
The High Priest has spoken.

https://twitter.com/TylerGlaiel/status/1788362032699555985

Mr Shiny Pants
Nov 12, 2012

Raenir Salazar posted:

Is there no straight forward technique in a shader or shader graph/nodes in either Unreal/Blender/Unity of having a wireframe but only of the edges of variable pointy/edginess? I don't mean like a outline shader like for some toon shaders but something that could be used to procedurally shade rust/wear and tear like for a robot?

It is why Substance and Blender bake them. You could bake a AO map for the model and use that as an input to do the actual wear and tear in a shader. To be honest, that is way more convoluted than just using an application to do it for you.

Aryoc
Nov 27, 2006

:black101: Goblin King :black101:
Grimey Drawer

https://i.imgur.com/EZK2hWw.mp4

Raenir Salazar
Nov 5, 2010

College Slice

Hahaha, awesome and hilarious. Is that your game? Looks amazing.

Aryoc
Nov 27, 2006

:black101: Goblin King :black101:
Grimey Drawer

Raenir Salazar posted:

Hahaha, awesome and hilarious. Is that your game? Looks amazing.

Yeah, it's called Goblin Camp. I'm pretty happy with how I got the water simulation working so this was a good excuse to do something stupid with it.

Raenir Salazar
Nov 5, 2010

College Slice

Aryoc posted:

Yeah, it's called Goblin Camp. I'm pretty happy with how I got the water simulation working so this was a good excuse to do something stupid with it.

Love the art style, it feels like the same aesthetic feeling of like, Age of Empires but with modern graphics in a way that preserves the feel. Honestly that's probably my criticism of like Starcraft II, and other games like it they feel aesthetically like a step down.

Do you have an early access page on steam or twitter where I can follow/like and subcribe/doot the bell icon and help greenlight etc?

Aryoc
Nov 27, 2006

:black101: Goblin King :black101:
Grimey Drawer

Raenir Salazar posted:

Love the art style, it feels like the same aesthetic feeling of like, Age of Empires but with modern graphics in a way that preserves the feel. Honestly that's probably my criticism of like Starcraft II, and other games like it they feel aesthetically like a step down.

Do you have an early access page on steam or twitter where I can follow/like and subcribe/doot the bell icon and help greenlight etc?

Thanks, I'll pass on the compliments to our artist.
And yes, we do have an early access page: https://store.steampowered.com/app/2431980/Goblin_Camp/ We also just released our demo too.

Raenir Salazar
Nov 5, 2010

College Slice

Aryoc posted:

Thanks, I'll pass on the compliments to our artist.
And yes, we do have an early access page: https://store.steampowered.com/app/2431980/Goblin_Camp/ We also just released our demo too.

Excellent! :) Does your artist do paid work? If you could dm me their social media or art station so I can make a note of them for later. :)

Harminoff
Oct 24, 2005

👽
Oh neat I didn't know the demo was out! I remember playing this like what, 10 years ago in ascii?

Aryoc
Nov 27, 2006

:black101: Goblin King :black101:
Grimey Drawer
More like 14 years ago in ascii! Long long time ago. As for the artist he's not doing any other work at the moment, we're both working on this game full time.

Raenir Salazar
Nov 5, 2010

College Slice

Aryoc posted:

More like 14 years ago in ascii! Long long time ago. As for the artist he's not doing any other work at the moment, we're both working on this game full time.

Yeah that makes sense but I'd still appreciate getting their artstation/etc for future reference should in the future their situation changes. :) To be clear it's not like I'd be able to commission them or anything like that now, any projects I have would be years probably away from potentially being able to hire anyone, I just want to add entries to my spreadsheet of doom of potential contractors to contact first.

Aryoc
Nov 27, 2006

:black101: Goblin King :black101:
Grimey Drawer

Raenir Salazar posted:

Yeah that makes sense but I'd still appreciate getting their artstation/etc for future reference should in the future their situation changes. :) To be clear it's not like I'd be able to commission them or anything like that now, any projects I have would be years probably away from potentially being able to hire anyone, I just want to add entries to my spreadsheet of doom of potential contractors to contact first.

Alright, I'll ask him and send you a pm

Raenir Salazar
Nov 5, 2010

College Slice
I think I finally cracked the code on writing SDF shaders! I got a loop working sampling a texture for positions and relative to UV space displayed 4 shapes (at the corners)! From within a Custom Expression node which is kinda like a mini-HLSL shader. :)

This is good for me in particular because there's some materials out there on procedural world generation regarding SDFs that I had no idea what was going on but I think I have a better idea now.

But yeah now instead of drawing a sphere to a texture 50 times a frame I can draw one sphere 50 times once instead of doing like 50 cpu-gpu transfers.


Aryoc posted:

Alright, I'll ask him and send you a pm

Thanks!

KillHour
Oct 28, 2007


Raenir Salazar posted:

I think I finally cracked the code on writing SDF shaders!

Congrats! This is a long and frustrating but rewarding road.

If you haven't seen it yet, I highly recommend checking out this blog: https://iquilezles.org/

I've spent the last 2+ years absolutely obsessed with SDFs, so feel free to ask any questions.

Raenir Salazar
Nov 5, 2010

College Slice

KillHour posted:

Congrats! This is a long and frustrating but rewarding road.

If you haven't seen it yet, I highly recommend checking out this blog: https://iquilezles.org/

I've spent the last 2+ years absolutely obsessed with SDFs, so feel free to ask any questions.

Haha I think I have a few of their pages bookmarked!

I think one thing that was confusing to me is how people seemed to approach SDFs tended to look kinda different if it is in a shader vs something else; here's a page mentioning distance fields that looked interesting but was hard to tell really what was happening: https://www.redblobgames.com/x/1728-elevation-control/

So now that I've got a bit more experience with it I'll take another crack at it, I took a quick glance and the main thing is how the different fields particularly the boundary one I'm not sure what's being indicated as I play around with it, but I'll see when I look at it more I guess.

From a terrain procgen project perspective I think my main approach is to gather up different tools so I can get the results I want in different situations, small islands are probably going to require a different approach than a continent etc.

Raenir Salazar
Nov 5, 2010

College Slice
I just spent most of today trying to debug why a colour I picked to be roughly 0.5, 0.5 for the purposes of placing a circle and for some reason it was like 0.2, 0.5 instead; turns out by default textures have sRGB enabled, which screws with the colour that gets sampled from the texture!

:argh:

Adbot
ADBOT LOVES YOU

BornAPoorBlkChild
Sep 24, 2012
Thought you folks would find this interesting!

https://twitter.com/VictorTaelin/status/1791213162525524076?t=tzBIDRRCnLMgXpZ_rjaOWw&s=19


https://twitter.com/VictorTaelin/status/1791234624946860059?t=I3OkROCrQjpbFhom3NtByQ&s=19

BornAPoorBlkChild fucked around with this message at 00:53 on May 18, 2024

  • 1
  • 2
  • 3
  • 4
  • 5
  • Post
  • Reply