01:33 <+bridge> I'll continue working on it tommorow. 01:33 <+bridge> https://cdn.discordapp.com/attachments/293493549758939136/1115060830921306253/live_map_preview_in_editor.mp4 01:46 <+bridge> imagine having a huge ass map only to have to load it to preview so you can load it to edit 01:47 <+bridge> oh rly nice feature 01:47 <+bridge> im a map hoarder so that would be helpful for me 01:53 <+bridge> @Ravie we need an executice decision 02:02 <+bridge> strange feature, takes a lot of space also 02:03 <+bridge> i like it 02:14 <+bridge> its unused space 02:15 <+bridge> why not have a [x] Preview checkbox at the bottom 02:17 <+bridge> :pepeH: ye that's a good idea 02:32 <+bridge> heinrich doesnt like toggable features tho 02:32 <+bridge> heinrich doesnt like togglable features tho 02:39 <+bridge> I don't think that adding a toggle function for this adds burden for maintaining 02:46 <+bridge> becuase both the preview and normal would be maintained anyway if that is to be added 03:15 <+bridge> ```cpp 03:15 <+bridge> CMassFileLoader FileLoader(client->m_pStorage, IMassFileLoader::LOAD_FLAGS_ABSOLUTE_PATH); 03:15 <+bridge> FileLoader.SetOperationFailedCallback([](IMassFileLoader::LOAD_ERROR Error, const void *pUser) -> bool { 03:15 <+bridge> char Message[64]; 03:15 <+bridge> switch(Error) 03:16 <+bridge> { 03:16 <+bridge> case IMassFileLoader::LOAD_ERROR_NOT_INIT: 03:16 <+bridge> strcpy(Message, "Not init"); 03:16 <+bridge> break; 03:16 <+bridge> case IMassFileLoader::LOAD_ERROR_INVALID_PATH: 03:16 <+bridge> strcpy(Message, "Invalid path"); 03:16 <+bridge> break; 03:16 <+bridge> case IMassFileLoader::LOAD_ERROR_DIRECTORY_UNREADABLE: 03:16 <+bridge> strcpy(Message, "Directory unreadable"); 03:16 <+bridge> break; 03:16 <+bridge> case IMassFileLoader::LOAD_ERROR_UNWANTED_SYMLINK: 03:16 <+bridge> strcpy(Message, "Unwanted symlink"); 03:16 <+bridge> break; 03:16 <+bridge> case IMassFileLoader::LOAD_ERROR_FILE_UNREADABLE: 03:16 <+bridge> strcpy(Message, "File unreadable"); 03:16 <+bridge> break; 03:16 <+bridge> case IMassFileLoader::LOAD_ERROR_FILE_TOO_LARGE: 03:16 <+bridge> strcpy(Message, "File too large"); 03:16 <+bridge> break; 03:16 <+bridge> case IMassFileLoader::LOAD_ERROR_INVALID_REGEX: 03:16 <+bridge> strcpy(Message, "Invalid regex"); 03:16 <+bridge> break; 03:16 <+bridge> case IMassFileLoader::LOAD_ERROR_UNKNOWN: 03:16 <+bridge> [[fallthrough]]; 03:16 <+bridge> default: 03:16 <+bridge> strcpy(Message, "Unknown error"); 03:16 <+bridge> ``` 03:16 <+bridge> 2023-06-04 19:12:36 I test: Skin found, 1517 bytes; 'license.txt' 03:16 <+bridge> 2023-06-04 19:12:36 I test: Skin found, 2 bytes; 'test.txt' 03:16 <+bridge> ``` 03:16 <+bridge> nice, it's working 03:17 <+bridge> ```cpp 03:17 <+bridge> CMassFileLoader FileLoader(client->m_pStorage, IMassFileLoader::LOAD_FLAGS_ABSOLUTE_PATH); 03:17 <+bridge> FileLoader.SetOperationFailedCallback([](IMassFileLoader::LOAD_ERROR Error, const void *pUser) -> bool { 03:17 <+bridge> char Message[64]; 03:17 <+bridge> switch(Error) 03:17 <+bridge> { 03:17 <+bridge> case IMassFileLoader::LOAD_ERROR_NOT_INIT: 03:17 <+bridge> strcpy(Message, "Not init"); 03:17 <+bridge> break; 03:17 <+bridge> case IMassFileLoader::LOAD_ERROR_INVALID_PATH: 03:17 <+bridge> strcpy(Message, "Invalid path"); 03:17 <+bridge> break; 03:17 <+bridge> case IMassFileLoader::LOAD_ERROR_DIRECTORY_UNREADABLE: 03:17 <+bridge> strcpy(Message, "Directory unreadable"); 03:18 <+bridge> break; 03:18 <+bridge> case IMassFileLoader::LOAD_ERROR_UNWANTED_SYMLINK: 03:18 <+bridge> strcpy(Message, "Unwanted symlink"); 03:18 <+bridge> break; 03:18 <+bridge> case IMassFileLoader::LOAD_ERROR_FILE_UNREADABLE: 03:18 <+bridge> strcpy(Message, "File unreadable"); 03:18 <+bridge> break; 03:18 <+bridge> case IMassFileLoader::LOAD_ERROR_FILE_TOO_LARGE: 03:18 <+bridge> strcpy(Message, "File too large"); 03:18 <+bridge> break; 03:18 <+bridge> case IMassFileLoader::LOAD_ERROR_INVALID_REGEX: 03:18 <+bridge> strcpy(Message, "Invalid regex"); 03:18 <+bridge> break; 03:18 <+bridge> case IMassFileLoader::LOAD_ERROR_UNKNOWN: 03:18 <+bridge> [[fallthrough]]; 03:18 <+bridge> default: 03:18 <+bridge> strcpy(Message, "Unknown error"); 03:18 <+bridge> this is the threaded implementation, i finish this and replace the existing mechanisms 03:18 <+bridge> then i make the async and replace that 03:19 <+bridge> this is the synchronous implementation, i finish this and replace the existing mechanisms 03:19 <+bridge> ```cpp 03:19 <+bridge> CMassFileLoader FileLoader(client->m_pStorage, IMassFileLoader::LOAD_FLAGS_ABSOLUTE_PATH); 03:19 <+bridge> FileLoader.SetOperationFailedCallback([](IMassFileLoader::LOAD_ERROR Error, const void *pUser) -> bool { 03:19 <+bridge> char Message[64]; 03:19 <+bridge> switch(Error) 03:19 <+bridge> { 03:20 <+bridge> case IMassFileLoader::LOAD_ERROR_NOT_INIT: 03:20 <+bridge> strcpy(Message, "Not init"); 03:20 <+bridge> break; 03:20 <+bridge> case IMassFileLoader::LOAD_ERROR_INVALID_PATH: 03:20 <+bridge> strcpy(Message, "Invalid path"); 03:20 <+bridge> break; 03:20 <+bridge> case IMassFileLoader::LOAD_ERROR_DIRECTORY_UNREADABLE: 03:20 <+bridge> strcpy(Message, "Directory unreadable"); 03:20 <+bridge> break; 03:20 <+bridge> case IMassFileLoader::LOAD_ERROR_UNWANTED_SYMLINK: 03:20 <+bridge> strcpy(Message, "Unwanted symlink"); 03:20 <+bridge> break; 03:20 <+bridge> case IMassFileLoader::LOAD_ERROR_FILE_UNREADABLE: 03:20 <+bridge> strcpy(Message, "File unreadable"); 03:20 <+bridge> break; 03:20 <+bridge> case IMassFileLoader::LOAD_ERROR_FILE_TOO_LARGE: 03:20 <+bridge> strcpy(Message, "File too large"); 03:20 <+bridge> break; 03:20 <+bridge> case IMassFileLoader::LOAD_ERROR_INVALID_REGEX: 03:20 <+bridge> strcpy(Message, "Invalid regex"); 03:20 <+bridge> break; 03:20 <+bridge> case IMassFileLoader::LOAD_ERROR_UNKNOWN: 03:20 <+bridge> [[fallthrough]]; 03:20 <+bridge> default: 03:20 <+bridge> strcpy(Message, "Unknown error"); 03:20 <+bridge> ``` 03:20 <+bridge> 2023-06-04 19:12:36 I test: text file found, 1517 bytes; 'license.txt' 03:20 <+bridge> 2023-06-04 19:12:36 I test: text file found, 2 bytes; 'test.txt' 03:20 <+bridge> ``` 03:26 <+bridge> ```cpp 03:26 <+bridge> CMassFileLoader FileLoader(client->m_pStorage, IMassFileLoader::LOAD_FLAGS_ABSOLUTE_PATH); 03:26 <+bridge> FileLoader.SetOperationFailedCallback([](IMassFileLoader::LOAD_ERROR Error, const void *pUser) -> bool { 03:26 <+bridge> char Message[64]; 03:26 <+bridge> switch(Error) 03:26 <+bridge> { 03:26 <+bridge> case IMassFileLoader::LOAD_ERROR_NOT_INIT: 03:26 <+bridge> strcpy(Message, "Not init"); 03:26 <+bridge> break; 03:26 <+bridge> case IMassFileLoader::LOAD_ERROR_INVALID_PATH: 03:26 <+bridge> strcpy(Message, "Invalid path"); 03:26 <+bridge> break; 03:26 <+bridge> case IMassFileLoader::LOAD_ERROR_DIRECTORY_UNREADABLE: 03:26 <+bridge> strcpy(Message, "Directory unreadable"); 03:26 <+bridge> break; 03:26 <+bridge> case IMassFileLoader::LOAD_ERROR_UNWANTED_SYMLINK: 03:26 <+bridge> strcpy(Message, "Unwanted symlink"); 03:26 <+bridge> break; 03:26 <+bridge> case IMassFileLoader::LOAD_ERROR_FILE_UNREADABLE: 03:26 <+bridge> strcpy(Message, "File unreadable"); 03:26 <+bridge> break; 03:26 <+bridge> case IMassFileLoader::LOAD_ERROR_FILE_TOO_LARGE: 03:26 <+bridge> strcpy(Message, "File too large"); 03:27 <+bridge> break; 03:27 <+bridge> case IMassFileLoader::LOAD_ERROR_INVALID_REGEX: 03:27 <+bridge> strcpy(Message, "Invalid regex"); 03:27 <+bridge> break; 03:27 <+bridge> case IMassFileLoader::LOAD_ERROR_UNKNOWN: 03:27 <+bridge> [[fallthrough]]; 03:27 <+bridge> default: 03:27 <+bridge> strcpy(Message, "Unknown error"); 03:27 <+bridge> ```cpp 03:27 <+bridge> CMassFileLoader FileLoader(client->m_pStorage, IMassFileLoader::LOAD_FLAGS_ABSOLUTE_PATH); 03:27 <+bridge> FileLoader.SetOperationFailedCallback([](IMassFileLoader::LOAD_ERROR Error, const void *pUser) -> bool { 03:27 <+bridge> char Message[64]; 03:27 <+bridge> switch(Error) 03:27 <+bridge> { 03:27 <+bridge> case IMassFileLoader::LOAD_ERROR_NOT_INIT: 03:27 <+bridge> ```cpp 03:27 <+bridge> CMassFileLoader FileLoader(client->m_pStorage, IMassFileLoader::LOAD_FLAGS_ABSOLUTE_PATH); 03:27 <+bridge> FileLoader.SetOperationFailedCallback([](IMassFileLoader::LOAD_ERROR Error, const void *pUser) -> bool { 03:27 <+bridge> char Message[64]; 03:27 <+bridge> switch(Error) 03:27 <+bridge> { 03:27 <+bridge> case IMassFileLoader::LOAD_ERROR_NOT_INIT: 03:27 <+bridge> strcpy(Message, "Not init"); 03:27 <+bridge> break; 03:27 <+bridge> case IMassFileLoader::LOAD_ERROR_INVALID_PATH: 03:27 <+bridge> strcpy(Message, "Invalid path"); 03:27 <+bridge> break; 03:27 <+bridge> case IMassFileLoader::LOAD_ERROR_DIRECTORY_UNREADABLE: 03:27 <+bridge> strcpy(Message, "Directory unreadable"); 03:28 <+bridge> break; 03:28 <+bridge> case IMassFileLoader::LOAD_ERROR_UNWANTED_SYMLINK: 03:28 <+bridge> strcpy(Message, "Unwanted symlink"); 03:28 <+bridge> break; 03:28 <+bridge> case IMassFileLoader::LOAD_ERROR_FILE_UNREADABLE: 03:28 <+bridge> strcpy(Message, "File unreadable"); 03:28 <+bridge> break; 03:28 <+bridge> case IMassFileLoader::LOAD_ERROR_FILE_TOO_LARGE: 03:28 <+bridge> strcpy(Message, "File too large"); 03:28 <+bridge> break; 03:28 <+bridge> case IMassFileLoader::LOAD_ERROR_INVALID_REGEX: 03:28 <+bridge> strcpy(Message, "Invalid regex"); 03:28 <+bridge> break; 03:28 <+bridge> case IMassFileLoader::LOAD_ERROR_UNKNOWN: 03:28 <+bridge> [[fallthrough]]; 03:28 <+bridge> default: 03:28 <+bridge> strcpy(Message, "Unknown error"); 04:02 <+bridge> i can't find a way to intelligently figure out which storage type a path is without manually specifying, and that's kind of cheeks to do for every path 04:02 <+bridge> so i think i will ask that `STORAGETYPE_BASIC` paths are prepended with `:` and `STORAGETYPE_CLIENT` paths aren't 04:02 <+bridge> or some other special character. not too important 04:03 <+bridge> this is how it's done in Qt anyway more or less 06:46 <+bridge> F 06:46 <+bridge> (@Jupeyy_Keks) 14:25 <+bridge> what's `STORAGETYPE_BASIC` vs `STORAGETYPE_CLIENT`? 14:25 <+bridge> can’t figure out the purpose 14:26 <+bridge> but when i use any of the normal values (TYPE_ALL, etc) ListDirectory from storage fails 14:26 <+bridge> ah 14:26 <+bridge> basic seems to do paths in the data dirs, client does absolute paths 14:26 <+bridge> I think it's the opposite(?) 14:26 <+bridge> could be, don’t remember 14:26 <+bridge> not at pc 14:26 <+bridge> `BASIC` is used for tools, it seems 14:26 <+bridge> and `CLIENT` for the client 14:27 <+bridge> interesting 14:27 <+bridge> im hoping to make this thing pretty versatile so breaking a boundary like that doesn’t bother me 14:28 <+bridge> the idea is that tools take absolute paths 14:28 <+bridge> because you call them from the command line 14:28 <+bridge> and the client takes relative paths because it wants to load its data 14:28 <+bridge> yea 14:29 <+bridge> i could also just make you specify the storage type at the time you add the paths to search through 14:29 <+bridge> though that’s a bit sloppier syntactically 14:30 <+bridge> “:skins”, “/some/absolute/path” turns into {“skins”, STORAGETYPE_CLIENT}, {“/some/absolute/path, STORAGETYPE_BASIC} 14:30 <+bridge> “:skins”, “/some/absolute/path” turns into {“skins”, STORAGETYPE_CLIENT}, {“/some/absolute/path”, STORAGETYPE_BASIC} 14:31 <+bridge> it was slow cause I loaded the map every time the preview render was called and not if the selected map filename was changed :kek: 14:32 <+bridge> Jesus 16:44 <+bridge> https://ddnet.org/ -> one of three outcomes: 16:44 <+bridge> 1. SSL handshake failed 16:44 <+bridge> 2. Cloudflare banner 16:44 <+bridge> > This website ddnet.org/ is currently offline. Cloudflare's Always Online™ shows a snapshot of this web page from the Internet Archive's Wayback Machine. To check for the live version, click Refresh. 16:44 <+bridge> 3. Site loads normally 16:46 <+bridge> for me it switches between the 3 outcomes when I do cache override reload (ctrl + shift + r in firefox) 17:14 <+bridge> works for me™ 17:14 <+bridge> still broken for you? 17:16 <+bridge> beans with jam 17:20 <+bridge> now it also works for me consistently. I had that issue yesterday in the afternoon already 17:23 <+bridge> huh my message in your reply has the enumeration switched out with normal bullet points 17:23 <+bridge> i had ddnet org issue too when u wrote it 17:24 <+bridge> nice at least I'm not crazy :brownbear: 17:25 <+bridge> do you use dns over https? 17:25 <+bridge> i use cloudflares dns over https on the browser it tested with 😄 17:25 <+bridge> ow how do I know? 17:25 <+bridge> its a firefox setting 17:26 <+bridge> I got it on `Use system proxy settings` 17:26 <+bridge> https://cdn.discordapp.com/attachments/293493549758939136/1115300730828496996/image.png 17:27 <+bridge> ah no I don't have that checkmark ticked 17:27 <+bridge> ah I thought I was crazy that I couldnt close the menu sometimes 17:28 <+bridge> 😬 17:28 <+bridge> quick merge 17:29 <+bridge> @Jupeyy_Keks hook rendering has so many quirks that I'm considering writing a small block post about it 17:30 <+bridge> bcs of the hook (physics) itself? or the rendering itself? 17:30 <+bridge> maybe I can also find some nice topic to write about twmap some day 17:30 <+bridge> the rendering 17:30 <+bridge> what's so quirky about it 😂 17:30 <+bridge> doesnt it simply render the head and then the chains 17:31 <+bridge> i find weapons quirky xD 17:31 <+bridge> they have so many weird extra cases 17:31 <+bridge> players.cpp is a fat whole mess 17:31 <+bridge> everything in one function xD 17:32 <+bridge> the animations, the rendering, the calculatiosn 17:32 <+bridge> I tried to add weapons to the ghost tee and realized this. not worth it xd 17:33 <+bridge> I wanna have a blog post @Patiga 17:35 <+bridge> how in game.png it doesn't fit into the atlas segment, how the chain and hook tip are ingame the same length but in game.png the tip is 2x longer, how the chain isn't actually centered (minor) how there is a limit on how many segments are rendered, how hook_x and hook_y in the snapshot are not as useful as they sound and I think I forgot one or two things 17:35 <+bridge> ah xd 17:35 <+bridge> 0.7 fixed the length thing 17:36 <+bridge> thats why hooks look different there 17:36 <+bridge> oh interesting 17:36 <+bridge> I haven't really looked at 0.7 rendering yet, I knew the tees look different but didn't know about the hook 17:40 <+bridge> Anyone here from Switzerland? 17:42 <+bridge> context: you might remember that I tried to offload a lot of tee rendering into the shader, as an experiment 17:42 <+bridge> weapons are definitely also the most complex part there, I actually index into an weapon-information array to get offsets and sizes, also for the hand, and next I still need to do the muzzle flash and HADOKEN (ninja dash) 17:43 <+bridge> is your rendering finished? 17:43 <+bridge> does it perform well? 17:43 <+bridge> https://gitlab.com/Patiga/twgpu/-/blob/01b5736e5045fd30a4355bbf6c0f8c9e0a077c2d/twgpu/src/tee/tee_shader.wgsl 17:45 <+bridge> I only worked little on twgpu the last month, apart from HADOKEN and muzzle flashes I have the tee rendering finished, after that it should only require atlas rendering of other stuff (ik you don't like atlasses ^^) 17:45 <+bridge> ah right emotes are also missing I guess 17:46 <+bridge> but I enjoy working on it, even if don't spend that much time on it rn 17:46 <+bridge> mh u got quite some branches there, i am actually mostly interested in the performance xd 17:46 <+bridge> have u thought about opaque optimizations? rendering from front to back 17:47 <+bridge> yea me too, although optimization isn't an actual concern until I feel that I can render 'everything' ^^ 17:48 <+bridge> I did think about that a bit, but for me it didn't sound exciting enough to try it out 17:49 <+bridge> i thought about it quite often already for tile rendering. on the other hand it will 100% generate more draw calls 17:49 <+bridge> This looks insane, right? 17:49 <+bridge> https://cdn.discordapp.com/attachments/293493549758939136/1115306367566237836/shannon-limit.png 17:49 <+bridge> so only the GPU profits from this 17:49 <+bridge> and ddnet really isnt very GPU heavy 😄 17:49 <+bridge> The pink line is about 400gbps, there is no way the theoretical maximum of a fiber is 10^11 gbps, right? 😄 17:50 <+bridge> hm twgpu offloads more work to the gpu 17:51 <+bridge> i mean, doesn't it depend on the cable 17:51 <+bridge> not only tilemap and tees, I also plan to do instance-based rendering for everything else which is rendered as an atlas 17:51 <+bridge> Optical fiber 17:51 <+bridge> or is this of a single fiber 17:51 <+bridge> Single optical fiber 17:51 <+bridge> as in a single light beam 17:51 <+bridge> ah ok 17:52 <+bridge> Noisy channel, max theoretical bitrate is what I was trying to calculate 17:52 <+bridge> well i dunno the data, but plank length * 2 is probably the smallest possible distinguishable signal? 😂 17:53 <+bridge> q: if nearly nothing in the ddnet texture atlasses (yea ik there are a few exceptions) touch the borders of the segments, wouldn't it be a okay general fix to just make the borders of each segment transparent manually? most textures should not be affected and a warning could be thrown if the texture was modified. but it would fix the sampling problem of the texture atlas 17:54 <+bridge> i guess you know my opinion on that 17:54 <+bridge> xd 17:54 <+bridge> i really dislike "random" solutions 17:54 <+bridge> or unintuitive 17:55 <+bridge> the funny thing is that there is no GLSL function for this 17:55 <+bridge> directly at least 17:55 <+bridge> just why xD 17:55 <+bridge> it should be so ez to implement 17:56 <+bridge> oh yeah the limit is weird 17:56 <+bridge> I agree that it wouldn't be as clean as possible, but I'd currently argue it should be quite subtle, even in cases where something gets modified 17:56 <+bridge> https://registry.khronos.org/OpenGL-Refpages/gl4/html/textureOffset.xhtml 17:56 <+bridge> 17:56 <+bridge> this is the biggest troll 17:56 <+bridge> why does this exists, but not a "max" offset 17:56 <+bridge> hm I don't see how a glsl function has something to do with this, I'm talking about modifying the texture on the cpu 17:57 <+bridge> see, if u could do 17:57 <+bridge> texture(sampler, rect_to_sample_in_texels) 17:57 <+bridge> it would solve all your problems 17:57 <+bridge> u say sample over this rect 17:57 <+bridge> and nothing else 17:57 <+bridge> act as if this rect is a new texture 17:58 <+bridge> true 17:58 <+bridge> and the offset function is that 17:58 <+bridge> but only with an offset 17:58 <+bridge> not an entire rect 17:58 <+bridge> xD 17:58 <+bridge> oh interesting 17:58 <+bridge> ok i dunno how the edge clamping is used here 17:58 <+bridge> but its not that exactly right 17:58 <+bridge> it only 'moves' the origin 17:59 <+bridge> yes but that sounds like it would edge clamp 0, 0 17:59 <+bridge> and if it can do that, it could also do that for max, max 17:59 <+bridge> but i'll look into the spec 18:00 <+bridge> > The offset value must be a constant expression 18:00 <+bridge> hm 18:00 <+bridge> "A limited range of offset values are supported" 18:00 <+bridge> still, i don't see why GLSL doesn't implement a function like the rect one 18:01 <+bridge> yea that function would be amazing 18:01 <+bridge> does spirv have such a function? 18:01 <+bridge> i also couldnt really imagine a performance problem with it 18:01 <+bridge> i dunno 18:01 <+bridge> i dont know a lot about it 18:02 <+bridge> same, only used it once for that vulkano project ^^ 18:02 <+bridge> we found out too late that there is a 'reflect' function xd 18:03 <+bridge> i could imagine they dont want it bcs of mipmaps 18:03 <+bridge> for example there is a rectangle texture, which supports smth similar, but doesn't support mipmaps 18:04 <+bridge> eh, for *most* of the mipmaps the uv coordinates could still be used 18:04 <+bridge> in a "smaller"/higher mipmap the texel would ofc require less coordinates in total 18:04 <+bridge> but the GPU could not directly access the points 18:04 <+bridge> as texels 18:04 <+bridge> yea fair 18:05 <+bridge> yeah tbh, thats the reason 18:05 <+bridge> simple as that 18:05 <+bridge> and makes sense too 18:06 <+bridge> would that be reason enough? it could still be used for textures without mip-maps and I would imagine there are many valid use-cases 18:06 <+bridge> btw ddnet doesn't do mipmaps for anything but quads/tilemaps, right? 18:09 <+bridge> Yes because u could still implement it your own. And it would have a hidden performance cost 18:09 <+bridge> It uses high quality mipmaps everywhere 18:10 <+bridge> With high quality i mean biased 18:10 <+bridge> Towards quality 18:10 <+bridge> I don't think you can implement such a function in a shader 18:10 <+bridge> You can 18:11 <+bridge> U can sample neighbour samples using texelfetch 18:11 <+bridge> And sample your own 18:12 <+bridge> But it's a bit of work. But u could probs find shaders online that implement linear sampling 18:12 <+bridge> ouch 18:13 <+bridge> It's struggle anyway 18:14 <+bridge> Bcs u also need to have cobtrol about the lod 18:14 <+bridge> For mipmap linear sampling 18:15 <+bridge> oop I'm not super familiar with the rendering code yet so I tried to figure it out ingame and managed to get minor flickering so I assumed there are no mipmaps. darn then I'll really need to rethink using atlasses. maybe I'll still go with them to get the first 'working' version out there 18:17 <+bridge> `gfx_gl_texture_lod_bias` 18:17 <+bridge> set this to 0 and u should™️ have "normal" mipmapping calculations 18:18 <+bridge> u can even set this to 5000 18:18 <+bridge> to have the ugliest game ever 18:18 <+bridge> always restart the game 18:19 <+bridge> does it require restarting the game? 18:19 <+bridge> because I just convinced myself setting it to 0 changed stuff without restarting 18:19 <+bridge> but it might've just been my personal `lod_bias` 18:20 <+bridge> yep ^^ 18:21 <+bridge> lmao 18:21 <+bridge> brains are stoopid 18:23 <+bridge> heh, setting it high is hilarious 18:24 <+bridge> https://cdn.discordapp.com/attachments/293493549758939136/1115315292273393786/2023-06-05-182426_1920x1080_scrot.png 18:25 <+bridge> I mean u could easily do it without restarting in Vulkan and gl3.3 but it we also have a tiny shader compiler in ddnet 18:25 <+bridge> And the shader compiler wouldn't recompile it 18:26 <+bridge> what do you need the shader compiler for? 18:26 <+bridge> feature detection? 18:27 <+bridge> To share some code with old gl versions 18:27 <+bridge> And to add defines 18:27 <+bridge> It's not really a compiler 18:27 <+bridge> More a rewrite xd 18:27 <+bridge> ah ^^ 18:28 <+bridge> https://cdn.discordapp.com/attachments/293493549758939136/1115316340899708999/2023-06-05-182840_1920x1080_scrot.png 18:29 <+bridge> But i called it compiler for flex 😂 18:29 <+bridge> Hot 18:29 <+bridge> nice :p 18:30 <+bridge> do you generate the mipmaps on the gpu or cpu? 18:31 <+bridge> For OpenGL i can't tell 18:31 <+bridge> It's a ogl function 18:31 <+bridge> VK should be gpu 18:31 <+bridge> how much of a size decrease would it be if we removed all backwards compat 18:31 <+bridge> In what? 18:31 <+bridge> Code, data files? 18:31 <+bridge> Code 18:32 <+bridge> when remove support for outdated 0.6 18:33 <+bridge> Half of rendering code, Network code would be much smaller BCS we could rely on external packing . 18:33 <+bridge> I'd blindly guess 25% of all code minimum 18:34 <+bridge> gtg in a min, thanks for the talk @Jupeyy_Keks :) 18:38 <+bridge> one last cheeky question (oh god it got longer): what about array textures instead of atlasses, but with width and height of the maximum segment size. then the textures 1. arent streched, 2. can be easily mipmapped. Had to look it up and I'd estimate > 75% wasted gpu memory space on game.png so no I guess xd 18:39 <+bridge> nice monologue, Patiga 👍 18:39 <+bridge> I'd probably prefer that over wrong rendering;) 18:40 <+bridge> It works nicely exept for the end of the video where it doesn't clip the contents 18:40 <+bridge> https://cdn.discordapp.com/attachments/293493549758939136/1115319172461772860/live_map_preview_in_editor2.mp4 18:40 <+bridge> Well they wouldn't fix it without stretching tho 18:40 <+bridge> I'm probably trying too hard to use instancing and grouping stuff together, but its also fun for me 18:41 <+bridge> oh right, welp 18:41 <+bridge> it was a fine idea until confronted with reality 18:41 <+bridge> it is a cool idea 18:42 <+bridge> you just fear multi texturing too much 😄 18:42 <+bridge> except u need this one extension anyway 😂 18:43 <+bridge> nice 18:43 <+bridge> u should look into maplayers to see how clipping works 18:44 <+bridge> ok editor probs also clips 18:44 <+bridge> u could generally implement this using maplayers 18:44 <+bridge> would save lot of code dublication 18:44 <+bridge> background map also uses it 18:45 <+bridge> u could look how menu_background does it 18:45 <+bridge> it's very ez 18:45 <+bridge> k ;) 18:45 <+bridge> for clipping u can also change the viewport itself 18:46 <+bridge> we should have support for this 18:46 <+bridge> (i mean clip the whole scene) 18:46 <+bridge> instead of using Clip functions 18:47 <+bridge> oh but maplayers implement a menu rendering code, that could suck 😂 18:47 <+bridge> but can be disabled ofc 18:48 <+bridge> to improve the usability once you solve the hard issues: add some kind of arrow button on the right side to expand/collapse the preview instead of using a button at the bottom. you could also add a divider in the middle that can be dragged left and right, same how the envelope editor can be dragged up and down 18:49 <+bridge> btw have u ever loaded a huge map like arctic festival 18:49 <+bridge> 32bit users rip for sure xD 18:49 <+bridge> I don't think so 18:49 <+bridge> and you should disable the editor hotkeys while the file popup is open, it looks like you are scrolling in the editor and preview at the same time 19:04 <+bridge> here's the current code https://github.com/Inateblig/ddnet/commit/7a3980ed36876e09d27def4e62b9ce745e217905 19:06 <+bridge> ah, so it's behaving so weirdly because it hooks directly into the editor code... 19:06 <+bridge> yeah :/ 19:07 <+bridge> now I'm trying to implement it with Jyp's suggestion ;) 19:23 <+bridge> how is shannon rate computed here? 19:39 <+bridge> `R_b = 2 * R_s * log_2(1 + GSNR * R_s/B_n)` this formula really baffles me but it's what's given in the docs for this exercise. `R_s` is the "symbol-rate of the light-path" and `B_n` is the noise bandwidth 19:40 <+bridge> wtf is `symbol-rate of the light-path` ? 19:40 <+bridge> B_n is probably more like signal bandwidth 19:40 <+bridge> I have no idea, this teacher has awful lectures and his work contains all kinds of weird terminology like that 19:40 <+bridge> i guess they used the 500THz of light frequency, but it's an error 19:41 <+bridge> R_s is 32 GHz, B_n is 12.5GHz 19:41 <+bridge> I'm fairly sure 12.5GHz is the bandwidth of the noise 19:41 <+bridge> they should use the bandwidth that they actually use, i.e. something like 499-501 THz, so 2 Thz only 19:42 <+bridge> my formula is B*log2(1+S/N) 19:42 <+bridge> The capacity limit I know is `R_b = B log_2(1 + gsnr)` but I could not figure out what they are doing here and how it relates for the life of me 19:42 <+bridge> good, physics laws are still the same over the Alps 19:42 <+bridge> Maybe I should just mail the dude 19:43 <+bridge> wtf is shannon 19:43 <+bridge> very important compsci guy 19:43 <+bridge> https://en.wikipedia.org/wiki/Claude_Shannon 19:43 <+bridge> 19:44 <+bridge> noise bandwidth is already a weird term imo 19:44 <+bridge> noise has infinite bandwidth 19:46 <+bridge> Every single damn course I took in this uni barring the signals one who was courteous enough to upgrade his entire course to more globally used terminology, has used bizarre terminology and weird mistranslated messy material 19:46 <+bridge> why are you there btw? 19:47 <+bridge> cheapest uni with a degree worth something I could go to 19:47 <+bridge> @Learath2 are you happy that you will have forgotten about this course in around 2 years and never need anything of what you learned ever again 19:48 <+bridge> gets me outside of turkey aswell so that's a bonus 19:48 <+bridge> I am so angry that you couldn't begin to understand, but I'm just biting my tongue and just finishing this experience from hell 19:50 <+bridge> True, what the hell is a noise bandwidth. The fourier transform of WGN is just flat... 19:51 <+bridge> are you at M1 level? 19:51 <+bridge> I'm guessing M1 is masters, no, I'm a lowly bachelor 19:53 <+bridge> you can try to apply to international masters in France 19:53 <+bridge> they'll ask for money, but you can ask for a scholarship 19:54 <+bridge> meanwhile, in France, using Signal can leads you to being trialed as a terrorrist 20:01 <+bridge> I wonder if B_n refers to the equivalent noise bandwidth 20:29 <+bridge> hmm seems hard xD 20:31 <+bridge> mh? 20:31 <+bridge> it's ez af 😂 20:31 <+bridge> not the code duplication the implemention of the preview which will use the CMapLayers 20:31 <+bridge> yeah i also mean that 20:32 <+bridge> menu_background does that already 20:32 <+bridge> it should be <100 lines of code 20:35 <+bridge> i dunno if editor can access client code tho 20:35 <+bridge> yeah that was mainly my problem 20:35 <+bridge> but its part of the client, so why not 20:35 <+bridge> although I could be doing something wrong 20:35 <+bridge> The slides have the units wrong...... everything is in gbps so this dude copied gbps to the shannon limit too, it's in bits per second :pepeW: 20:36 <+bridge> bit sliding :Chill: 20:51 <+bridge> Firefox somehow "broke" after updating, the gentoo life 20:56 <+bridge> alpha tester 20:56 <+bridge> 😬 20:59 <+bridge> https://jisho.org/search/hadouken 20:59 <+bridge> hmmm 21:03 <+bridge> i think hadoken is in ddnet code somewhere 21:03 <+bridge> its the ninja effect 21:03 <+bridge> the dash 21:04 <+bridge> https://streetfighter.fandom.com/wiki/Hadoken 21:04 <+bridge> i guess matricks is streetfighter fan 21:04 <+bridge> 😂 21:04 <+bridge> https://static.wikia.nocookie.net/streetfighter/images/1/1e/Ryu-hadoken-artwork.png/revision/latest?cb=20100709171559 21:06 <+bridge> https://cdn.discordapp.com/attachments/293493549758939136/1115355974048415805/image.png 21:07 <+bridge> Apple just announced Apple Vision Pro 21:07 <+bridge> Teeworlds on a new level 😮 21:08 <+bridge> nice, they invented VR 21:09 <+bridge> sometimes with chat open this happens 21:09 <+bridge> https://cdn.discordapp.com/attachments/293493549758939136/1115356624547225701/image.png 21:09 <+bridge> nobody has ever done this before 21:09 <+bridge> 😬 21:09 <+bridge> at least on this one server (some private server by @cyberfighter 21:09 <+bridge> yeah its some weird glitch with the new SDL/IME stuff 21:09 <+bridge> known already? 21:09 <+bridge> yes, but i dunno any workaround 21:10 <+bridge> toke 21:10 <+bridge> oke 21:10 <+bridge> Are you talking about the microsoft hololens? xDDDD 21:10 <+bridge> that was cool, bcs it was minecraft 😂 21:11 <+bridge> Lol 21:12 <+bridge> But tbh, Apple did a great job with Apple Silicon 21:13 <+bridge> yep 21:13 <+bridge> but useless without good software 21:13 <+bridge> True, but every architecture is useless without good software 21:14 <+bridge> they could stop their ego trip and open up their hardware 21:15 <+bridge> But this is how they pay their engineers to be that creative and research this 21:15 <+bridge> i'd also love to pay their engineers 😉 21:16 <+bridge> then go and buy an apple 🙂 21:16 <+bridge> sadly they have bad software, else i'd do that 21:16 <+bridge> Mhmmm which one? The OS itself or just pieces? 21:17 <+bridge> i am not a musician, so there is nothing interesting from apple 21:18 <+bridge> 21:18 <+bridge> their OS and drivers are buggy, have bad performance in games 21:18 <+bridge> 21:18 <+bridge> so nothing interesting for me 21:18 <+bridge> for a desktop class CPU 21:18 <+bridge> for that money i could buy a 4090 and destroy my electricity bill 😂 21:19 <+bridge> Ah I see, true... gaming is not that great, fair enough 21:19 <+bridge> @keb help i noclipped out of a source map 21:19 <+bridge> But I guess thats not their main market 21:19 <+bridge> tbh i dont even know what their main market is 21:19 <+bridge> probably fanboys with too much money 21:19 <+bridge> 👀 21:20 <+bridge> Wouldnt say that, but their products work seamlessly mostly 21:20 <+bridge> Never had problems 21:20 <+bridge> i mean paying so muhc for video eiditing is probably nothing for everyone 😄 21:20 <+bridge> I had a lot of androids before, it was a mess to pair bluetooth 21:20 <+bridge> and the "real" rendering happens on cloud servers anyway 21:20 <+bridge> interesting, never had problems with that 21:20 <+bridge> ah well phones are not interesting to me tbh 😄 21:20 <+bridge> I had a lot of problems with Bose and OnePlus 21:21 <+bridge> Had problems with Google Pay 21:21 <+bridge> Switched to an iPhone some time ago and never had problems at all 21:21 <+bridge> besides connecting 21:21 <+bridge> bluetooth in linux and android is indeed the best for me. on windows i get weird crackeling with my bt headphones. But didnt test on ios tbf 21:22 <+bridge> my headphones are also bose 😄 21:22 <+bridge> well what do you use your phone for? 21:22 <+bridge> It was such a mess, always had async audio 21:22 <+bridge> music and browsing? 21:22 <+bridge> Mostly planning my day, business, talking, music 😄 21:22 <+bridge> true 21:22 <+bridge> jup when i make my super bloated graphical client update im going to you for shader advice LOL 21:23 <+bridge> jup when i make my super bloated graphical client im going to you for shader advice LOL 21:23 <+bridge> And quickly share my notes from iPhone to Mac 😄 21:23 <+bridge> yeah, sadly for these tasks 1000€+ is quite a banger xD 21:23 <+bridge> 21:23 <+bridge> i could spent that for desktop hardware 21:23 <+bridge> 21:23 <+bridge> But if u have the money, it probably the fastest CPU wise 21:24 <+bridge> i'd prefer high refresh and polling rate displays 21:24 <+bridge> so i assume i have to buy samsung :/ 21:24 <+bridge> Its expensive for sure, so think twice before buying. But Samsung isnt better 21:24 <+bridge> paying 1000€ for a Samsung 21:24 <+bridge> i might make mockups in an art program if i remember 21:24 <+bridge> not my first choice, bcs all my samsung monitors died exactly after warranty died 😄 21:25 <+bridge> But its the same with headphones... I only buy BeyerDynamics ( a german company ), but their audio is stunning 21:25 <+bridge> But they also expensive like Apple 21:32 <+bridge> Are they? I live half an hour from their headquarter and have always loved the fake 15 € BeyerDynamic (superlux hd330) I have had for > 15 years, and keep buying new (original BeyerDynamic) earpads, which are more expensive than the entire headphones. So I thought I should try the originals, I ordered 3 different ones, from 100 to 500 €. And while they were better, it didn't seem worth the money. I noticed that at the low volumes I use for headpho 21:33 <+bridge> I had a few others already and have to say, durability, sound and comfort fits best for me 21:33 <+bridge> my <50€ bluetooth headphones worked fine for me 21:34 <+bridge> Its heavily opinionated, everyone has other preferences 21:35 <+bridge> well there defs is a difference in working fine and having the best audio 21:35 <+bridge> I had bad experiences with Logitech for example, their headsets broke after 2.5 months each, had to send them in 3 times in a row 21:36 <+bridge> logitech is always cheap af from materials 21:36 <+bridge> but they are still well designed 21:36 <+bridge> 21:36 <+bridge> my first logitech headphones were actually coolest for PC headphones, but the collapsable microphone broke after using it too many times xD 21:36 <+bridge> the mices are great too, but 100% broken after 1 year of teeworlds 😂 21:37 <+bridge> After Logitech I switched over to SteelSeries, worked better but still problems at some point. Afterwards switched over to Sennheiser and now stuck with Beyerdynamics 21:38 <+bridge> Yeah, had the Logitech Performance and Mad Catz 😄 21:38 <+bridge> Mad Catz was fun not gonna lie 21:39 <+bridge> https://scale.coolshop-cdn.com/product-media.coolshop-cdn.com/AH87VU/9dc3393d72af41ccbd9cb8829c868dd6.jpeg/f/mad-catz-s-t-r-i-k-e-7-gaming-keyboard.jpeg 21:39 <+bridge> wtf 21:39 <+bridge> Hahahahahahaa, it was fun to flash the display and deploy your own custom kernel on it 21:39 <+bridge> I still have it somewhere around 21:39 <+bridge> looks a bit unhandy for anything else than gaming xD 21:39 <+bridge> Indeed, it was useless because its not mechanic 21:40 <+bridge> Ghosting was like every 2nd keypress 21:40 <+bridge> lmao, but then sell it as gaming keyboard 😄 21:40 <+bridge> At this time I dont care about, I wanted the small screen 21:40 <+bridge> It was a bummer, but atleast I had it 22:10 <+bridge> r/programmerhumor on a killing spree 22:10 <+bridge> 22:10 <+bridge> @Ryozuki 22:10 <+bridge>