04:50 < bridge> I feel like conveying 2d side-profile water is hard 04:51 < bridge> maybe it could just be a solid color with some bubbles, also you can add a second layer to the surface like this 04:51 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1384727273843851264/image.png?ex=68537b45&is=685229c5&hm=a651e2d4534eab9cf6ccbd192e24c87d221a39fa6ad1c3d3063cb741fa6b0e69& 04:52 < bridge> another reference 04:52 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1384727415368061030/image.png?ex=68537b66&is=685229e6&hm=946fe5fc86cf603a026c0cfeeacb8fb5075cb3f9c141891ae22fe1bc2a3a8be7& 04:52 < bridge> https://tenor.com/view/skitchura-skitchura-d-sagusky-sagusky-d-luizdoro-gif-20449677 04:52 < bridge> just do spongebob background water 04:53 < bridge> the voronoi pattern can at least be stretched horizontally 04:53 < bridge> maybe also way bigger and then layered 05:30 < bridge> i liked 0.7 water pr water 05:33 < bridge> it had physics though 09:53 < bridge> uhm yes, you can map whatever water you want, spongebob, something wavy, wider voronoi pattern, as I said the mapper can decide that in my implementation 09:53 < bridge> I liked the 0.7 water pr as well, but I also see downsides on the approach taken (ignore the physics from now) 09:57 < bridge> @essigautomat do you have a github repo for this water animation somewhere 09:57 < bridge> i wanted to test it with my 30 layers of parallax water xd 10:14 < bridge> yes, but it's a really dirty PR, there is a lot of other related stuff in there, I can send you the client or the link to the branch if you want 10:14 < bridge> yes, but it's a really dirty PR, there is a lot of other unrelated stuff in there, I can send you the client or the link to the branch if you want 10:15 < bridge> also I wasn't bothered to do the split right, currently all tilelayers are liquified xD 11:09 < bridge> wheres the script to extract config variables from the .h file? 11:12 < bridge> pls send 11:12 < bridge> doesnt matter i just wanted to try it out for fun 13:10 < bridge> https://cdn.discordapp.com/attachments/1384218380294291596/1384236008773652480/image.png?ex=6851b1be&is=6850603e&hm=bb06cdf48dad2445bb0398dd13fd2c172b64782b13963d4abc3c267d2605e297& https://cdn.discordapp.com/attachments/1384218380294291596/1384236737089241119/image.png?ex=6851b26b&is=685060eb&hm=5682da43ac62f6137395541139b373cf4db2f3dd085f5d2200353662c2f21485& https://cdn.discordapp.com/attachments/1384218380294291596/1384236767237898251/ 13:27 < bridge> @essigautomat 13:27 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1384857027997728862/water_anim.mp4?ex=6853f41c&is=6852a29c&hm=4ac4557bf454ce36967860debf540496c189d251dfa5f13decc44fbf6524f190& 13:27 < bridge> that last wave layer kinda looks like its dancing xd 13:30 < bridge> i changed shader values to be more subtle in this one 13:30 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1384857849024479283/water_anim_2025-06-18_13-28-52aa.mp4?ex=6853f4e0&is=6852a360&hm=458fcece7439d2675f02135baa1a728e8e58fc56337f2d8288705bc599fb83ed& 13:32 < bridge> will there be any water physics applied to this? 13:32 < bridge> because looks like you can replicate it with quads + envs + clipping 13:37 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1384859486287691776/water_anim_2025-06-18_13-36-22.mp4?ex=6853f666&is=6852a4e6&hm=3c6056c2da0640289271b7a1acd06a99dbcf1fcdaa2b34e95651bef7af5768eb& 13:38 < bridge> nah not really, look what it does to tiles 13:38 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1384859793335910481/screenshot_2025-06-18_13-37-43.png?ex=6853f6b0&is=6852a530&hm=2e098cef57679fe164bf2d16cc2f72f12a81450b996631827aa5c7daa4dbde63& 13:38 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1384859793725853717/screenshot_2025-06-18_13-38-13.png?ex=6853f6b0&is=6852a530&hm=3ef4ff0d9d0ee3511be96854004aee314467346c9156c57138d48164ba9b837d& 13:39 < bridge> normally you would need to do it frame by frame or something 13:47 < bridge> why is there still memheap.cpp 13:48 < bridge> i have heard that malloc is bad for frequent small allocs but cheap seems to be used for pretty unchanging memory allocation, and we avoid memory allocation every frame anyway 13:57 < bridge> Wat? 13:57 < bridge> Who is cheap 13:59 < bridge> memheap* 14:00 < bridge> nah i mean for texture itself, like one on upstream 14:03 < bridge> I only see it used like 8 times in our code 14:03 < bridge> And all of them don't sound like frequent use 14:04 < bridge> Also it doesn't look like a malloc call but rather a cache 14:04 < bridge> Ah yeah you want to remove it bcs it's only used rarely ok 14:05 < bridge> Then I agree it's useless to have it 14:06 < bridge> Is that with water physics or speedups? 14:06 < bridge> its a shader 14:07 < bridge> I mean the tee movement 14:08 < bridge> holy moly, that's the reason I need my own graphics designer ❤️ 14:09 < bridge> from the screenshot I take, that it's a tune zone 14:10 < bridge> could be anything, air friction, anti gravity, infinite jumps ❤️ 14:11 < bridge> love the liquified gametiles :kek: 14:20 < bridge> tune_zone gravity -1 14:38 < bridge> today I learned, that menu backgrounds don't have maplayer type `background` 😑 15:14 < bridge> current master has insane fps, like I get constantly 4K everywhere 15:18 < bridge> until you open the scoreboard in a full server 💀 15:36 < bridge> i mean its a 2007 game 15:41 < bridge> text containers r expensive 15:49 < bridge> Now install Linux and you have 8k fps xd 15:49 < bridge> How much fps you have on full scoreboard? 15:54 < bridge> Uhm, do we build in debug again for steam releases? 15:55 < bridge> I get like almost 4k fps less on the steam version currently lol 15:55 < bridge> steam overlay? 15:56 < bridge> Yeah wtf 15:56 < bridge> The fps counter changed visually 15:56 < bridge> Wtf has valve done xD 15:57 < bridge> bing bong 15:58 < bridge> around 2900 fps on linear full scoreboard 15:58 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1384894967188557834/image.png?ex=68541772&is=6852c5f2&hm=16ed17336d84e84aae83005448de67a05df2bd5b59f81138ed204644a0023f5c& 15:58 < bridge> Now I try the non-beta client 15:59 < bridge> Yeah maybe around 2600 fps 15:59 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1384895334819561483/image.png?ex=685417c9&is=6852c649&hm=24bf31e63669039ca768b052642c27966c350abdb33f288813076bb8c3c84d9e& 16:30 < bridge> ```cpp 16:30 < bridge> static constexpr int BUF_SIZE = 64; 16:30 < bridge> char s_aaaName[NUM_CONSOLETYPES][3][BUF_SIZE]; 16:30 < bridge> char s_aaaHelp[NUM_CONSOLETYPES][3][BUF_SIZE]; 16:30 < bridge> for(const auto &Instance : m_aInstances) 16:30 < bridge> { 16:30 < bridge> char aInstanceName[32]; 16:30 < bridge> int InstanceLength = str_find(Instance->m_pName, "_") - Instance->m_pName; 16:30 < bridge> auto &aaName = s_aaaName[Instance->m_Type]; 16:30 < bridge> auto &aaHelp = s_aaaHelp[Instance->m_Type]; 16:30 < bridge> str_truncate(aInstanceName, sizeof(aInstanceName), Instance->m_pName, InstanceLength); 16:30 < bridge> str_format(aaName[0], BUF_SIZE, "toggle_%s_console", aInstanceName); 16:31 < bridge> str_format(aaHelp[0], BUF_SIZE, "Toggle %s console", aInstanceName); 16:31 < bridge> Console()->Register(aaName[0], "", CFGFLAG_CLIENT, ConToggleConsole, Instance.get(), aaHelp[0]); 16:31 < bridge> str_format(aaName[1], BUF_SIZE, "clear_%s_console", aInstanceName); 16:31 < bridge> str_format(aaHelp[1], BUF_SIZE, "Clear %s console", aInstanceName); 16:31 < bridge> Console()->Register(aaName[1], "", CFGFLAG_CLIENT, ConClearConsole, Instance.get(), aaHelp[1]); 16:31 < bridge> str_format(aaName[2], BUF_SIZE, "dump_%s_console", aInstanceName); 16:31 < bridge> str_format(aaHelp[2], BUF_SIZE, "Dump %s console", aInstanceName); 16:31 < bridge> Console()->Register(aaName[2], "", CFGFLAG_CLIENT, ConDumpConsole, Instance.get(), aaHelp[2]); 16:31 < bridge> } 16:31 < bridge> 16:31 < bridge> for (int i = 0; i < NUM_CONSOLETYPES; ++i) { 16:31 < bridge> for (int j = 0; j < 3; ++j) { 16:31 < bridge> printf("s_aaaName[%d][%d] = \"%s\"\n", i, j, s_aaaName[i][j]); 16:31 < bridge> } 16:31 < bridge> } 16:31 < bridge> 16:31 < bridge> for (int i = 0; i < NUM_CONSOLETYPES; ++i) { 16:31 < bridge> for (int j = 0; j < 3; ++j) { 16:31 < bridge> printf("s_aaaHelp[%d][%d] = \"%s\"\n", i, j, s_aaaHelp[i][j]); 16:31 < bridge> it prints out the right values, but the commands arent registered 16:31 < bridge> ```cpp 16:31 < bridge> s_aaaName[0][0] = "toggle_local_console" 16:31 < bridge> s_aaaName[0][1] = "clear_local_console" 16:31 < bridge> s_aaaName[0][2] = "dump_local_console" 16:31 < bridge> s_aaaName[1][0] = "toggle_remote_console" 16:31 < bridge> s_aaaName[1][1] = "clear_remote_console" 16:31 < bridge> s_aaaName[1][2] = "dump_remote_console" 16:32 < bridge> s_aaaHelp[0][0] = "Toggle local console" 16:32 < bridge> s_aaaHelp[0][1] = "Clear local console" 16:32 < bridge> s_aaaHelp[0][2] = "Dump local console" 16:32 < bridge> s_aaaHelp[1][0] = "Toggle remote console" 16:32 < bridge> s_aaaHelp[1][1] = "Clear remote console" 16:32 < bridge> s_aaaHelp[1][2] = "Dump remote console" 16:32 < bridge> ``` 16:32 < bridge> Those are temporary values 16:32 < bridge> I THOUGHT I MADE THEM STATIC 16:32 < bridge> (see the s_) 16:32 < bridge> ty :) 16:32 < bridge> works, ty :) 16:32 < bridge> I THOUGHT I MADE THEM STATIC (see the s_) 16:32 < bridge> its more lines than before, but it means i can just add another one easily x-x 16:32 < bridge> which i want to do 16:33 < bridge> (not for ddnet) 16:34 < bridge> Doesn't make it more readable for me though 16:34 < bridge> If you want it to me more generic then it should have been `toggle_console remote` 16:34 < bridge> that wouldnt be backwards compatible though 16:35 < bridge> can you think of a cleaner way of doing this 16:36 < bridge> 1/3rd 💀 16:36 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1384904538896465952/screenshot_2025-06-18_16-35-29.png?ex=6854205c&is=6852cedc&hm=d6aaa6fe8f3aaf53ba642fd60ff95d97ab1bc457692f31ffb60c97f0c0623bee& 16:36 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1384904539404107857/screenshot_2025-06-18_16-35-32.png?ex=6854205c&is=6852cedc&hm=8280d4d952a0e1495ea666ad89e8f010286382f2dd55c31a168223371f3b0c64& 16:36 < bridge> The original 16:37 < bridge> even If I zoom out and watch all of Multieasymap simultaniously, I still have more fps then open the scoreboard 16:39 < bridge> -# \#7777 mentioned 16:39 < bridge> whilst making it easy to add more 16:39 < bridge> https://github.com/ddnet/ddnet/issues/7777 16:41 < bridge> This doesn't really make it easier to add more. Copying 3 lines to register command handlers for another console is easier than understanding this code. 16:42 < bridge> One problem is simply that we have many render calls. for every text one 16:42 < bridge> Batching them would defs improve fps 16:42 < bridge> But honestly. >1000 fps is still better than anything u need xdd 16:42 < bridge> would reordering them be fine 16:43 < bridge> Why? They are sorted already 16:43 < bridge> and keeping the pUser now takes an instance instead of this so the Cons dont have to be duplicated 16:43 < bridge> so that new ones are at the end 16:43 < bridge> not that there will be any changes to this code 16:45 < bridge> I suppose it makes sense to move the command handlers inside `CInstance` to remove the duplication, but then I would also move the command registration inside `CInstance::Init` 16:46 < bridge> Each console should register its own commands 16:46 < bridge> is onconsoleinit not meant to be used for console init? 16:46 < bridge> Each console instance should register its own commands 16:46 < bridge> oh right 16:46 < bridge> i do like that 16:46 < bridge> `CGameConsole::OnConsoleInit` calls `m_LocalConsole.Init(this)` 16:46 < bridge> is onconsoleinit not meant to be used for commands init? 16:46 < bridge> But you also need to move `m_pConsole = Kernel()->RequestInterface();` up or this won't be initialized 16:46 < bridge> yes 16:47 < bridge> I also tried to add a third console type already, but I got stuck having to implement the actual econ client backend 16:47 < bridge> future PR: text grouping :pepeW: 16:47 < bridge> so have i, i also got stuck at the implementation of what it was 16:47 < bridge> i still would like to make the process easier 16:48 < bridge> i also got stuck at the implementation of what it was 16:48 < bridge> Well ig not only render calls. generally we don't cache text, so every frame we go through all chars etc. 16:49 < bridge> Maybe somehow caching them would already help tons 16:49 < bridge> I am already scared 16:50 < bridge> this still means having member strings for the commands which i find dirty 16:50 < bridge> How much additional memory would text containers end up using if we used them everywhere? 16:50 < bridge> only as much as the scoreboard uses when active 16:50 < bridge> minus the realloc every frame 16:51 < bridge> I dunno, 24bytes per character or smth? 16:51 < bridge> lol i always thought its the mini tees that eat all that fps, not text 16:51 < bridge> the tees are like 10 quads 16:51 < bridge> even if immediate 600 quads is fine 16:51 < bridge> ofc they also have an impact, but I always knew that text was tanking it 16:52 < bridge> with my latest PR we can render a million quads without impact 16:52 < bridge> with my latest PR we can render a million quads without (much) impact 16:52 < bridge> was it merged? 16:52 < bridge> yes 16:52 < bridge> does it affect all quads on all maps or how does it work 16:53 < bridge> well, _maybe_ 16:53 < bridge> it optimizes rendering, if all quads have the same envs 16:53 < bridge> meaning if all quads have no env, or all quads have the same color AND position env AND offsets 16:53 < bridge> wait this might be huge actually 16:53 < bridge> lemmie test on my stars spam map 16:54 < bridge> i know 16:54 < bridge> `sizeof(STextCharQuad) == 80` :justatest: 16:54 < bridge> I must say it was jupeeys idea, since he already did that in ddnet-rs, I was just the one willing to implement it 16:54 < bridge> Now the question is, how many chars are there that we want to cache 16:54 < bridge> This contains the color for each vertex separately, is that really necessary? 16:54 < bridge> 80 * 1000 16:54 < bridge> 16:54 < bridge> would only be 80 KiB 16:54 < bridge> 80 * 1000 16:54 < bridge> 16:54 < bridge> would only be 80 KB 16:54 < bridge> 80 * 1000 16:54 < bridge> 16:55 < bridge> would only be 80 kB 16:55 < bridge> I know you're doing some inline/outline stuff, good question 16:55 < bridge> Well the opposite would be 1 color per draw call 16:55 < bridge> You cannot easily do one color per char 16:55 < bridge> You currently can create one text container with different colors 16:56 < bridge> Dunno if we use that somewhere 16:56 < bridge> ```cpp 16:56 < bridge> struct STextCharQuadVertex 16:56 < bridge> { 16:56 < bridge> STextCharQuadVertex() 16:56 < bridge> { 16:56 < bridge> m_Color.r = m_Color.g = m_Color.b = m_Color.a = 255; 16:56 < bridge> } 16:56 < bridge> float m_X, m_Y; 16:56 < bridge> // do not use normalized floats as coordinates, since the texture might grow 16:56 < bridge> float m_U, m_V; 16:56 < bridge> STextCharQuadVertexColor m_Color; 16:56 < bridge> }; 16:56 < bridge> 16:56 < bridge> struct STextCharQuad 16:56 < bridge> { 16:57 < bridge> STextCharQuadVertex m_aVertices[4]; 16:57 < bridge> }; 16:57 < bridge> ``` 16:57 < bridge> But why store the color for each `STextCharQuadVertex` and not once for each `STextCharQuad`? 16:57 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1384909754643779664/image.png?ex=68542537&is=6852d3b7&hm=011f013c458d8bebd913037b1ef2c811c8b612bbc9a37c2cf776dbc08f717738& 16:57 < bridge> I know broadcasts had a feautre for colored texts, like "^900 red ^009 blue" stuff 16:57 < bridge> Bcs that is not how it works. 16:57 < bridge> 16:57 < bridge> On the GPU you can only stream vertices 16:57 < bridge> Not structs 16:57 < bridge> I see, that's kind of what I was expecting already 16:57 < bridge> Which doesn't mean it's generally impossible.. It's possible since OpenGL 4.3 or smth with shader storage buffers 16:58 < bridge> https://www.khronos.org/opengl/wiki/Shader_Storage_Buffer_Object 16:59 < bridge> test 16:59 < bridge> test passed ✅ 17:00 < bridge> adopt the tee discord tag 17:00 < bridge> Done ☑️ 17:00 < bridge> be in mind, that people with ogl1 don't benefit from this and might be unable to play the map if you do too much quads 17:01 < bridge> keep in mind, that people with ogl1 don't benefit from this and might be unable to play the map if you do too much quads 17:01 < bridge> one more reason to drop ogl1 🙈 17:01 < bridge> drop ogl3 too 17:01 < bridge> ogl 3.0 also doesn't profit from it 17:01 < bridge> allow only vulkan 1.3 17:01 < bridge> Yes 17:01 < bridge> :deen_star: 17:01 < bridge> Only Vulkan 1.4 17:01 < bridge> :deen_star: 17:01 < bridge> ogl3.3 does profit from it 17:02 < bridge> ```cp 17:02 < bridge> void CGameConsole::CInstance::Init(CGameConsole *pGameConsole) 17:02 < bridge> { 17:02 < bridge> m_pGameConsole = pGameConsole; 17:02 < bridge> 17:02 < bridge> char aInstanceName[32]; 17:02 < bridge> int InstanceLength = str_find(m_pName, "_") - m_pName; 17:02 < bridge> str_truncate(aInstanceName, sizeof(aInstanceName), m_pName, InstanceLength); 17:02 < bridge> str_format(m_aaCommandNames[0], BUF_SIZE, "toggle_%s_console", aInstanceName); 17:02 < bridge> str_format(m_aaCommandHelps[0], BUF_SIZE, "Toggle %s console", aInstanceName); 17:02 < bridge> pGameConsole->Console()->Register(m_aaCommandNames[0], "", CFGFLAG_CLIENT, ConToggleConsole, Instance.get(), m_aaCommandHelps[0]); 17:02 < bridge> str_format(m_aaCommandNames[1], BUF_SIZE, "clear_%s_console", aInstanceName); 17:02 < bridge> str_format(m_aaCommandHelps[1], BUF_SIZE, "Clear %s console", aInstanceName); 17:02 < bridge> pGameConsole->Console()->Register(m_aaCommandNames[1], "", CFGFLAG_CLIENT, ConClearConsole, Instance.get(), m_aaCommandHelps[1]); 17:02 < bridge> str_format(m_aaCommandNames[2], BUF_SIZE, "dump_%s_console", aInstanceName); 17:02 < bridge> str_format(m_aaCommandHelps[2], BUF_SIZE, "Dump %s console", aInstanceName); 17:02 < bridge> pGameConsole->Console()->Register(m_aaCommandNames[2], "", CFGFLAG_CLIENT, ConDumpConsole, Instance.get(), m_aaCommandHelps[2]); 17:02 < bridge> } 17:02 < bridge> ``` 17:02 < bridge> @robyt3 this is not much better 17:02 < bridge> im gonna change m_pName to just be "local" not "local_console" so it will be a bit smaller 17:02 < bridge> i opened the game with ogl3.3 and some bg quads were fully dark but anyway 17:02 < bridge> @essigautomat DAMN I GET 2x fps 17:02 < bridge> send map 17:02 < bridge> - drop all ogl 17:02 < bridge> - drop windows 17:02 < bridge> - drop macos 17:03 < bridge> - drop 0.7 compat 17:03 < bridge> - drop pre 19.0 backwards compat stuff 17:03 < bridge> - drop all ogl 17:03 < bridge> - drop windows 17:03 < bridge> - drop macos 17:03 < bridge> - drop 0.7 compat 17:03 < bridge> - drop pre 19.2.1 backwards compat stuff 17:03 < bridge> Do you self build? 17:03 < bridge> The future is so bright 17:03 < bridge> i downloaded from here https://github.com/ddnet/ddnet/actions/runs/15717138449 17:03 < bridge> lmao, random pr 17:03 < bridge> lmao, what r the chances 17:03 < bridge> Then that would be a bug 17:04 < bridge> If you also copied data dir 17:04 < bridge> I think hard-coding the strings is more readable. This also wouldn't work with the script parsing console commands 17:04 < bridge> i just choose most recent master when i update the game xd 17:04 < bridge> the PR doesn't necessarily have this change, it might merge without conflicts, but can be based on an older version 17:04 < bridge> oh dear, i thoughtit just opened the game and did something 17:04 < bridge> the PR doesn't necessarily have this change, it might merge without conflicts, but can be based on an older version, can't tell 17:04 < bridge> i play on master too 17:04 < bridge> all devs should play on master 17:04 < bridge> to debug 17:04 < bridge> find bugs 17:05 < bridge> this would also make the functional version of register not work 17:05 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1384911954384257095/bg3_2025-06-18_17-02-53.mp4?ex=68542744&is=6852d5c4&hm=4c420d1f1a15014c39ebd72c3fcc488c34e2b1a54e95235de32dc8a7a9699e82& 17:05 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1384911954862411877/bg2.map?ex=68542744&is=6852d5c4&hm=8ccdcb03c76a2e4efb445c70709ed9ebed898eed2a6f753d5e1d7df857b3d2fa& 17:05 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1384911955185106944/bg3.map?ex=68542744&is=6852d5c4&hm=db4fdb6df70990c45637139017c1fcecceb5c907a30ebb464b5a0dcdac9566a7& 17:06 < bridge> Why? You need to pass the command name and help text to the console instance constructor then 17:06 < bridge> Oh yeah, that wouldn't work... 17:06 < bridge> i get 1800 fps on the new version and 800 fps on 19.0 17:06 < bridge> thats crazy increase 17:06 < bridge> pog 17:06 < bridge> well you would have to change the script, but it would work 17:06 < bridge> 3.8K with twitch open 17:06 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1384912266893328444/screenshot_2025-06-18_17-06-33.png?ex=6854278e&is=6852d60e&hm=89112915fa89204920f025b792f53a1e66320f6e99a675031261d9bd78a05220& 17:06 < bridge> the intention of the functional thing thoughh is to reduce repetition 17:07 < bridge> I did something like that for 0.7 to export commands 17:07 < bridge> can we switch to that aswell? 17:07 < bridge> try the other one, its animated 17:07 < bridge> 3.8K with twitch and chat open, else 5K 17:07 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1384912266893328444/screenshot_2025-06-18_17-06-33.png?ex=6854278e&is=6852d60e&hm=89112915fa89204920f025b792f53a1e66320f6e99a675031261d9bd78a05220& 17:07 < bridge> the intention of the functional thing thoughh is to reduce repetition, by having loops of registers with different captures and stuff 17:07 < bridge> there I only get 1.4 K 17:07 < bridge> the fact you have to manage the string memory is a bit annoying though for this 17:07 < bridge> as i now have found 17:07 < bridge> i wonder when we (by mistake) will add a map feature that makes it turing complete, and someone does doom in it 17:08 < bridge> can u do a sr latch with switches 17:08 < bridge> you dont have enuf switches to do anything 17:08 < bridge> rip 17:09 < bridge> we really need a higher level compiler to ddnet switches lmao 17:09 < bridge> then up the switch limit to 32bit 17:11 < bridge> @robyt3 you know what i could do, im planning on making each instance inherited so i can have on each constructor the seperate commands 17:11 < bridge> its not much better actually you still have to write everything out, but you get to use this for pUser still 17:11 < bridge> technically we can already set 1 quad per screen pixel and teleport the player around really fast, playing the shrek movie 17:12 < bridge> I'd move the command handlers to `CInstance` but register the commands in `CConsole::OnConsoleInit` 17:15 < bridge> as I said, (time)offsets and envs need to be the same, an algorithm chunking the quads of a layer into groups is not implemented. If you see the need for this, feel free to implement it :justatest: 17:15 < bridge> thats kinda weird 17:16 < bridge> Seems like the only way that works with the correct script 17:18 < bridge> Otherwise you'd first have to add `dump_X` commands to dump lists of all commands etc. as json, then write a converter from that json to the HTML on the website. I also rewrote the script recently because it had various issues: https://github.com/ddnet/ddnet/pull/10194 17:18 < bridge> On these maps you get black quads with OGL 3.3? 17:19 < bridge> it was on autumn menu theme 17:19 < bridge> and only the background quad 17:19 < bridge> the clouds were fine 17:20 < bridge> tho i cant seem to replicate it now no idea whats going on 17:20 < bridge> Alr 17:20 < bridge> If it happens again check F1 logs 😄 17:21 < bridge> i can check log file 17:21 < bridge> sec 17:21 < bridge> can not reproduce 17:22 < bridge> I am on the other hand a bit concerned how maplayers are initialized 17:22 < bridge> maybe something on your device was not ready or something when the game starts 17:37 < bridge> whats the first line in logs should be when starting the client 17:38 < bridge> because it looks like i reopened another client on the same second and im confused 17:38 < bridge> `engine: running on` 17:38 < bridge> Unless you are on Android 17:40 < bridge> ``` 17:40 < bridge> 2025-06-18 16:57:42 I engine: running on windows-win64-amd64 17:40 < bridge> 2025-06-18 16:57:42 I engine: arch is little endian 17:40 < bridge> 2025-06-18 16:57:42 I engine: operating system version: Windows 10.0.26100.4202 17:40 < bridge> ``` 17:40 < bridge> ``` 17:40 < bridge> 2025-06-18 16:57:42 I http: libcurl version 8.8.0 (compiled = 8.8.0) 17:40 < bridge> 2025-06-18 16:57:42 I sdl: SDL version 2.30.5 (compiled = 2.30.5) 17:40 < bridge> 2025-06-18 16:57:42 I gfx: Created OpenGL 3.3 context 17:40 < bridge> 2025-06-18 16:57:43 I opengl: Vendor string: NVIDIA Corporation 17:40 < bridge> 2025-06-18 16:57:43 I opengl: Version string: 3.3.0 NVIDIA 572.70 17:40 < bridge> ``` 17:40 < bridge> i think its this one 17:40 < bridge> ``` 17:40 < bridge> 0(11) : error C1307: non constant expression for array size 17:40 < bridge> 0(12) : error C1503: undefined variable "TW_MAX_QUADS" 17:40 < bridge> 0(12) : error C1307: non constant expression for array size 17:40 < bridge> 17:40 < bridge> 2025-06-18 16:57:43 I glsl: shader/quad.frag: 0(7) : error C1503: undefined variable "TW_MAX_QUADS" 17:40 < bridge> 0(7) : error C1307: non constant expression for array size 17:40 < bridge> 17:40 < bridge> 2025-06-18 16:57:43 I glslprogram: Error! Shader program wasn't linked! The linker returned: 17:40 < bridge> 17:40 < bridge> 17:40 < bridge> 2025-06-18 16:57:43 I glsl: shader/quad.vert: 0(12) : error C1503: undefined variable "TW_MAX_QUADS" 17:40 < bridge> 0(12) : error C1307: non constant expression for array size 17:40 < bridge> 0(13) : error C1503: undefined variable "TW_MAX_QUADS" 17:41 < bridge> 0(13) : error C1307: non constant expression for array size 17:41 < bridge> 17:41 < bridge> 2025-06-18 16:57:43 I glsl: shader/quad.frag: 0(8) : error C1503: undefined variable "TW_MAX_QUADS" 17:41 < bridge> 0(8) : error C1307: non constant expression for array size 17:41 < bridge> 17:41 < bridge> 2025-06-18 16:57:43 I glslprogram: Error! Shader program wasn't linked! The linker returned: 17:41 < bridge> ``` 17:41 < bridge> That is the important log 17:41 < bridge> `2025-06-18 16:57:50 I client: saved screenshot to 'C:\Users\souly\AppData\Roaming/Teeworlds/screenshots/screenshot_2025-06-18_16-57-50.png'` 17:41 < bridge> i made a screenshot after this so it should be this i guess 17:41 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1384920888029216828/screenshot_2025-06-18_16-57-50.png?ex=68542f96&is=6852de16&hm=1ea6d3a93995ed79271159b47861fdb019685f15385026a07edff45e0e12208d& 17:41 < bridge> oO 17:41 < bridge> i cant reproduce rn tho 17:41 < bridge> If you are 100% sure you copied the data dir correctly that time. 17:41 < bridge> 17:41 < bridge> Then it's a bug 17:41 < bridge> Otherwise it was a data mismatch in the shader files 17:42 < bridge> i reopened the client with vulcan after that and it worked fine 17:42 < bridge> So you can still reproduce the bug in OGL 3.3 potentially? 17:42 < bridge> but now even when i change the rendered to opg3.3 i cant reproduce no idea why 17:42 < bridge> Ok 17:42 < bridge> Well then... we'll never know 17:42 < bridge> 🫠 17:43 < bridge> :feelsbadman: 17:43 < bridge> Does Windows cache the shaders already? 17:43 < bridge> If it does, then it would at least take like a sha or smth 17:43 < bridge> I doubt they just cache random files by name xD 17:44 < bridge> i was messing up with shaders by assa but it was all in another folder so idk 17:44 < bridge> but i guess it shouldnt be related since it didnt touch quads 17:45 < bridge> https://developer.nvidia.com/docs/drive/drive-os/6.0.9/public/drive-os-linux-sdk/common/topics/graphics_content/AutomaticShaderCache8.html 17:45 < bridge> Doesn't say they hash the shader contents 17:45 < bridge> Well they say shader source 17:46 < bridge> They don't have file access 17:46 < bridge> They don't even have a name for the shader 17:46 < bridge> Just source code 17:46 < bridge> So actually it's probs impossible 17:47 < bridge> True. No idea if it wasn't a mismatched data dir then though 17:48 < bridge> at least from a code pov this should have not happened as far as I can tell 17:51 < bridge> Since it was in the menu we'll notice sooner or later if this is really a bug 17:52 < bridge> It's autumn soon too 🍃 17:52 < bridge> Good testing methodology 18:08 < bridge> summer theme is almost the same 18:52 < bridge> woah cool 18:52 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1384938956029689987/image.png?ex=6854406a&is=6852eeea&hm=aca3bdff50c97eec25d654b64e6caab86fea96b97ae559209f3d16208798762a& 18:54 < bridge> tee 18:54 < bridge> tee 18:54 < bridge> tee 18:54 < bridge> kinda cool actually if you're in other discords 18:54 < bridge> free ads 18:55 < bridge> sorry I only run on coffee 18:55 < bridge> i want coffee 18:55 < bridge> and not on nitro 18:55 < bridge> u dont need nitro 18:59 < bridge> but it seems you need the desktop app 18:59 < bridge> if I change my server name to Assassin now, I went full circle after 16 years and am AssassinTee again 19:00 < bridge> if I change my server name to Assassin now, I would have gone full circle after 16 years and am AssassinTee again 19:00 < bridge> if I change my server name to Assassin now, I would have gone full circle after 16 years and be AssassinTee again 19:00 < bridge> weird 19:00 < bridge> for me I can't remember where I found it on mobile 19:00 < bridge> but discord is so ass anyway idc 19:05 < bridge> works in brower 19:05 < bridge> works in browser 19:11 < bridge> There is imo a translation error, a name tag is not a server tag, these are server tags ... that get attached to names 19:11 < bridge> found where I can do this in the app 19:25 < bridge> Teewelten 19:36 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1384950002580983941/image.png?ex=68544ab3&is=6852f933&hm=0134429806d8271e4a6552334d43727c6d0aa8167d66f2bc142faa6bdfab1d63& 19:36 < bridge> i have never used this feature D: 19:38 < bridge> They are getting more annoying about this shit xd 19:39 < bridge> got an email a while ago 19:39 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1384950579394248826/image.png?ex=68544b3d&is=6852f9bd&hm=eb3658064436fb0af5f859d54a5d01a3c211e09bf651d82adb34f1f314703ddd& 19:51 < bridge> why is open red 19:54 < bridge> im special 20:01 < bridge> @soulyvevo which of the water implementations would be your favourite? 20:14 < bridge> ```cpp 20:14 < bridge> if(m_Type != CONSOLETYPE_REMOTE || m_pGameConsole->Client()->RconAuthed()) 20:14 < bridge> { 20:14 < bridge> const char *pPrevEntry = m_History.Last(); 20:14 < bridge> if(pPrevEntry == nullptr || str_comp(pPrevEntry, pLine) != 0) 20:14 < bridge> { 20:14 < bridge> const size_t Size = str_length(pLine) + 1; 20:14 < bridge> char *pEntry = m_History.Allocate(Size); 20:14 < bridge> str_copy(pEntry, pLine, Size); 20:14 < bridge> } 20:14 < bridge> // print out the user's commands before they get run 20:14 < bridge> char aBuf[IConsole::CMDLINE_LENGTH + 3]; 20:14 < bridge> str_format(aBuf, sizeof(aBuf), "> %s", pLine); 20:14 < bridge> m_pGameConsole->PrintLine(m_Type, aBuf); 20:15 < bridge> } 20:15 < bridge> ``` 20:15 < bridge> whats the point of ` if(pPrevEntry == nullptr || str_comp(pPrevEntry, pLine) != 0)` 20:15 < bridge> what is m_History 20:15 < bridge> maybe it just doesn't check on return 20:15 < bridge> sorry took a while 20:15 < bridge> it just doesnt allocate a new string 20:15 < bridge> if the last history item is the same 20:15 < bridge> smort 20:15 < bridge> o yea 21:02 < bridge> what are the other ones besides these shaders from today 21:08 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1384972986406277261/434077547-9c87e92a-d461-4f0a-b2f2-e66f91a2b67b.mp4?ex=6854601b&is=68530e9b&hm=e085a327aa533471f8bd3a69d5f32893d3babfac0f6516e1603ea2e31bd1ccfe& 21:08 < bridge> i like new things which arent just tune zones 21:13 < bridge> okay hear me out 21:13 < bridge> i want both 21:14 < bridge> i thought of making some funny black holes/space rifts or whatever with the shader one 21:15 < bridge> we need more stuff like that tbh 21:15 < bridge> i want fancy animated tiles 21:31 < bridge> what does ddnet even do with websockets 21:31 < bridge> i had no idea they were in the game 21:31 < bridge> web client 21:32 < bridge> wdym 21:32 < bridge> roby for some reason really wants to get ddnet working on web 21:32 < bridge> idk how is the latency on a webgl based client 21:32 < bridge> i've never tried anything interactive like that 21:32 < bridge> would it be usable 21:32 < bridge> probbaly 21:32 < bridge> its just a bit annoying since you are forced to use tcp 21:33 < bridge> i mean 21:33 < bridge> I finished the Tutorial in a web browser 21:33 < bridge> awesome 21:33 < bridge> was it tolerable 21:33 < bridge> would be much easier to convince friends to play 21:33 < bridge> if i could just say go https://ddnet.org/play 21:33 < bridge> easier than mobile 21:33 < bridge> the only problem is that you always need to press escape twice 21:33 < bridge> because first escape is always caught by the browser to undo fullscreen 21:34 < bridge> can you rebind the escape key to something else 21:34 < bridge> yeah that's annoying 21:34 < bridge> like use tilde 21:34 < bridge> theoretically 21:34 < bridge> not right now, we'd need to be able to rebind escape to something else 21:34 < bridge> also for better gamecontroller support 21:34 < bridge> is the version you beat the tutorial on public at all 21:34 < bridge> can i try it 21:35 < bridge> It's not public right now, you'd have to build it yourself for Emscripten and build the server with websockets 21:35 < bridge> The longest part is building the libraries for Emscripten 21:35 < bridge> is that just some emscripten & some flags 21:36 < bridge> nothing i haven't done before 21:36 < bridge> yeah, I don't use any additional local changes, master works to connect to a local websocket server at least 21:36 < bridge> why do we have temp commands 21:36 < bridge> ` if(pCommand->m_Flags & FlagMask && pCommand->m_Temp == Temp)` 21:36 < bridge> if i remove this check it should work still 21:37 < bridge> Temp commands are those that the server sends 21:37 < bridge> They are deregistered when disconnecting 21:37 < bridge> they are also marked as cfgflag_server 21:37 < bridge> temp is only descriptive of their lifetime not their use 21:38 < bridge> how do you specify an emscripten build? override `CMAKE_SYSTEM_NAME`? 21:38 < bridge> https://tenor.com/view/developers-gif-13292051 21:38 < bridge> true 21:38 < bridge> gm 21:38 < bridge> or w/e 21:38 < bridge> https://github.com/ddnet/ddnet?tab=readme-ov-file#cross-compiling-on-linux-to-webassembly-via-emscripten 21:38 < bridge> temp is only descriptive of their lifetime not their use 21:38 < bridge> (im removing the check, its annoying for me xd) 21:38 < bridge> It's mostly handled by the emsdk wrapper script 21:39 < bridge> First install https://emscripten.org/docs/getting_started/downloads.html (NOT via apt install) 21:40 < bridge> There are a basic server and html main file in https://github.com/ddnet/ddnet/tree/master/other/emscripten to test locally 21:40 < bridge> that check's argument is given by `m_UseTempRconCommands` which is set at the same time as RconAuth 21:40 < bridge> me when i am on windows 21:40 < bridge> I don't know how feasible connecting to other servers is due to CORS 21:40 < bridge> that's ok hopefully the wifi card I ordered arrives today & i can try to connect to the network here again 21:40 < bridge> I used a Ubuntu VM 21:41 < bridge> Yeah, would be cool if you could at least try the Tutorial like this 21:41 < bridge> why did you need linux 21:41 < bridge> do servers expose a websocket? 21:41 < bridge> websockets always go through an http connection which can be marked with a no cors policy 21:41 < bridge> they dont 21:41 < bridge> they're initialized through an http connection 21:42 < bridge> then it's all websocket protocol 21:42 < bridge> i dont think cors poses a threat if it can be exposed through ddnet.org and they're playing on ddnet.org 21:42 < bridge> 21:42 < bridge> also browsers dont check 21:43 < bridge> It seems like when I try the client on https://localhost (with self-signed cert) it doesn't work because it also tries to establish the websocket connection with TLS 21:43 < bridge> ah thats an issue 21:43 < bridge> then use ws:// instead 21:43 < bridge> https:// isnt allowed to use ws:// 21:43 < bridge> http:// is 21:43 < bridge> you don't actually have ssl on localhost 21:43 < bridge> that means making the page http:// which is ehhhh 21:43 < bridge> You mean host the server on websocket? Do web browser support that? 21:44 < bridge> i mean 21:44 < bridge> ive been doing ws:// at work 21:44 < bridge> server's on http 21:44 < bridge> when local 21:44 < bridge> and then wss works for real deployed instances 21:44 < bridge> https => wss, http => ws 21:44 < bridge> yes 21:44 < bridge> i just went to httpforever.com 21:44 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1384982146036273152/image.png?ex=685468a3&is=68531723&hm=464aabc045cdb89ba45df374eb736c784e1ad4bc123826d3556e7447126cf3b8& 21:44 < bridge> i am disapointed 21:45 < bridge> idk why it redirected me, it works now 21:45 < bridge> :kek: 21:45 < bridge> > Specify the target system: android, linux, window, webasm 21:45 < bridge> window 21:46 < bridge> im trying it on msys2 rn and i see no reason why it wouldn't work 21:46 < bridge> i'll let u know if i have trouble 21:46 < bridge> ```cpp 21:46 < bridge> else if((pPacket->m_Flags & NET_CHUNKFLAG_VITAL) != 0 && Msg == NETMSG_RCON_AUTH_STATUS) 21:46 < bridge> { 21:46 < bridge> int ResultInt = Unpacker.GetInt(); 21:46 < bridge> if(!Unpacker.Error()) 21:46 < bridge> { 21:46 < bridge> m_aRconAuthed[Conn] = ResultInt; 21:46 < bridge> 21:46 < bridge> if(m_aRconAuthed[Conn]) 21:46 < bridge> RconAuth(m_aRconUsername, m_aRconPassword, g_Config.m_ClDummy ^ 1); 21:46 < bridge> } 21:46 < bridge> if(Conn == CONN_MAIN) 21:46 < bridge> { 21:46 < bridge> int Old = m_UseTempRconCommands; 21:46 < bridge> m_UseTempRconCommands = Unpacker.GetInt(); 21:46 < bridge> if(Unpacker.Error()) 21:46 < bridge> { 21:46 < bridge> m_UseTempRconCommands = 0; 21:46 < bridge> } 21:47 < bridge> if(Old != 0 && m_UseTempRconCommands == 0) 21:47 < bridge> { 21:47 < bridge> m_pConsole->DeregisterTempAll(); 21:47 < bridge> m_ExpectedRconCommands = -1; 21:47 < bridge> m_vMaplistEntries.clear(); 21:47 < bridge> m_ExpectedMaplistEntries = -1; 21:47 < bridge> } 21:47 < bridge> } 21:47 < bridge> } 21:47 < bridge> ``` 21:47 < bridge> why are there 2 ints 21:47 < bridge> surely if you are authed you should use temprconcommands 21:47 < bridge> if there are no temprconcommands then fine, there are none 21:47 < bridge> and you can specify not to use temprconcommands which would allow the server to send commands but autocomplete and help wouldnt work 21:47 < bridge> i dont see the usecase 21:47 < bridge> solly unrelated, this is a potential issue; i guess i should've taken "outside of the source directory" more literally 21:47 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1384982861655970003/image.png?ex=6854694d&is=685317cd&hm=a28283f65d61d975a0fadf842c2cff4a4d84b96a3b782d55090fa71ddc7cd92a& 21:47 < bridge> i just made a subdirectory 21:47 < bridge> I've been meaning to rewrite this script for a while, it doesn't even work for other systems except android and webasm 21:47 < bridge> it's a little funny 21:48 < bridge> I have the build folder for the libraries inside the project folder like any other build folder 21:48 < bridge> oh but you run the script from the source folder 21:48 < bridge> hmm 21:48 < bridge> you run it from the project root, yeah 21:49 < bridge> i see the intention now, the script should just CD though because it's a subshell & it won't actually change dir for the user 21:49 < bridge> makes it much simpler too 21:55 < bridge> > ./cmake_lib_compile.sh: line 74: cd: build_webasm_wasm: No such file or directory 21:55 < bridge> what's that all about 21:55 < bridge> yurg 21:56 < bridge> weird, it should have created the build folder in the previous cmake call 21:57 < bridge> is it invoked via. emcmake 21:57 < bridge> that could be an issue 21:57 < bridge> i didn't have that in my path until just a second ago 21:58 < bridge> yeah, you need to `source ./emsdk_env.sh` in every terminal where you want to use the tools 21:58 < bridge> i dont have a file like that 21:58 < bridge> Should be part of https://emscripten.org/docs/getting_started/downloads.html 21:59 < bridge> Not sure why they list that path as an example, but I downloaded emsdk to my home folder 21:59 < bridge> msys2 doesn't seem to package that script 22:00 < bridge> You shouldn't install it from package manager I think 22:00 < bridge> On Ubuntu the version is outdated 22:01 < bridge> The website recommends cloning the current version from git 22:01 < bridge> im sure they do 22:08 < bridge> its to filter out CFGFLAG_CHAT 22:08 < bridge> which isnt done by the server 22:08 < bridge> some of which isnt done by the server 22:08 < bridge> oh my jeeeeez 22:10 < bridge> so jank 22:14 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1384989646710112267/image.png?ex=68546f9f&is=68531e1f&hm=9d74580206da8c1a58ac6eb1cde16971455af6666cd6b9eb910113144516272d& 22:14 < bridge> why is tc in rcon cmdlist 22:14 < bridge> im so fucking confused 22:20 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1384991284355399700/image.png?ex=68547126&is=68531fa6&hm=5e1f3230e84631e0e7bca8e9735735de08050ea635c7a7dc2375e586c74d94b4& 22:20 < bridge> AAAAAA 22:25 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1384992520093569034/image.png?ex=6854724c&is=685320cc&hm=dc5033b44696ecd9b634576e7ca3f8b1cac6fe06b7fee0fe576f383c457c54d3& 22:25 < bridge> WHERE DOES THIS COME FROM? 22:26 < bridge> Death protection is on close 22:26 < bridge> https://cdn.discordapp.com/attachments/293493549758939136/1384992662074953889/image.png?ex=6854726e&is=685320ee&hm=dc38ed97c897825150cc1115892745dbdc6209ac970a19e96e64bc8ddf4506fa& 22:26 < bridge> solly 22:26 < bridge> bro 22:27 < bridge> Do you have a ddrace server?, 22:27 < bridge> im going insane 22:27 < bridge> no i dont 22:27 < bridge> creating ddnet server me.? 22:27 < bridge> this is the same on all servers 22:27 < bridge> if you are questioning the behaviour 22:27 < bridge> let's make a server together 22:27 < bridge> like i am 22:27 < bridge> huh? 22:28 < bridge> solly 22:28 < bridge> nty 22:29 < bridge> vscode is fucking trolling 22:44 < bridge> config vars h or w/e 22:44 < bridge> there’s a flag for the macro to specify rcon 22:44 < bridge> it’s probably in there mistakenly 22:44 < bridge> its so bad 22:44 < bridge> that’s also where the descriptions are 22:45 < bridge> theres also 2 flags access level and command flags 22:45 < bridge> which really should be passed as args always 22:45 < bridge> and since its all thru virtual calls for no reason its really hard to find anything 22:45 < bridge> ```cpp 22:45 < bridge> void CConsole::ExecuteLineFlag(const char *pStr, int FlagMask, int ClientId, bool InterpretSemicolons) 22:45 < bridge> { 22:45 < bridge> int Temp = m_FlagMask; 22:45 < bridge> m_FlagMask = FlagMask; 22:45 < bridge> ExecuteLine(pStr, ClientId, InterpretSemicolons); 22:45 < bridge> m_FlagMask = Temp; 22:45 < bridge> } 22:45 < bridge> ``` 22:45 < bridge> bruh 22:45 < bridge> does the client parse rcon commands 22:51 < bridge> 100% skill issue 22:54 < bridge> of the codebase sure 23:35 < bridge> virtual calls for no reason 23:35 < bridge> that is a skill issue 23:35 < bridge> it's not for no reason it's because teeworlds follows an interface/client model 23:35 < bridge> that really does work