Guild icon
DDraceNetwork
Development / developer
Development discussion. Logged to https://ddnet.tw/irclogs/ Connected with DDNet's IRC channel, Matrix room and GitHub repositories — IRC: #ddnet on Quakenet | Matrix: #ddnet-developer:matrix.org GitHub: https://github.com/ddnet
Between 2023-07-17 00:00:00Z and 2023-07-18 00:00:00Z
Avatar
Avatar
deen
I actually signed up for https://purelymail.com and am switching all my felsin9.de to felsing.org
i am a huge fan of how transparent they are
Avatar
i just switched to zoho justatest
Avatar
Avatar
Jupstar ✪
i'm still waiting for fokkonauts reveal 😬
Hah
08:16
Its nothint Special
Avatar
Avatar
fokkonaut
Hah
u
Avatar
ChillerDragon BOT 2023-07-17 08:38:38Z
jopsti can you belive it i cant game during a zoom call w out fps drops
08:38
i need better hardware
Avatar
or just... DONT CONNECT 4 DUMMIES!!!
Avatar
ChillerDragon BOT 2023-07-17 08:40:13Z
._. im just using 1 client
08:41
08:41
i dont even max out
08:41
how do computers work
08:42
heat throtle?
Avatar
Try open box xd
Avatar
ChillerDragon BOT 2023-07-17 08:42:39Z
trol
08:42
i need my gnome pro
Avatar
ws-client BOT 2023-07-17 08:42:57Z
<Jupstar> i tested openbox lately and had a lag
08:43
<Jupstar> since then its clear to me
08:43
<Jupstar> i have to use terminal only
08:43
<Jupstar> rip
Avatar
ChillerDragon BOT 2023-07-17 08:43:29Z
+1
Avatar
ws-client BOT 2023-07-17 08:43:46Z
<Jupstar> sad that wayland is still broken
08:43
<Jupstar> its faster
Avatar
ws-client BOT 2023-07-17 08:43:54Z
<Jupstar> maybe no more lags with it
Avatar
ChillerDragon BOT 2023-07-17 08:43:59Z
this best tw client
Avatar
ws-client BOT 2023-07-17 08:56:24Z
<Jupstar> chillerdragon: what client did u use to have the zoom call? browser, native(aka browser over electron xdd)?
Avatar
https://heistak.github.io/your-code-displays-japanese-wrong/ TL;DR: There are characters (e.g. all in 刃直海角骨入) that look different depending on the language of the content being Japanese, Simplified Chinese, Traditional Chinese and Hangul, because Unicode uses the same codepoint for characters regardless of the language. This is how it looks with DDNet client currently on all languages: Up...
Avatar
Avatar
ChillerDragon
Click to see attachment 🖼️
GPUs process monitoring for AMD, Intel and NVIDIA - GitHub - Syllo/nvtop: GPUs process monitoring for AMD, Intel and NVIDIA
Avatar
ye i mentioned it to chiller
Avatar
Doesn't work for Apple GPUs, too bad 😄
Avatar
Might be Linux-only anyway
Avatar
chillerdragon BOT 2023-07-17 10:29:41Z
Browser (<@749222324980416602_ws-client>)
<Jupstar> chillerdragon: what client did u use to have the zoom call? browser, native(aka browser over electron xdd)?
Avatar
ws-client BOT 2023-07-17 10:31:17Z
<Jupstar> chillerdragon: cristal clear, firefox issue
10:31
<Jupstar> xd
10:33
<Jupstar> "Nvtop stands for Neat Videocard TOP". LMAO
10:34
<Jupstar> radeontop is still better for amd enjoyers i guess, bcs more detailed
Avatar
The Crash happened while playing normally. !image 2023-07-17 18:05:35 I assert: /home/deen/isos/ddnet/ddnet-source/src/engine/client/graphics_threaded.cpp(895): Texture handle was not invalid, but also did not correlate to an existing texture. Crash Log: ``` ------------------- Error occurred on Monday, July 17, 2023 at 18:05:53. DDNet.exe caused an Illegal Instruction at locatio...
Avatar
@Jupstar ✪ justatest
Avatar
Avatar
GitHub
Click to see attachment 🖼️
@Robyt3 did smth change recently. Second time I saw this lately
Avatar
Looks like it's related to tee rendering in kill messages, see decoded crash dump I posted in the issue
Avatar
Pls send the crash logs. @Robyt3 it must be a recent change i guess.
Avatar
ws-client BOT 2023-07-17 11:50:46Z
<Jupstar> @murpi can u also share the assert log, it might say if some image could not be loaded or similar
Avatar
Jupstar: There's this in the assert log: 2023-07-17 18:04:47 I libpng: warning for file "skins/glow_preamy.png": iCCP: known incorrect sRGB profile
11:52
That's about it, the rest is just chat messages
Avatar
ws-client BOT 2023-07-17 11:52:51Z
<Jupstar> that shouldnt matter. Ok
Avatar
It might be time to work on some classic spam prevention algorithms
Avatar
The bag-of-words model is a simplifying representation used in natural language processing and information retrieval (IR). In this model, a text (such as a sentence or a document) is represented as the bag (multiset) of its words, disregarding grammar and even word order but keeping multiplicity. The bag-of-words model has also been used for com...
Avatar
ws-client BOT 2023-07-17 12:28:06Z
<Jupstar> @murpi do you remember if you were in a started + unlocked team xd
Avatar
Avatar
ws-client
<Jupstar> @murpi do you remember if you were in a started + unlocked team xd
That's not my crash, I'll ask.
Avatar
ws-client BOT 2023-07-17 12:31:37Z
<Jupstar> maybe the info might not help anyway. the question would be rather if any tee on the server was in a strated + unlocked team
12:31
<Jupstar> maybe they can recover whats left from the autodemo
Avatar
He says the crash happened after they finished a map in a team.
Avatar
ws-client BOT 2023-07-17 12:42:20Z
<Jupstar> so quite possible, esp on ddmax where teams are often killed after finish
Avatar
ChillerDragon BOT 2023-07-17 12:43:16Z
omg watfak
12:43
i have fps cap at 666
12:43
and it bugs up to 1000 fps xxxd but feels like 3
12:43
zoom is fakin virus
Avatar
ws-client BOT 2023-07-17 12:43:54Z
<Jupstar> it doesnt bug to 1000
Avatar
ChillerDragon BOT 2023-07-17 12:44:05Z
ok it features up to 1000
Avatar
ws-client BOT 2023-07-17 12:44:08Z
<Jupstar> it probably has a bad frame, and tries to stabilize that frame
12:44
<Jupstar> how do you cap fps?
Avatar
ChillerDragon BOT 2023-07-17 12:44:25Z
gfx moment
Avatar
ws-client BOT 2023-07-17 12:44:29Z
<Jupstar> with cl_refresh_rate?
Avatar
ChillerDragon BOT 2023-07-17 12:44:39Z
na dat 0
12:44
gfx rate
Avatar
ws-client BOT 2023-07-17 12:45:05Z
<Jupstar> yeah then i guess its not actually at 1000 fps..
12:45
<Jupstar> at least not longer than like 1000/60 ms
12:46
<Jupstar> someone good with client network code?
12:46
<Jupstar> i wonder if m_RenderInfo in the client array in gameclient ever gets cleared
12:47
<Jupstar> // clear out unneeded client data for(int i = 0; i < MAX_CLIENTS; ++i) { if(!m_Snap.m_apPlayerInfos[i] && m_aClients[i].m_Active) { m_aClients[i].Reset(); m_aStats[i].Reset(); } }
12:47
<Jupstar> irc moment
Avatar
ChillerDragon BOT 2023-07-17 12:47:27Z
lol
Avatar
ws-client BOT 2023-07-17 12:47:29Z
<Jupstar> chillerdragon: when multiline
Avatar
ChillerDragon BOT 2023-07-17 12:47:36Z
soon(tm)
12:47
first gotta fix 0.7 axaxax
Avatar
ws-client BOT 2023-07-17 12:48:04Z
<Jupstar> that just adds even more bugs to our bad af code
12:48
<Jupstar> robyte fixes 20000000000000 bugs per day. still we never have fewer bugs
12:48
<Jupstar> xdd
Avatar
ChillerDragon BOT 2023-07-17 12:48:46Z
more bugs?
Avatar
ws-client BOT 2023-07-17 12:48:51Z
<Jupstar> i dunno
12:48
<Jupstar> i guess it stays the same
Avatar
ChillerDragon BOT 2023-07-17 12:48:56Z
the still doesnt make sense
Avatar
ws-client BOT 2023-07-17 12:49:18Z
<Jupstar> well he fixes a bug and unhides a hidden one
12:49
<Jupstar> from 2 million years ago
12:49
<Jupstar> when the dinosours played ddnet
Avatar
ChillerDragon BOT 2023-07-17 12:55:54Z
xd
Avatar
Avatar
Jupstar ✪
Pls send the crash logs. @Robyt3 it must be a recent change i guess.
idk how
Avatar
Avatar
Smetanolub
idk how
You can find your crash logs in %appdata%\DDNet\dumps or %appdata%\Teeworlds\dumps
12:59
Paste the files into this channel
Avatar
Avatar
Smetanolub
Click to see attachment 🖼️
Thanks 👍
Avatar
it there a way to switch to ddnet's auth system in the rcon? make it ask for a username with the password
Avatar
there is a netmsg for that, yes
Avatar
Avatar
toneey
it there a way to switch to ddnet's auth system in the rcon? make it ask for a username with the password
Yes, it will be used once you add the first user/password pair (see auth_* commands)
Avatar
@Ryozuki can you send the rust memory cheatsheet again?
Avatar
u can google it xd
Avatar
Smart
15:53
@Learath2 u missing #off-topic
Avatar
Avatar
Ryozuki
@Learath2 u missing #off-topic
I'm too busy having trouble deciding on a design
15:54
what u doin
Avatar
For some reason nothing I make looks good to me this week
Avatar
Avatar
Ryozuki
what u doin
I want to finally replace the python bot completely
15:55
@Learath2 i think u tend to overcomplicate
15:55
or over engineer
15:55
do the simplest route to the result
15:55
and then expand
15:55
for example the Any db
15:55
just choose 1 fixed
Avatar
But idk I really want per module context without passing it around with all the other context :/
Avatar
but u wont finish this this week then :/
15:56
also if u just arc it its a cheap copy
15:56
clone*
Avatar
If I can find something that looks good to me I can produce code really fast
15:56
but I just write stuff, it doesn't look very good, I just start again 😄
15:57
and u have nothing to show
15:57
justatest
Avatar
Like an Arc with three RwLocks in it is eeeeeeeeh
Avatar
its ok
Avatar
Even needing a lock for this is also very eeeeeeeeh anyway, I technically write most of this just once, after one memory fence it'll be the same everywhere
Avatar
once cell then
15:58
or simply init it before putting it in the contex
15:58
context
Avatar
You are right though, maybe I should just power through with the RwLock and I can clean it up after I have something working
15:58
and u probs wont have perf problems anyway
Avatar
Avatar
Ryozuki
and u probs wont have perf problems anyway
No but it'll forever annoy me that I didn't write it properly
Avatar
but if u have so much trouble finding the proper way
Avatar
5 years later I'll wake up in cold sweats
Avatar
maybe there isnt? a proper your way
15:59
u need to protect the data, u use locks
15:59
or make non racy hardware kek
16:00
@Learath2 maybe u can look at axum
16:00
it has type checked state
16:00
its awesome
16:01
axum is a web application framework that focuses on ergonomics and modularity.
Avatar
let mut lock = ctx.modules.write().await.unwrap().database.write().await; This looks horrendous
Avatar
why is modules behind a lock?
16:01
and im sure it can be read()
16:01
locks use interior mutabiity
16:02
they dotn need to be mut self
Avatar
Ah yes, that one can be read()
Avatar
is the code somewhere
Avatar
Not yet, as it currently does nothing
Avatar
why not simply ctx.database.write()
Avatar
but I guess I could push it, maybe you have some structural idea
Avatar
also if u use sqlx
Avatar
You write more Rust
Avatar
the database handle is already thread safe
16:03
well if u use a pool it is
Avatar
Avatar
Learath2
but I guess I could push it, maybe you have some structural idea
ye, for me its always harder to interpret what others says than looking at code
16:04
code never lies
16:06
@Learath2 i thought about smallvec in cpp, in rust thanks to enum optimizations it will probs find a way to put the heap vec ptrs inside the stack allocated array when using the vec variant (edited)
16:06
but on cpp?
16:06
a union?
16:06
rly unsafe
Avatar
Avatar
Ryozuki
ye, for me its always harder to interpret what others says than looking at code
https://github.com/Learath2/ddnet-discordbot-ng it's just me messing around with structure trying to find something I like
Another attempt at revamping the old python bot. Contribute to Learath2/ddnet-discordbot-ng development by creating an account on GitHub.
16:09
The goals are to be able to add modules easily
Avatar
what does a module do
Avatar
It can be anything really, it's like a CComponent it has hooks that the main will call into as needed
Avatar
this looks like the perfect job for a trait
Avatar
Yeah, sounds like a good idea, I might do that
16:13
Each module can add stuff to the config and stuff to the context, that's the part I'm mostly trying to figure out now
Avatar
dont but the db behind a lock
16:13
use the type system in ur favour
16:13
rust will let u know when u need a lock trust me xd
16:13
sqlitepool is thread safe from sqlx
Avatar
I was trying to keep it symmetric
Avatar
and yeah u have a structure that fits traits i think
Avatar
Avatar
Ryozuki
and yeah u have a structure that fits traits i think
Are async traits even a thing btw?
Avatar
soon tm
16:16
for now use async_trait
Avatar
They didn't use to be last I gave this an attempt
Avatar
#[async_trait::async_trait] pub trait Module { async fn init(&self, ctx: Arc<BotContext>); async fn register_commands(&self); async fn handle_interaction(&self, interaction: &Interaction); async fn handle_message(&self, message: &Message); } (edited)
16:17
u dont need to pass BotContext on all calls
16:17
simply save it on self
16:17
well i missed self there xd
Avatar
Yeah, there was no self in this initial attempt, I guess that's a good idea, make modules actual objects
Avatar
btw self can be : &self &mut self Pin<&mut self> Pin<&self>
Avatar
Good ideas, let me give it another go
16:18
This will be about the 5th time I've rewritten up to this point 😄
Avatar
u can also make the trait generic if u need more
16:18
xd
16:18
anmd honestly
16:19
i wouldnt put the database as a module
16:19
i would put it part of bot context
16:19
and modules use the database
16:19
modules would be then a vec of objects implementing the module trait
16:19
without a lock
16:19
the locks are inside the objects
16:19
isnt it better to lock less scope
Avatar
Avatar
Ryozuki
i would put it part of bot context
Yeah not the worst idea, it'd also take care of the weird asymmetry
Avatar
@Learath2 btw u may be able to forego the option
16:20
in rust u can partially initialize a struct
16:20
pub database: Option<database::Context>, pub ddnet_bans: Option<ddnet_bans::Context>,
16:20
i mean this
16:20
idk why its a option
16:20
just make it always be there? xd
16:21
ah well
16:21
u solve this problem using a vec of modules
16:21
simply dont care about them specifically
16:21
then implement ur full blown ipc between modules, and reach mars
Avatar
Ah this part is actually a bit of an issue, with this new vec of modules I now don't really have an easy way to generate the config struct
Avatar
@Learath2 make a trait
16:22
or part of trait
16:22
that returns the needed config for a module
16:22
hmm
16:23
u make a global config
16:23
it has the modules name , module_name: T
16:23
where T is simply deserialize
Avatar
Types aren't first class so I can't return them, but maybe an associated type?
Avatar
u pass T to the trait method
16:23
there is first class
16:23
depending o nwhat u using
16:23
is it json?
16:23
serde_json::Value
Avatar
deserializes anything
16:24
and u can get T from Value
Avatar
But that's not what I meant, I mean the global config struct, I need to somehow be able to generate it
Avatar
Currently it's just modules: ModuleConfig, and ModuleConfig is just a struct of the configs from each module
16:25
each module should be a toml table
16:25
vec of Table(Table)?
16:25
u deserialize that to the T provided by the module trait
Avatar
I think we are losing eachother again, let me code it up a bit then I can show more then we can talk more
Avatar
#[derive(Deserialize, Debug)] pub struct Config2 { pub modules: toml::Table, } #[derive(Deserialize, Debug)] pub struct RyoModule { pub hello: String, } pub fn parse_config2(path: &Path) -> anyhow::Result<Config2> { let mut file = File::open(path)?; let mut file_contents = String::new(); file.read_to_string(&mut file_contents)?; Ok(toml::from_str(&file_contents)?) } pub fn parse_config_from_module(config: &toml::Table) -> anyhow::Result<RyoModule> { Ok(RyoModule::deserialize(config["ryo"].clone())?) } (edited)
16:29
@Learath2
16:29
wait
16:30
now
16:30
u dont need a vec
16:30
just table
16:30
xd
Avatar
i think its a table
16:30
idk toml rn
16:31
but u get the idea
Avatar
Avatar
Ryozuki
idk toml rn
100 years ago this would have no meaning
Avatar
learath dieded
Avatar
Avatar
Ryozuki
in rust u can partially initialize a struct
How?
Avatar
with unsafe
16:43
#[derive(Debug, PartialEq)] pub struct Foo { name: String, list: Vec<u8>, } let foo = { let mut uninit: MaybeUninit<Foo> = MaybeUninit::uninit(); let ptr = uninit.as_mut_ptr(); // Initializing the `name` field // Using `write` instead of assignment via `=` to not call `drop` on the // old, uninitialized value. unsafe { addr_of_mut!((*ptr).name).write("Bob".to_string()); } // Initializing the `list` field // If there is a panic here, then the `String` in the `name` field leaks. unsafe { addr_of_mut!((*ptr).list).write(vec![0, 1, 2]); } // All the fields are initialized, so we call `assume_init` to get an initialized Foo. unsafe { uninit.assume_init() } };
Avatar
On new t0 map releases, almost all the people trying to finish the map in team 0 are trying to join the same 1 server, so it's extremely hard for people to join the server once it becomes full. The new map sus'terism is an extremely good example for this, usually 10+ of my friends are on it at any time these couple of days, and it's really hard to get other friends or yourself into the full server. Currently it's up to chance whether you or another person connects first, and it's really an...
16:48
A lot of people don't like playing with dummy players in team 0, so what if players could vote to disable connecting new dummies to the server? It'd be up to the whole server to make the vote without veto, and could bring the community together better, because you know you'll only play with other players, and no ego dummy players.
Avatar
OH YEAH MILESTONE HIT
🥳 2
17:04
500 issues
17:04
epic
17:05
@Ryozuki gz to us, we at least tried to prevent this dark milestone from happening xd
17:09
next milestone is 600
Avatar
robyte destroyed the milestone
17:21
😬
Avatar
373 "relevant" issues
Avatar
we really need better ways to reproduce issues
Avatar
@Ryozuki why do you think &toml::Value can't be deserialized from? I can clone just fine, just interested why it can't borrow
Avatar
@Learath2 idk why rn
17:46
deserialize stuff?
17:46
maybe it only implements deserializeowned or smth
Avatar
is it me or are old prs like #2754 doing infinitely long checks
Avatar
Isn't finished yet but it'd be nice if you could take a look before I spend more time on it. Fixes #2748
Avatar
This should make adjusting envelopes with many close envpoints easier. At this point it is only a proof of concept, I just want to make sure that this is a wanted feature. !envelope_zoom

Checklist

  • [ ] Tested the change ingame
  • [ ] Provided screenshots if it is a visual change
  • [ ] Tested in combination with possibly related configuration options
  • [ ] Written a unit test (especia...
Avatar
Avatar
Voxel
is it me or are old prs like #2754 doing infinitely long checks
they timed out eventually (edited)
17:51
i dont think they still use any resources
17:51
they probably simply have a "pending" state and the client parses that and shows a yellow circle
Avatar
Avatar
Ryozuki
maybe it only implements deserializeowned or smth
I never really looked into the internals of serde, when I derive Deserialize I wonder what that implements
Avatar
Avatar
Learath2
I never really looked into the internals of serde, when I derive Deserialize I wonder what that implements
serde is dtolnay grand creation
18:26
A data structure that can be deserialized without borrowing any data from the deserializer.
18:27
Documentation index for CC: Tweaked
18:28
this is the best minecraft mod
18:28
sadly its lua
18:28
i wonder if this can be made with rust
Avatar
Avatar
GitHub
Click to see attachment 🖼️
what does this do?
Avatar
@Ryozuki serde does zero copy deserialization, right? How can I get copy deserialization? 😄
Avatar
lifetimes
18:29
&str
18:30
but u rly wanna complicate it
18:30
when u dont even have a solid design first
18:30
😬
Avatar
I'm an advocate for proper learning, I don't use things I don't understand
18:31
When I need to clone something that will get dropped in a minute it doesn't really compute in my brain
Avatar
Avatar
Learath2
I'm an advocate for proper learning, I don't use things I don't understand
it doesnt mean inproper learning
18:31
it means steps
18:31
i dont think adding lifetimes later is gonna be a big issue
Avatar
It means improper learning, if you just put a .clone() there and it kinda works you haven't understood shit
18:32
no
18:32
for u it means
18:32
"i understand this is not the best but since i want to get a result fast for now ill leave it and refactor in the future, when igot a proper structure"
Avatar
Don't care would rather have no bot then one I coded by randomly inserting stuff
18:33
ok
18:33
i think its not hard anyway
Avatar
Also I think you misunderstood my question, I explicitly want copy, not zero-copy
18:33
With lifetimes I could achieve zero-copy, I cba
Avatar
by copy u mean the trait?
18:33
u can only copy types that impl copy
18:34
and structs that all fields are copy
Avatar
I have a &toml::Value, I should be able to deserialize out of this, no? It gives access to all the data needed to deserialize
Avatar
Avatar
Learath2
Also I think you misunderstood my question, I explicitly want copy, not zero-copy
im now more confused
Avatar
Avatar
Learath2
I have a &toml::Value, I should be able to deserialize out of this, no? It gives access to all the data needed to deserialize
i think u need to pass it by value
18:35
since it doesnt know the underlying types
18:35
its opaque
18:35
it has to deserialize owning it
18:35
i think thats the rationale
Avatar
So you can't deserialize from a borrowed type?
Avatar
u cant from &toml::Value specifically i think
18:35
if u have a Deserialize struct
18:35
i think u can
18:36
/// Interpret a `toml::Value` as an instance of type `T`. /// /// This conversion can fail if the structure of the `Value` does not match the /// structure expected by `T`, for example if `T` is a struct type but the /// `Value` contains something other than a TOML table. It can also fail if the /// structure is correct but `T`'s implementation of `Deserialize` decides that /// something is wrong with the data, for example required struct fields are /// missing from the TOML map or some number is too big to fit in the expected /// primitive type. pub fn try_into<'de, T>(self) -> Result<T, crate::de::Error> where T: de::Deserialize<'de>, { d
18:36
they impl it on self
18:36
not &self
18:36
ask them
Avatar
Ah, now I see
Avatar
@Learath2 werent u the one saying the only truth is source code or smth
18:37
i always check the type stuff
18:38
control click on vscode
Avatar
True, idk why I didn't think to just check the source
18:39
18:39
The C Programming Language: Myths and Reality (1)
18:40
> >
The Internet is the first thing that humanity has built that humanity doesn’t understand, the largest experiment in anarchy that we have ever had.
>
-- Eric Schmidt
18:40
xd
Avatar
i love cooking up dumpster fire frontend code on company internships poggers2
19:14
awesome
19:16
not awesome
19:17
🫥
Avatar
well this is for companies
19:17
but ferrous systems is good
Avatar
kdab is also epic
➕ 1
Avatar
they made the "ferrous standard reference" for rust
19:17
idk kdab
Avatar
kdab are 3d and qt/cpp specialists
19:18
but they maintain the awesome code browser that used to be woboq
19:18
and have a really cool newsletter and blogs
19:19
ferrous are The Rust Specialists
19:19
xd
Avatar
i'm not sure it is for businesses based on the email i got
19:20
but idk
19:20
19:20
@Learath2
19:21
@Ewan but i wouldnt waste money learning the basics
19:21
in fact i would go to them once i know a lot
19:21
i want expert knowledge
19:21
not like i have that money anyway
19:21
seems like a cool thing though
19:22
i have to go
19:22
i bought a large bag of candied almonds at the renaissance festival yesterday and i wont be able to eat them for a while cuz i have a dentist appt xd
Avatar
i got a code learning app and it doesnt have rust
20:16
lol
20:17
sololearn
Avatar
code learning app 💀
Avatar
Avatar
MilkeeyCat
code learning app 💀
and
Avatar
Avatar
Voxel
and
I love them
Avatar
it’s 2:30 and my tooth hurty
20:37
excellent
Avatar
`` 4ae0928b47c91a84dff6168f7b5119d70537d0d4 is the first bad commit commit 4ae0928b47c91a84dff6168f7b5119d70537d0d4 Author: Robert Müller Date: Mon Apr 24 23:21:44 2023 +0200 Support bezier envelope curves in maps and editor Port map and editor support for CURVETYPE_BEZIER` from upstream, i.e. support bezier curves with configurable in- and out-tangents for every envelope point. The in- and out-tangents are represented by triangles and can be dragged in the envel...
Exported 379 message(s)