Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- DEVELOPMENT FORUMS
- Revisiting engulfment mechanics
- posted by @Kasterisk день назад, четверг 19-го мая 2022 13:19:58 +03:00
- Few months have passed and the new engulfment mechanic is shaping up nicely. Here’s a summary of the overall progress and what ended up being implemented for future reference as of the current state of this revamp’s pull request at the time of writing.
- The engulfment process for any valid engulfable objects starts upon immediate contact with the engulfer’s membrane, this completely removes the ability for preys to escape engulfment so they have t…
- This post was truncated! click here to read the full post.
- Gameplay Discussion: Benefits of Being a Larger Cell
- posted by @hhyyrylainen henri_hyyrylainen 4 дня назад, понедельник 16-го мая 2022 20:00:08 +03:00
- github.com/Revolutionary-Games/Thrive
- Made nucleus give a 50% damage reduction Revolutionary-Games:master ← Revolutionary-Games:nucleus_damage_reduction_v2 opened 04:59PM - 16 May 22 UTC hhyyrylainen +9 -0 except to ATP d…
- This post was truncated! click here to read the full post.
- Implementing New Game Settings
- posted by @Oliveriver 7 дней назад, пятница 13-го мая 2022 22:15:25 +03:00
- I think I agree about cannibalism. My reason for including it here was a reaction to complaints from players in the current version (see here) but it’s probably not much more work to have it as a per-species mutation, which offers much more dynamic gameplay options.
- Implementing New Game Settings
- posted by @Buckly 7 дней назад, пятница 13-го мая 2022 22:04:32 +03:00
- This is good, I support this overall layout for the most part.
- The proposed difficulty settings are a great start, while some feel like they might take some additional effort to implement, others are pretty much already a thing since they are just constants in constant.cs, they’re just not customizable variables right now. It also doesn’t seem like it will take toomuch effort to balance since we’ll just need to focus primarily on the “normal” set…
- This post was truncated! click here to read the full post.
- Implementing New Game Settings
- posted by @Deus 7 дней назад, пятница 13-го мая 2022 21:47:32 +03:00
- This all looks good, and good idea to centralize this discussion into a post.
- One small comment though is that I feel since cannibalism should more be an adaptation rather than a setting per se, as it’s a unique behavior with evolutionary benefits and detriments. Although it can definitely a permanent mode/setting as well; perhaps the community would find it interesting.
- Implementing New Game Settings
- posted by @hhyyrylainen henri_hyyrylainen 7 дней назад, пятница 13-го мая 2022 21:42:56 +03:00
- Yeah, I think the advanced view would be fine to split things into tabs to fit even more options in there.
- Implementing New Game Settings
- posted by @Oliveriver 7 дней назад, пятница 13-го мая 2022 21:23:19 +03:00
- Hmm, good point. I still like the three tabs idea as it nicely separates the major variables, so maybe that could be the advanced view as you say.
- Implementing New Game Settings
- posted by @hhyyrylainen henri_hyyrylainen 7 дней назад, пятница 13-го мая 2022 21:08:40 +03:00
- I think the potential options are fine, but I think the representation needs to be considered.
- My idea is that basically there’s just a scrollable view with the most important settings like difficulty, planet type, random game seed, LAWK, and which type of start to have. Basically options that players can look through and change, even on their first playthrough. Then all of the other options would be behind some button to open advanced setting. T…
- This post was truncated! click here to read the full post.
- Implementing New Game Settings
- posted by @Oliveriver 7 дней назад, пятница 13-го мая 2022 20:57:34 +03:00
- The purpose of this thread is to design the new game settings screen (excluding planet generation), ideally ready for implementation in 0.5.9.
- I’m jumping the gun a bit here as I won’t be able to work on this for like a month (exams + learning the codebase + smaller additions first) but considering some recent discussions and features currently being worked on, I think it makes sense to get this discussion started. I’ve been thinking about it qui…
- This post was truncated! click here to read the full post.
- Reproduction vs Mutations
- posted by @Deus 8 дней назад, четверг 12-го мая 2022 21:37:59 +03:00
- Commenting here in accordance to my thoughts in the exploration thread regarding lateral gene transfer and in light of recent discussion for a mechanism for discounts: Exploration
- I think for the purposes of the Microbe stage, it’s good enough to represent lateral genetic transfer through the mechanism of transformation. I’m using Nick Lane’s “The Vital Question” as a source of information here, where he says that especially for prokaryotes, late…
- This post was truncated! click here to read the full post.
- Organelle Upgrades
- posted by @Deus 8 дней назад, четверг 12-го мая 2022 19:49:39 +03:00
- You’re right in regard to the iron-as-byproduct comment. It is indeed a waste product of lithotrophic metabolic processes. And also, I do advocate for having something like a hydrogenosome be a variant.
- And I understand where a lot of this feeling of “mess” can come from. Atleast for me, it comes with realizing there are multiple concepts, like the protein enzymes concept and organelle modifications, that can deal with similar facets of the game,…
- This post was truncated! click here to read the full post.
- Organelle Upgrades
- posted by @Buckly 8 дней назад, четверг 12-го мая 2022 06:59:55 +03:00
- I think these are some good ideas to start with.
- When we are ready to attempt implementation, I think that focusing on the fundamental/popular parts like mitochondria and chloroplasts (and their prokaryote analogue) first will be wise. Balancing and fine-tuning this feature is gonna be pretty intensive.
- Deus:
- Mineralization - Creates mineralized granules which add +2 Health, but reduces ATP production by 10%. (source) https://journals.asm.org/…
- This post was truncated! click here to read the full post.
- Organelle Upgrades
- posted by @hhyyrylainen henri_hyyrylainen 9 дней назад, среда 11-го мая 2022 20:01:52 +03:00
- Deus:
- but right-clicking on the part button in the editor GUI applies modifications to all future instances of that part placed.
- That sounds like even more work as that would be a separate system and it needs to be designed how that interacts with normal upgrades. I’d highly suggest we do not consider that kind of desig…
- This post was truncated! click here to read the full post.
- Organelle Upgrades
- posted by @Deus 9 дней назад, среда 11-го мая 2022 06:42:35 +03:00
- We are approaching a point in development where upgrades might be more relevant, so here are some proposed organelle upgrades to ensure that we have material. Much of it is based on Buckly’s previous post above, and I simply included more organelles and slightly tweaked some existing concepts, which absolutely is open to comment and reversion.
- I would like to spend some time in the near future on related concepts, such as refining the enzyme conc…
- This post was truncated! click here to read the full post.
- Gameplay Discussion: Benefits of Being a Larger Cell
- posted by @Maxonovien 13 дней назад, суббота 7-го мая 2022 12:24:37 +03:00
- But there aren’t much concussive damage at the time being, are they? Pili are mure more sharp damages, for which bigger size does not help much afaik.
- Also, as a note, it won’t be of any use to have bigger cells evolve in the auto-evo, because health isn’t even remotely considered.
- Gameplay Discussion: Benefits of Being a Larger Cell
- posted by @hhyyrylainen henri_hyyrylainen 13 дней назад, суббота 7-го мая 2022 10:26:19 +03:00
- I’ll say this again: you should use the engulf size as that’s automatically adjusted for bacteria’s 50% smaller scale.
- Gameplay Discussion: Benefits of Being a Larger Cell
- posted by @Thim 14 дней назад, суббота 7-го мая 2022 03:52:57 +03:00
- done: GitHub - Revolutionary-Games/Thrive at health_from_size
- Gameplay Discussion: Benefits of Being a Larger Cell
- posted by @Buckly 14 дней назад, суббота 7-го мая 2022 03:37:20 +03:00
- I say it’s worth trying out. It’s probably not too hard to shove hexcount into the max health calculation of a species for a simple prototype.
- Gameplay Discussion: Benefits of Being a Larger Cell
- posted by @Deus 14 дней назад, пятница 6-го мая 2022 20:55:21 +03:00
- Input from our theorist, @Bird:
- She thinks of health and the HP stat as indicative of an organism’s capability to resist physical (concussive) and environmental damage. Along those lines, she does think that larger size should equal to more health, also bringing up that prokaryotes don’t really physically attack eukaryotes. What prokaryotes do instead against eukaryotes is resort to the excreting of toxins and enzymes, which remains potent agains…
- This post was truncated! click here to read the full post.
- Gameplay Discussion: Benefits of Being a Larger Cell
- posted by @hhyyrylainen henri_hyyrylainen 14 дней назад, пятница 6-го мая 2022 12:40:53 +03:00
- Deus:
- halved damage from a nucleus seems a tad arbitrary, but increased health from mass makes sense.
- Again, evolving the nucleus gives the cell 50% more size immediately…
- I’d wish we had active theorists to talk about the realism of more health from larger size…
- Gameplay Discussion: Benefits of Being a Larger Cell
- posted by @Deus 14 дней назад, пятница 6-го мая 2022 06:53:52 +03:00
- Pasted from GitHub comment for better organization…
- Tested this in free build since it was taking a pretty long time for predatory adaptations to evolve in the AI, so it might be an imperfect representation of gameplay experience.
- It definitely had an effect with prokaryotes that have a posterior pilus, which is a pretty common build to evolve in traditional gameplay. It doesn’t feel like you get your health absolutely drained. It’s still a bit ex…
- This post was truncated! click here to read the full post.
- Gameplay Discussion: Benefits of Being a Larger Cell
- posted by @hhyyrylainen henri_hyyrylainen 15 дней назад, четверг 5-го мая 2022 14:23:57 +03:00
- One caveat is that at least how I understood the feature is that it reduces the damage from prokaryotes not everything. So for example out of ATP damage should stay the same. Reducing damage from environmental toxins and chunks is fine by me as tracking the ultimate damage source otherwise would be quite a bit more difficult to implement.
- Gameplay Discussion: Benefits of Being a Larger Cell
- posted by @Thim 15 дней назад, четверг 5-го мая 2022 13:55:39 +03:00
- 30 minutes early, but I think it’s safe to say that 50% damage reduction wins. Honestly, this result baffles me, but it was easy to implement: Make Nucleus Reduce Incoming Damage by Half by adQuid · Pull Request #3317 · Revolutionary-Games/Thrive · GitHub
- Gameplay Discussion: Benefits of Being a Larger Cell
- posted by @Thim 19 дней назад, воскресенье 1-го мая 2022 23:36:30 +03:00
- Yes I can, but not more than five minutes after opening the last poll. Here’s a new one:
- Click to view the poll.
- Gameplay Discussion: Benefits of Being a Larger Cell
- posted by @hhyyrylainen henri_hyyrylainen 19 дней назад, воскресенье 1-го мая 2022 23:12:48 +03:00
- Thim:
- I’ll close this poll on Thursday to compensate.
- You could set the exact closing time on the poll so it closes automatically and shows people how long it will last.
- Gameplay Discussion: Benefits of Being a Larger Cell
- posted by @Thim 19 дней назад, воскресенье 1-го мая 2022 23:00:09 +03:00
- Ok, I forgot to open the poll yesterday. Since it’s a day late, I’ll close this poll on Thursday to compensate.
- Click to view the poll.
- Exploration
- posted by @Magart Marco Garbelli 19 дней назад, воскресенье 1-го мая 2022 20:30:19 +03:00
- Speaking about environment “embellishment”, I’m no expert but I think that it would make sense that you could have minerals and low-solubility salts forming very small crystals. Modelling wise the particles shouldn’t even be very complicated to generate as they usually follow a very regular and geometrical structure (but I’ve just dipped my feet in 3d modelling so don’t take me for granted). Apart from that I would imagine you could have differe…
- This post was truncated! click here to read the full post.
- Disposed Microbe Problem
- posted by @84634E1A607A Ajax Dong 19 дней назад, воскресенье 1-го мая 2022 11:56:46 +03:00
- Kasterisk:
- Also for toggling physics debugging in runtime, it might be possible: SceneTree.debug_collisions_hint .
- This only applies to those newly spawned. The entities already on the scene won’t be affected.
- Exploration
- posted by @Kasterisk 19 дней назад, воскресенье 1-го мая 2022 09:27:13 +03:00
- Hiding unexplored patches/regions has already been planned from past concepts so it should be added. In this concept art for example, how it’s done visually is fading out the connecting lines to the hidden patches.
- Exploration
- posted by @hhyyrylainen henri_hyyrylainen 20 дней назад, суббота 30-го апр. 2022 23:37:02 +03:00
- I think it would be a pretty good idea to hide the patches that aren’t next to ones the player is currently in / has been in from the map to require the player to explore it to find all the patches.
- Exploration
- posted by @Kemikal Alex 20 дней назад, суббота 30-го апр. 2022 22:49:59 +03:00
- Deus:
- As a post note in regard to exploring the procedural map: I think it’s fine if we just implement a fog of war, where you can only see a certain amount of patches beyond your current one. This adds a bit more weight to the decision to move – I sure hope there’s a better patch here if I move there, or I wonder if the ocean surface starts after this patch or the next, or I didn’t know there was a cave/abyss here; things like that. We shou…
- This post was truncated! click here to read the full post.
- Disposed Microbe Problem
- posted by @hhyyrylainen henri_hyyrylainen 20 дней назад, суббота 30-го апр. 2022 13:24:27 +03:00
- That’s interesting. Probably caused by the physics system not triggering the callbacks symmetrically?
- I think it’ll be fine to check if a microbe is dead before starting to engulf it, that kind of check makes sense to me.
- Disposed Microbe Problem
- posted by @84634E1A607A Ajax Dong 20 дней назад, суббота 30-го апр. 2022 13:10:33 +03:00
- Disposed microbes are all dead.
- Somehow I’ve found that touchedMicrobes is not symmetric (I mean that A has B, but sometimes B doesn’t have A). My temprory fix is to check for dead microbes every time CanEngulf is called. But this is apparently not a good one.
- Release planning for 0.5.9 (and 0.5.8.1)
- posted by @hhyyrylainen henri_hyyrylainen 20 дней назад, суббота 30-го апр. 2022 11:48:52 +03:00
- 0.5.8.1 is out now:
- GitHub
- Release Thrive 0.5.8.1 · Revolutionary-Games/Thrive
- This release focuses on performance improvements and other smaller fixes. R…
- This post was truncated! click here to read the full post.
- Exploration
- posted by @Deus 20 дней назад, суббота 30-го апр. 2022 07:08:07 +03:00
- Buckly brought up exploration in discussion and I haven’t seen a dedicated thread for it. So I wanted to centralize some thoughts regarding it instead of having a lot of scattered ideas across various threads and discord.
- It was mentioned that right now, the only reason why a player would want to explore is to find more compound clouds. I think that’s a good base layer for incentivizing exploration as it is mission-centric to the gameplay loop as…
- This post was truncated! click here to read the full post.
- Gameplay Discussion: Benefits of Being a Larger Cell
- posted by @Thim 21 день назад, пятница 29-го апр. 2022 14:02:49 +03:00
- I’ll add the proposal for the nucleus providing damage reduction. If anyone wants to advocate for it type something out and I’ll add it to the description, but otherwise I’ll do my best.
- I guess that leads to a deeper question though: is the concern here giving advantage to larger microbes as a whole, or giving advantage to the nucleus?
- Ventus - New Sound desiner
- posted by @Oliveriver 23 дня назад, среда 27-го апр. 2022 23:40:28 +03:00
- Ah, I had no idea that existed. Thanks for pointing that out, I’ll keep it in mind in future.
- Gameplay Discussion: Benefits of Being a Larger Cell
- posted by @hhyyrylainen henri_hyyrylainen 23 дня назад, среда 27-го апр. 2022 20:59:05 +03:00
- Deus:
- I remember another idea hhyyrylainen brought up was to have the nucleus halve damage received. I’m a bit wary of this since I’m not sure that b…
- This post was truncated! click here to read the full post.
- Gameplay Discussion: Benefits of Being a Larger Cell
- posted by @Deus 23 дня назад, среда 27-го апр. 2022 20:54:20 +03:00
- We had a bit of discussion earlier on discord regarding limited benefits to size in game. Regarding the idea of health being attached to size/mass, some concerns were brought up that prokaryotes would be heavily nerfed in their capabilities with combat against eukaryotes. I personally think that this is fine since strategies like predation really started emerging with eukaryotes and similar sized cells due to the newfound evolutionary viability …
- This post was truncated! click here to read the full post.
- Ventus - New Sound desiner
- posted by @Kasterisk 23 дня назад, среда 27-го апр. 2022 19:30:45 +03:00
- We do have this list of sound effects in the wiki which I have recently updated to match the current sfx situation ingame. Now that I think about it, the list should also include the actual corresponding sound so that people can listen to it directly in the wiki, I’ll probably add it soon.
- Also welcome to the team Ventus!
- Offline Thread
- posted by @Oliveriver 23 дня назад, среда 27-го апр. 2022 18:57:17 +03:00
- Reviving this thread because why not?
- I’m going to be very busy until the end of May. I would like to stay away from Thrive as much as possible in that time to stop myself getting distracted. I’ll check in on things but doubt I’ll be involved in any discussions.
- After that though, I’ll be free and ready to get to some programming work.
- NEWS
- Progress Update 5/14/2022
- posted by Revolutionary Games 6 дней назад, суббота 14-го мая 2022 16:50:14 +03:00
- Categories: Outreach, Graphics, Progress Report
- We had a decent amount of progress this week with many of our WIP features like the patch map generation and engulfment, which we are very excited to see completed. We’ve also had an exciting amount of assets created this week, which are shown off below. These additions are looking to make for an exciting update in the future of Thrive!
- We regret to say that saves are going to be incompatible between 0.5.8 and 0.5.9 and will not carry over. The f…
- This post was truncated! click here to read the full post.
- Progress Update 05/07/2022
- posted by Revolutionary Games 13 дней назад, суббота 7-го мая 2022 17:24:36 +03:00
- Categories: Outreach, Progress Report
- This week we focused out efforts on fixing alot of the issues found in the latest release, as well as continued progress on the patch-map systems, and testing out various ways to grant benefits to cell size.
- we have re-released 0.5.8.1 as there was a problem where the crash reporter didn’t correctly generate crash callstacks, making the reports almost completely useless. To rectify this a tweak was made to our Godot build scripts and new builds o…
- This post was truncated! click here to read the full post.
- Progress Update 04/30/2022 | Patch 0.5.8.1
- posted by Revolutionary Games 20 дней назад, суббота 30-го апр. 2022 17:04:42 +03:00
- Categories: Outreach, Releases, Progress Report
- Update 0.5.8.1 is now out, and introduces a good amount of performance improvements, among other things. We hope that this significantly improves the enjoyability of Thrive, and look forward to hearing any feedback on the changes.
- This week we focused on performance, and the causes behind it. We eventually discovered that the spawn system was spawning entities far faster than they could be despawned which resulted in a massive hit to performance …
- This post was truncated! click here to read the full post.
- Progress Update 04/23/2022
- posted by Revolutionary Games месяц назад, суббота 23-го апр. 2022 16:27:18 +03:00
- Categories: Outreach, Progress Report
- Ever since the release of 0.5.8 last week, we have been having a blast seeing all the cool creations players have made in the multicellular prototype. We’ve been getting a large amount of feedback as well, which has helped tremendously in identifying some difficulties with game performance that we have since pursued. Next week, we hope to create a patch to address some of the performance issues that players have reported, and maybe some other ch…
- This post was truncated! click here to read the full post.
- Devblog #32: Making History
- posted by Revolutionary Games месяц назад, суббота 16-го апр. 2022 18:16:54 +03:00
- Categories: Announcements, Releases, Microbe Stage, Multicellular Stage, Outreach, Progress Report
- Thrive version 0.5.8 is finally here; And with it comes the versatile signaling agents, which allow you to actively communicate with your allied cells; New randomly generated region names, which gives each world a new and unique flair; The highly anticipated multicellular prototype, which permits you to progress further than ever in the grand journey of Thrive; And of course, a grand host of other changes and bug-fixes!
- You can download the launc…
- This post was truncated! click here to read the full post.
- Progress Update 04/09/2022
- posted by Revolutionary Games месяц назад, суббота 9-го апр. 2022 17:27:10 +03:00
- Categories: Outreach, Progress Report
- This week our team exploded in activity as new and old developers alike were invigorated by recent developments, which resulted in a great amount of progress made. The fruits of our labor will officially release on the 16th, but you may also experience these newest changes now by downloading our newly available release candidate build.
- Programming
- New DevBuild for our patrons:Various fixes to the early multicellular prototype, cell layouts now sho…
- This post was truncated! click here to read the full post.
- Progress Update 04/02/2022
- posted by Revolutionary Games 2 месяца назад, суббота 2-го апр. 2022 23:42:48 +03:00
- Categories: Outreach, Progress Report
- This week we’ve finally produced a playable build for the multicellular prototype which currently features cell type specialization and gameplay. This is a monumental step in Thrive’s development, but there are yet many more steps on the long road of progress that await us. This prototype will be packaged with the 0.5.8 update, which also includes the new signaling agents part and a large host of other changes.
- 0.5.8 is currently scheduled to rel…
- This post was truncated! click here to read the full post.
- Progress Update 3/26/2022
- posted by Revolutionary Games 2 месяца назад, суббота 26-го мар. 2022 16:08:56 +02:00
- Categories: Outreach, Progress Report
- This past week we’ve witnessed some increased interest in our project coinciding with the release of Oliver’s video, along with the addition of two new programmers to our team. We’d like to welcome everyone to our community, and hope to continue to impress and inspire with our steadily growing game.
- Progress on our multicellular prototype has reached a point where we can now reveal visible results! It may not look pretty now, but every gem begins…
- This post was truncated! click here to read the full post.
- Progress Update 3/19/2022
- posted by Revolutionary Games 2 месяца назад, воскресенье 20-го мар. 2022 03:18:23 +02:00
- Categories: Outreach, Progress Report
- It’s another week as we continue to march forward in progress, something that might pick up in speed now that some of our programmers are able to find time for Thrive’s development again.
- Development continues to be focused on our multicellular prototype, with emphasis on the cell previews in the editor. We’ve also given our tutorials a new coat of paint in hopes of making them more informative and comprehensible.
- Programming
- New DevBuild for our …
- This post was truncated! click here to read the full post.
- Progress Update 3/12/2022
- posted by Revolutionary Games 2 месяца назад, суббота 12-го мар. 2022 17:48:54 +02:00
- Categories: Outreach, Progress Report
- Our lead programmer continues to focus their efforts on the multicell prototype, while everyone else has been working on changes that have not yet been committed to the game proper. As a result we unfortunately do not have anything of substance to show off this week.
- Refactoring the microbe editor turned out to be quite the feat, but we are happy to say that it is now complete and ready to go. This is a vital step in the creation of the next stag…
- This post was truncated! click here to read the full post.
- Playing Thrive 0.5.8.1
- Thrive is running. Log output:
- Process Started
- Godot Engine v3.4.4.stable.mono..3089e490a - https://godotengine.org
- OpenGL ES 3.0 Renderer: ATI Mobility Radeon HD 4200 Series
- OpenGL ES Batching: ON
- Mono: Log file is: 'C:/Users/Profile1/AppData/Roaming/Thrive/mono/mono_logs/2022-05-20_19.07.17_448.log'
- This is Thrive version: 0.5.8.1
- Startup C# locale is: ru-RU Godot locale is: ru_RU
- user:// directory is: C:/Users/Profile1/AppData/Roaming/Thrive
- Game logs are written to: C:/Users/Profile1/AppData/Roaming/Thrive\logs latest log is 'log.txt'
- Doing delayed apply for some settings
- Set audio output device to: Default
- Set C# locale to: en Godot locale is: en
- No SteamClient class found, not initializing Steam
- Loaded registry for Compound with 11 items
- Loaded registry for MembraneType with 6 items
- Loaded registry for Background with 11 items
- Loaded registry for Biome with 11 items
- Loaded registry for BioProcess with 13 items
- Loaded registry for OrganelleDefinition with 23 items
- Loaded registry for MusicCategory with 6 items
- Loaded registry for HelpTexts with 5 items
- Loaded registry for NamedInputGroup with 6 items
- Loaded registry for Gallery with 3 items
- SimulationParameters loading ended
- SimulationParameters are good
- Loading mod Nodes into the scene tree
- Jukebox now playing from: Menu
- Jukebox: starting track: res://assets/sounds/main-menu-theme-1.ogg position: 0
- TaskExecutor started with parallel job count: 2
- Previous patch doesn't exist, despawning all entities.
- Applying patch (Karronon Volcanic Vent) settings
- Number of clouds in this patch = 8
- Registering new spawner: Name: ammonia density: 4E-05
- Registering new spawner: Name: glucose density: 2E-05
- Registering new spawner: Name: phosphates density: 4E-05
- Registering new spawner: Name: hydrogensulfide density: 4E-05
- oxygen spawn density is 0. It won't spawn
- carbondioxide spawn density is 0. It won't spawn
- nitrogen spawn density is 0. It won't spawn
- sunlight spawn density is 0. It won't spawn
- Number of chunks in this patch = 4
- Registering new spawner: Name: FLOATING_HAZARD density: 0.0001
- Registering new spawner: Name: SMALL_IRON_CHUNK density: 3E-05
- MARINE_SNOW spawn density is 0. It won't spawn
- Registering new spawner: Name: BIG_IRON_CHUNK density: 8E-05
- Number of species in this patch = 1
- Registering new spawner: Name: 1 density: 1.438849E-05
- Player Microbe spawned
- Jukebox now playing from: MicrobeStage
- 1 | #version 330
- 2 | #define GLES_OVER_GL
- 3 | #define MAX_LIGHT_DATA_STRUCTS 409
- 4 |
- 5 | #define MAX_FORWARD_LIGHTS 32
- 6 |
- 7 | #define MAX_REFLECTION_DATA_STRUCTS 455
- 8 |
- 9 | #define MAX_SKELETON_BONES 1365
- 10 |
- 11 | #define ENABLE_OCTAHEDRAL_COMPRESSION
- 12 | #define USE_LIGHT_DIRECTIONAL
- 13 | #define USE_FORWARD_LIGHTING
- 14 | #define USE_RADIANCE_MAP
- 15 | #define USE_RADIANCE_MAP_ARRAY
- 16 | #define SHADOW_MODE_PCF_5
- 17 | #define USE_SHADOW
- 18 | #define USE_LIGHTMAP_FILTER_BICUBIC
- 19 | #define LIGHT_DIRECTIONAL_SHADOW
- 20 | #define LIGHT_USE_PSSM4
- 21 | #define USE_MATERIAL
- 22 | #define ENABLE_UV_INTERP
- 23 | precision highp float;
- 24 | precision highp int;
- 25 |
- 26 |
- 27 | /* texture unit usage, N is max_texture_unity-N
- 28 |
- 29 | 1-skeleton
- 30 | 2-radiance
- 31 | 3-reflection_atlas
- 32 | 4-directional_shadow
- 33 | 5-shadow_atlas
- 34 | 6-decal_atlas
- 35 | 7-screen
- 36 | 8-depth
- 37 | 9-probe1
- 38 | 10-probe2
- 39 |
- 40 | */
- 41 |
- 42 | uniform highp mat4 world_transform;
- 43 | /* clang-format on */
- 44 |
- 45 | #define M_PI 3.14159265359
- 46 | #define SHADER_IS_SRGB false
- 47 |
- 48 | /* Varyings */
- 49 |
- 50 | #if defined(ENABLE_COLOR_INTERP)
- Output is too long, it was truncated! See the log file for full output.
- 898 | }
- 899 | #endif
- 900 | }
- 901 |
- 902 | #ifdef USE_LIGHTMAP
- 903 | #ifdef USE_LIGHTMAP_LAYERED
- 904 | uniform mediump sampler2DArray lightmap; //texunit:-9
- 905 | uniform int lightmap_layer;
- 906 | #else
- 907 | uniform mediump sampler2D lightmap; //texunit:-9
- 908 | #endif
- 909 |
- 910 | uniform mediump float lightmap_energy;
- 911 |
- 912 | #ifdef USE_LIGHTMAP_FILTER_BICUBIC
- 913 | uniform vec2 lightmap_texture_size;
- 914 |
- 915 | // w0, w1, w2, and w3 are the four cubic B-spline basis functions
- 916 | float w0(float a) {
- 917 | return (1.0 / 6.0) * (a * (a * (-a + 3.0) - 3.0) + 1.0);
- 918 | }
- 919 |
- 920 | float w1(float a) {
- 921 | return (1.0 / 6.0) * (a * a * (3.0 * a - 6.0) + 4.0);
- 922 | }
- 923 |
- 924 | float w2(float a) {
- 925 | return (1.0 / 6.0) * (a * (a * (-3.0 * a + 3.0) + 3.0) + 1.0);
- 926 | }
- 927 |
- 928 | float w3(float a) {
- 929 | return (1.0 / 6.0) * (a * a * a);
- 930 | }
- 931 |
- 932 | // g0 and g1 are the two amplitude functions
- 933 | float g0(float a) {
- 934 | return w0(a) + w1(a);
- 935 | }
- 936 |
- 937 | float g1(float a) {
- 938 | return w2(a) + w3(a);
- 939 | }
- 940 |
- 941 | // h0 and h1 are the two offset functions
- 942 | float h0(float a) {
- 943 | return -1.0 + w1(a) / (w0(a) + w1(a));
- 944 | }
- 945 |
- 946 | float h1(float a) {
- 947 | return 1.0 + w3(a) / (w2(a) + w3(a));
- 948 | }
- 949 |
- 950 | vec4 texture_bicubic(sampler2D tex, vec2 uv) {
- 951 | vec2 texel_size = vec2(1.0) / lightmap_texture_size;
- 952 |
- 953 | uv = uv * lightmap_texture_size + vec2(0.5);
- 954 |
- 955 | vec2 iuv = floor(uv);
- 956 | vec2 fuv = fract(uv);
- 957 |
- 958 | float g0x = g0(fuv.x);
- 959 | float g1x = g1(fuv.x);
- 960 | float h0x = h0(fuv.x);
- 961 | float h1x = h1(fuv.x);
- 962 | float h0y = h0(fuv.y);
- 963 | float h1y = h1(fuv.y);
- 964 |
- 965 | vec2 p0 = (vec2(iuv.x + h0x, iuv.y + h0y) - vec2(0.5)) * texel_size;
- 966 | vec2 p1 = (vec2(iuv.x + h1x, iuv.y + h0y) - vec2(0.5)) * texel_size;
- 967 | vec2 p2 = (vec2(iuv.x + h0x, iuv.y + h1y) - vec2(0.5)) * texel_size;
- 968 | vec2 p3 = (vec2(iuv.x + h1x, iuv.y + h1y) - vec2(0.5)) * texel_size;
- 969 |
- 970 | return (g0(fuv.y) * (g0x * texture(tex, p0) + g1x * texture(tex, p1))) +
- 971 | (g1(fuv.y) * (g0x * texture(tex, p2) + g1x * texture(tex, p3)));
- 972 | }
- 973 |
- 974 | vec4 textureArray_bicubic(sampler2DArray tex, vec3 uv) {
- 975 | vec2 texel_size = vec2(1.0) / lightmap_texture_size;
- 976 |
- 977 | uv.xy = uv.xy * lightmap_texture_size + vec2(0.5);
- 978 |
- 979 | vec2 iuv = floor(uv.xy);
- 980 | vec2 fuv = fract(uv.xy);
- 981 |
- 982 | float g0x = g0(fuv.x);
- 983 | float g1x = g1(fuv.x);
- 984 | float h0x = h0(fuv.x);
- 985 | float h1x = h1(fuv.x);
- 986 | float h0y = h0(fuv.y);
- 987 | float h1y = h1(fuv.y);
- 988 |
- 989 | vec2 p0 = (vec2(iuv.x + h0x, iuv.y + h0y) - vec2(0.5)) * texel_size;
- 990 | vec2 p1 = (vec2(iuv.x + h1x, iuv.y + h0y) - vec2(0.5)) * texel_size;
- 991 | vec2 p2 = (vec2(iuv.x + h0x, iuv.y + h1y) - vec2(0.5)) * texel_size;
- 992 | vec2 p3 = (vec2(iuv.x + h1x, iuv.y + h1y) - vec2(0.5)) * texel_size;
- 993 |
- 994 | return (g0(fuv.y) * (g0x * texture(tex, vec3(p0, uv.z)) + g1x * texture(tex, vec3(p1, uv.z
- )))) +
- 995 | (g1(fuv.y) * (g0x * texture(tex, vec3(p2, uv.z)) + g1x * texture(tex, vec3(p3, uv.z))));
- 996 | }
- 997 |
- 998 | #define LIGHTMAP_TEXTURE_SAMPLE(m_tex, m_uv) texture_bicubic(m_tex, m_uv)
- 999 | #define LIGHTMAP_TEXTURE_LAYERED_SAMPLE(m_tex, m_uv) textureArray_bicubic(m_tex, m_uv)
- 1000 |
- 1001 | #else //!USE_LIGHTMAP_FILTER_BICUBIC
- 1002 | #define LIGHTMAP_TEXTURE_SAMPLE(m_tex, m_uv) texture(m_tex, m_uv)
- 1003 | #define LIGHTMAP_TEXTURE_LAYERED_SAMPLE(m_tex, m_uv) texture(m_tex, m_uv)
- 1004 |
- 1005 | #endif //USE_LIGHTMAP_FILTER_BICUBIC
- 1006 | #endif
- 1007 |
- 1008 | #ifdef USE_LIGHTMAP_CAPTURE
- 1009 | uniform mediump vec4[12] lightmap_captures;
- 1010 | #endif
- 1011 |
- 1012 | #ifdef USE_GI_PROBES
- 1013 |
- 1014 | uniform mediump sampler3D gi_probe1; //texunit:-9
- 1015 | uniform highp mat4 gi_probe_xform1;
- 1016 | uniform highp vec3 gi_probe_bounds1;
- 1017 | uniform highp vec3 gi_probe_cell_size1;
- 1018 | uniform highp float gi_probe_multiplier1;
- 1019 | uniform highp float gi_probe_bias1;
- 1020 | uniform highp float gi_probe_normal_bias1;
- 1021 | uniform bool gi_probe_blend_ambient1;
- 1022 |
- 1023 | uniform mediump sampler3D gi_probe2; //texunit:-10
- 1024 | uniform highp mat4 gi_probe_xform2;
- 1025 | uniform highp vec3 gi_probe_bounds2;
- 1026 | uniform highp vec3 gi_probe_cell_size2;
- 1027 | uniform highp float gi_probe_multiplier2;
- 1028 | uniform highp float gi_probe_bias2;
- 1029 | uniform highp float gi_probe_normal_bias2;
- 1030 | uniform bool gi_probe2_enabled;
- 1031 | uniform bool gi_probe_blend_ambient2;
- 1032 |
- 1033 | vec3 voxel_cone_trace(mediump sampler3D probe, vec3 cell_size, vec3 pos, vec3 ambient, bool blend_ambient, vec3 direction, float tan_half_angle, float max_distance, float p_bias) {
- 1034 | float dist = p_bias; //1.0; //dot(direction,mix(vec3(-1.0),vec3(1.0),greaterThan(direction,vec3(0.0))))*2.0;
- 1035 | float alpha = 0.0;
- 1036 | vec3 color = vec3(0.0);
- 1037 |
- 1038 | while (dist < max_distance && alpha < 0.95) {
- 1039 | float diameter = max(1.0, 2.0 * tan_half_angle * dist);
- 1040 | vec4 scolor = textureLod(probe, (pos + dist * direction) * cell_size, log2(diameter));
- 1041 | float a = (1.0 - alpha);
- 1042 | color += scolor.rgb * a;
- 1043 | alpha += a * scolor.a;
- 1044 | dist += diameter * 0.5;
- 1045 | }
- 1046 |
- 1047 | if (blend_ambient) {
- 1048 | color.rgb = mix(ambient, color.rgb, min(1.0, alpha / 0.95));
- 1049 | }
- 1050 |
- 1051 | return color;
- 1052 | }
- 1053 |
- 1054 | void gi_probe_compute(mediump sampler3D probe, mat4 probe_xform, vec3 bounds, vec3 cell_size, vec3 pos, vec3 ambient, vec3 environment, bool blend_ambient, float multiplier, mat3 normal_mtx, vec3 ref_vec, float roughness, float p_bias, float p_normal_bias, inout vec4 out_spec, inout vec4 out_diff) {
- 1055 | vec3 probe_pos = (probe_xform * vec4(pos, 1.0)).xyz;
- 1056 | vec3 ref_pos = (probe_xform * vec4(pos + ref_vec, 1.0)).xyz;
- 1057 | ref_vec = normalize(ref_pos - probe_pos);
- 1058 |
- 1059 | probe_pos += (probe_xform * vec4(normal_mtx[2], 0.0)).xyz * p_normal_bias;
- 1060 |
- 1061 | /* out_diff.rgb = voxel_cone_trace(probe,cell_size,probe_pos,normalize((probe_xform * vec4(ref_vec,0.0)).xyz),0.0 ,100.0);
- 1062 | out_diff.a = 1.0;
- 1063 | return;*/
- 1064 | //out_diff = vec4(textureLod(probe,probe_pos*cell_size,3.0).rgb,1.0);
- 1065 | //return;
- 1066 |
- 1067 | //this causes corrupted pixels, i have no idea why..
- 1068 | if (any(bvec2(any(lessThan(probe_pos, vec3(0.0))), any(greaterThan(probe_pos, bounds))))) {
- 1069 | return;
- 1070 | }
- 1071 |
- 1072 | vec3 blendv = abs(probe_pos / bounds * 2.0 - 1.0);
- 1073 | float blend = clamp(1.0 - max(blendv.x, max(blendv.y, blendv.z)), 0.0, 1.0);
- 1074 | //float blend=1.0;
- 1075 |
- 1076 | float max_distance = length(bounds);
- 1077 |
- 1078 | //radiance
- 1079 | #ifdef VCT_QUALITY_HIGH
- 1080 |
- 1081 | #define MAX_CONE_DIRS 6
- 1082 | vec3 cone_dirs[MAX_CONE_DIRS] = vec3[](
- 1083 | vec3(0.0, 0.0, 1.0),
- 1084 | vec3(0.866025, 0.0, 0.5),
- 1085 | vec3(0.267617, 0.823639, 0.5),
- 1086 | vec3(-0.700629, 0.509037, 0.5),
- 1087 | vec3(-0.700629, -0.509037, 0.5),
- 1088 | vec3(0.267617, -0.823639, 0.5));
- 1
- 089 |
- 1090 | float cone_weights[MAX_CONE_DIRS] = float[](0.25, 0.15, 0.15, 0.15, 0.15, 0.15);
- 1091 | float cone_angle_tan = 0.577;
- 1092 | float min_ref_tan = 0.0;
- 1093 | #else
- 1094 |
- 1095 | #define MAX_CONE_DIRS 4
- 1096 |
- 1097 | vec3 cone_dirs[MAX_CONE_DIRS] = vec3[](
- 1098 | vec3(0.707107, 0.0, 0.707107),
- 1099 | vec3(0.0, 0.707107, 0.707107),
- 1100 | vec3(-0.707107, 0.0, 0.707107),
- 1101 | vec3(0.0, -0.707107, 0.707107));
- 1102 |
- 1103 | float cone_weights[MAX_CONE_DIRS] = float[](0.25, 0.25, 0.25, 0.25);
- 1104 | float cone_angle_tan = 0.98269;
- 1105 | max_distance *= 0.5;
- 1106 | float min_ref_tan = 0.2;
- 1107 |
- 1108 | #endif
- 1109 | vec3 light = vec3(0.0);
- 1110 | for (int i = 0; i < MAX_CONE_DIRS; i++) {
- 1111 | vec3 dir = normalize((probe_xform * vec4(pos + normal_mtx * cone_dirs[i], 1.0)).xyz - probe_pos);
- 1112 | light += cone_weights[i] * voxel_cone_trace(probe, cell_size, probe_pos, ambient, blend_ambient, dir, cone_angle_tan, max_distance, p_bias);
- 1113 | }
- 1114 |
- 1115 | light *= multiplier;
- 1116 |
- 1117 | out_diff += vec4(light * blend, blend);
- 1118 |
- 1119 | //irradiance
- 1120 |
- 1121 | vec3 irr_light = voxel_cone_trace(probe, cell_size, probe_pos, environment, blend_ambient, ref_vec, max(min_ref_tan, tan(roughness * 0.5 * M_PI * 0.99)), max_distance, p_bias);
- 1122 |
- 1123 | irr_light *= multiplier;
- 1124 | //irr_light=vec3(0.0);
- 1125 |
- 1126 | out_spec += vec4(irr_light * blend, blend);
- 1127 | }
- 1128 |
- 1129 | void gi_probes_compute(vec3 pos, vec3 normal, float roughness, inout vec3 out_specular, inout vec3 out_ambient) {
- 1130 | roughness = roughness * roughness;
- 1131 |
- 1132 | vec3 ref_vec = normalize(reflect(normalize(pos), normal));
- 1133 |
- 1134 | //find arbitrary tangent and bitangent, then build a matrix
- 1135 | vec3 v0 = abs(normal.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(0.0, 1.0, 0.0);
- 1136 | vec3 tangent = normalize(cross(v0, normal));
- 1137 | vec3 bitangent = normalize(cross(tangent, normal));
- 1138 | mat3 normal_mat = mat3(tangent, bitangent, normal);
- 1139 |
- 1140 | vec4 diff_accum = vec4(0.0);
- 1141 | vec4 spec_accum = vec4(0.0);
- 1142 |
- 1143 | vec3 ambient = out_ambient;
- 1144 | out_ambient = vec3(0.0);
- 1145 |
- 1146 | vec3 environment = out_specular;
- 1147 |
- 1148 | out_specular = vec3(0.0);
- 1149 |
- 1150 | gi_probe_compute(gi_probe1, gi_probe_xform1, gi_probe_bounds1, gi_probe_cell_size1, pos, ambient, environment, gi_probe_blend_ambient1, gi_probe_multiplier1, normal_mat, ref_vec, roughness, gi_probe_bias1, gi_probe_normal_bias1, spec_accum, diff_accum);
- 1151 |
- 1152 | if (gi_probe2_enabled) {
- 1153 | gi_probe_compute(gi_probe2, gi_probe_xform2, gi_probe_bounds2, gi_probe_cell_size2, pos, ambient, environment, gi_probe_blend_ambient2, gi_probe_multiplier2, normal_mat, ref_vec, roughness, gi_probe_bias2, gi_probe_normal_bias2, spec_accum, diff_accum);
- 1154 | }
- 1155 |
- 1156 | if (diff_accum.a > 0.0) {
- 1157 | diff_accum.rgb /= diff_accum.a;
- 1158 | }
- 1159 |
- 1160 | if (spec_accum.a > 0.0) {
- 1161 | spec_accum.rgb /= spec_accum.a;
- 1162 | }
- 1163 |
- 1164 | out_specular += spec_accum.rgb;
- 1165 | out_ambient += diff_accum.rgb;
- 1166 | }
- 1167 |
- 1168 | #endif
- 1169 |
- 1170 | void main() {
- 1171 | #ifdef RENDER_DEPTH_DUAL_PARABOLOID
- 1172 |
- 1173 | if (dp_clip > 0.0)
- 1174 | discard;
- 1175 | #endif
- 1176 |
- 1177 | //lay out everything, whathever is unused is optimized away anyway
- 1178 | highp vec3 vertex = vertex_interp;
- 1179 | vec3 view = -normalize(vertex_interp);
- 1180 | vec3 albedo = vec3(1.0);
- 1181 | vec3 transmission = vec3(0.0);
- 1182 | float metallic = 0.0;
- 1183 | float specular = 0.5;
- 1184 | vec3 emission = vec3(0.0);
- 1185 | float roughness = 1.0;
- 1186 | float rim = 0.0;
- 1187 | float rim_tint = 0.0;
- 1188 | float clearcoat = 0.0;
- 1189 | float clearcoat_gloss = 0.0;
- 1190 | float anisotropy = 0.0;
- 1191 | vec2 anisotropy_flow = vec2(1.0, 0.0);
- 1192 |
- 1193 | #if defined(ENABLE_AO)
- 1194 | float ao = 1.0;
- 1195 | float ao_light_affect = 0.0;
- 1196 | #endif
- 1197 |
- 1198 | float alpha = 1.0;
- 1199 |
- 1200 | #if defined(ALPHA_SCISSOR_USED)
- 1201 | float
- alpha_scissor = 0.5;
- 1202 | #endif
- 1203 |
- 1204 | #if defined(ENABLE_TANGENT_INTERP) || defined(ENABLE_NORMALMAP) || defined(LIGHT_USE_ANISOTROPY)
- 1205 | vec3 binormal = normalize(binormal_interp);
- 1206 | vec3 tangent = normalize(tangent_interp);
- 1207 | #else
- 1208 | vec3 binormal = vec3(0.0);
- 1209 | vec3 tangent = vec3(0.0);
- 1210 | #endif
- 1211 | vec3 normal = normalize(normal_interp);
- 1212 |
- 1213 | #if defined(DO_SIDE_CHECK)
- 1214 | if (!gl_FrontFacing) {
- 1215 | normal = -normal;
- 1216 | }
- 1217 | #endif
- 1218 |
- 1219 | #if defined(ENABLE_UV_INTERP)
- 1220 | vec2 uv = uv_interp;
- 1221 | #endif
- 1222 |
- 1223 | #if defined(ENABLE_UV2_INTERP) || defined(USE_LIGHTMAP)
- 1224 | vec2 uv2 = uv2_interp;
- 1225 | #endif
- 1226 |
- 1227 | #if defined(ENABLE_COLOR_INTERP)
- 1228 | vec4 color = color_interp;
- 1229 | #endif
- 1230 |
- 1231 | #if defined(ENABLE_NORMALMAP)
- 1232 |
- 1233 | vec3 normalmap = vec3(0.5);
- 1234 | #endif
- 1235 |
- 1236 | float normaldepth = 1.0;
- 1237 |
- 1238 | #if defined(SCREEN_UV_USED)
- 1239 | vec2 screen_uv = gl_FragCoord.xy * screen_pixel_size;
- 1240 | #endif
- 1241 |
- 1242 | #if defined(ENABLE_SSS)
- 1243 | float sss_strength = 0.0;
- 1244 | #endif
- 1245 |
- 1246 | {
- 1247 | /* clang-format off */
- 1248 | {
- 1249 | vec2 m_base_uv=uv_interp;
- 1250 | vec4 m_albedo_tex=texture(m_texture_albedo, m_base_uv);
- 1251 | albedo=(m_albedo.rgb*m_albedo_tex.rgb);
- 1252 | metallic=m_metallic;
- 1253 | roughness=m_roughness;
- 1254 | specular=m_specular;
- 1255 | alpha=(m_albedo.a*m_albedo_tex.a);
- 1256 | }
- 1257 |
- 1258 |
- 1259 | /* clang-format on */
- 1260 | }
- 1261 |
- 1262 | #if !defined(USE_SHADOW_TO_OPACITY)
- 1263 |
- 1264 | #if defined(ALPHA_SCISSOR_USED)
- 1265 | if (alpha < alpha_scissor) {
- 1266 | discard;
- 1267 | }
- 1268 | #endif // ALPHA_SCISSOR_USED
- 1269 |
- 1270 | #ifdef USE_OPAQUE_PREPASS
- 1271 |
- 1272 | if (alpha < opaque_prepass_threshold) {
- 1273 | discard;
- 1274 | }
- 1275 |
- 1276 | #endif // USE_OPAQUE_PREPASS
- 1277 |
- 1278 | #endif // !USE_SHADOW_TO_OPACITY
- 1279 |
- 1280 | #if defined(ENABLE_NORMALMAP)
- 1281 |
- 1282 | normalmap.xy = normalmap.xy * 2.0 - 1.0;
- 1283 | normalmap.z = sqrt(max(0.0, 1.0 - dot(normalmap.xy, normalmap.xy))); //always ignore Z, as it can be RG packed, Z may be pos/neg, etc.
- 1284 |
- 1285 | normal = normalize(mix(normal, tangent * normalmap.x + binormal * normalmap.y + normal * normalmap.z, normaldepth));
- 1286 |
- 1287 | #endif
- 1288 |
- 1289 | #if defined(LIGHT_USE_ANISOTROPY)
- 1290 |
- 1291 | if (anisotropy > 0.01) {
- 1292 | //rotation matrix
- 1293 | mat3 rot = mat3(tangent, binormal, normal);
- 1294 | //make local to space
- 1295 | tangent = normalize(rot * vec3(anisotropy_flow.x, anisotropy_flow.y, 0.0));
- 1296 | binormal = normalize(rot * vec3(-anisotropy_flow.y, anisotropy_flow.x, 0.0));
- 1297 | }
- 1298 |
- 1299 | #endif
- 1300 |
- 1301 | #ifdef ENABLE_CLIP_ALPHA
- 1302 | if (albedo.a < 0.99) {
- 1303 | //used for doublepass and shadowmapping
- 1304 | discard;
- 1305 | }
- 1306 | #endif
- 1307 |
- 1308 | /////////////////////// LIGHTING //////////////////////////////
- 1309 |
- 1310 | //apply energy conservation
- 1311 |
- 1312 | #ifdef USE_VERTEX_LIGHTING
- 1313 |
- 1314 | vec3 specular_light = specular_light_interp.rgb;
- 1315 | vec3 diffuse_light = diffuse_light_interp.rgb;
- 1316 | #else
- 1317 |
- 1318 | vec3 specular_light = vec3(0.0, 0.0, 0.0);
- 1319 | vec3 diffuse_light = vec3(0.0, 0.0, 0.0);
- 1320 |
- 1321 | #endif
- 1322 |
- 1323 | vec3 ambient_light;
- 1324 | vec3 env_reflection_light = vec3(0.0, 0.0, 0.0);
- 1325 |
- 1326 | vec3 eye_vec = view;
- 1327 |
- 1328 | // IBL precalculations
- 1329 | float ndotv = clamp(dot(normal, eye_vec), 0.0, 1.0);
- 1330 | vec3 f0 = F0(metallic, specular, albedo);
- 1331 | vec3 F = f0 + (max(vec3(1.0 - roughness), f0) - f0) * pow(1.0 - ndotv, 5.0);
- 1332 |
- 1333 | #ifdef USE_RADIANCE_MAP
- 1334 |
- 1335 | #ifdef AMBIENT_LIGHT_DISABLED
- 1336 | ambient_light = vec3(0.0, 0.0, 0.0);
- 1337 | #else
- 1338 | {
- 1339 | { //read radiance from dual paraboloid
- 1340 |
- 1341 | vec3 ref_vec = reflect(-eye_vec, normal);
- 1342 | float horizon = min(1.0 + dot(ref_vec, normal), 1.0);
- 1343 | ref_
- vec = normalize((radiance_inverse_xform * vec4(ref_vec, 0.0)).xyz);
- 1344 | vec3 radiance = textureDualParaboloid(radiance_map, ref_vec, roughness) * bg_energy;
- 1345 | env_reflection_light = radiance;
- 1346 | env_reflection_light *= horizon * horizon;
- 1347 | }
- 1348 | }
- 1349 | #ifndef USE_LIGHTMAP
- 1350 | {
- 1351 | vec3 norm = normal;
- 1352 | norm = normalize((radiance_inverse_xform * vec4(norm, 0.0)).xyz);
- 1353 | norm.xy /= 1.0 + abs(norm.z);
- 1354 | norm.xy = norm.xy * vec2(0.5, 0.25) + vec2(0.5, 0.25);
- 1355 | if (norm.z > 0.0001) {
- 1356 | norm.y = 0.5 - norm.y + 0.5;
- 1357 | }
- 1358 |
- 1359 | vec3 env_ambient = texture(irradiance_map, norm.xy).rgb * bg_energy;
- 1360 | env_ambient *= 1.0 - F;
- 1361 |
- 1362 | ambient_light = mix(ambient_light_color.rgb, env_ambient, radiance_ambient_contribution);
- 1363 | }
- 1364 | #endif
- 1365 | #endif //AMBIENT_LIGHT_DISABLED
- 1366 |
- 1367 | #else
- 1368 |
- 1369 | #ifdef AMBIENT_LIGHT_DISABLED
- 1370 | ambient_light = vec3(0.0, 0.0, 0.0);
- 1371 | #else
- 1372 | ambient_light = ambient_light_color.rgb;
- 1373 | env_reflection_light = bg_color.rgb * bg_energy;
- 1374 | #endif //AMBIENT_LIGHT_DISABLED
- 1375 |
- 1376 | #endif
- 1377 |
- 1378 | ambient_light *= ambient_energy;
- 1379 |
- 1380 | float specular_blob_intensity = 1.0;
- 1381 |
- 1382 | #if defined(SPECULAR_TOON)
- 1383 | specular_blob_intensity *= specular * 2.0;
- 1384 | #endif
- 1385 |
- 1386 | #ifdef USE_GI_PROBES
- 1387 | gi_probes_compute(vertex, normal, roughness, env_reflection_light, ambient_light);
- 1388 |
- 1389 | #endif
- 1390 |
- 1391 | #ifdef USE_LIGHTMAP
- 1392 | #ifdef USE_LIGHTMAP_LAYERED
- 1393 | ambient_light = LIGHTMAP_TEXTURE_LAYERED_SAMPLE(lightmap, vec3(uv2, float(lightmap_layer))).rgb * lightmap_energy;
- 1394 | #else
- 1395 | ambient_light = LIGHTMAP_TEXTURE_SAMPLE(lightmap, uv2).rgb * lightmap_energy;
- 1396 | #endif
- 1397 | #endif
- 1398 |
- 1399 | #ifdef USE_LIGHTMAP_CAPTURE
- 1400 | {
- 1401 | vec3 cone_dirs[12] = vec3[](
- 1402 | vec3(0.0, 0.0, 1.0),
- 1403 | vec3(0.866025, 0.0, 0.5),
- 1404 | vec3(0.267617, 0.823639, 0.5),
- 1405 | vec3(-0.700629, 0.509037, 0.5),
- 1406 | vec3(-0.700629, -0.509037, 0.5),
- 1407 | vec3(0.267617, -0.823639, 0.5),
- 1408 | vec3(0.0, 0.0, -1.0),
- 1409 | vec3(0.866025, 0.0, -0.5),
- 1410 | vec3(0.267617, 0.823639, -0.5),
- 1411 | vec3(-0.700629, 0.509037, -0.5),
- 1412 | vec3(-0.700629, -0.509037, -0.5),
- 1413 | vec3(0.267617, -0.823639, -0.5));
- 1414 |
- 1415 | vec3 local_normal = normalize(camera_matrix * vec4(normal, 0.0)).xyz;
- 1416 | vec4 captured = vec4(0.0);
- 1417 | float sum = 0.0;
- 1418 | for (int i = 0; i < 12; i++) {
- 1419 | float amount = max(0.0, dot(local_normal, cone_dirs[i])); //not correct, but creates a nice wrap around effect
- 1420 | captured += lightmap_captures[i] * amount;
- 1421 | sum += amount;
- 1422 | }
- 1423 |
- 1424 | captured /= sum;
- 1425 |
- 1426 | // Alpha channel is used to indicate if dynamic objects keep the environment lighting
- 1427 | if (lightmap_captures[0].a > 0.5) {
- 1428 | ambient_light += captured.rgb;
- 1429 | } else {
- 1430 | ambient_light = captured.rgb;
- 1431 | }
- 1432 | }
- 1433 | #endif
- 1434 |
- 1435 | #ifdef USE_FORWARD_LIGHTING
- 1436 |
- 1437 | highp vec4 reflection_accum = vec4(0.0, 0.0, 0.0, 0.0);
- 1438 | highp vec4 ambient_accum = vec4(0.0, 0.0, 0.0, 0.0);
- 1439 | for (int i = 0; i < reflection_count; i++) {
- 1440 | reflection_process(reflection_indices[i], vertex, normal, binormal, tangent, roughness, anisotropy, ambient_light, env_reflection_light, reflection_accum, ambient_accum);
- 1441 | }
- 1442 |
- 1443 | if (reflection_accum.a > 0.0) {
- 1444 | specular_light += reflection_accum.rgb / reflection_accum.a;
- 1445 | } else {
- 1446 | specular_light += env_reflection_light;
- 1447 | }
- 1448 | #if !defined(USE_LIGHTMAP) && !defined(USE_LIGHTMAP_CAPTURE)
- 1449 | if (ambient_accum.a > 0.0) {
- 1450 | ambient_light = ambient_accum.rgb / ambient_accum.a;
- 1451 | }
- 1452 | #endif
- 1453 | #endif
- 1454 |
- 1455 | {
- 1456 | #if defined(DIFFUSE_TOON)
- 1457 | //simplify for toon, as
- 1458 | specular_light *= specula
- r * metallic * albedo * 2.0;
- 1459 | #else
- 1460 |
- 1461 | // scales the specular reflections, needs to be be computed before lighting happens,
- 1462 | // but after environment, GI, and reflection probes are added
- 1463 | // Environment brdf approximation (Lazarov 2013)
- 1464 | // see https://www.unrealengine.com/en-US/blog/physically-based-shading-on-mobile
- 1465 | const vec4 c0 = vec4(-1.0, -0.0275, -0.572, 0.022);
- 1466 | const vec4 c1 = vec4(1.0, 0.0425, 1.04, -0.04);
- 1467 | vec4 r = roughness * c0 + c1;
- 1468 | float a004 = min(r.x * r.x, exp2(-9.28 * ndotv)) * r.x + r.y;
- 1469 | vec2 env = vec2(-1.04, 1.04) * a004 + r.zw;
- 1470 | specular_light *= env.x * F + env.y;
- 1471 | #endif
- 1472 | }
- 1473 |
- 1474 | #if defined(USE_LIGHT_DIRECTIONAL)
- 1475 |
- 1476 | vec3 light_attenuation = vec3(1.0);
- 1477 |
- 1478 | float depth_z = -vertex.z;
- 1479 | #ifdef LIGHT_DIRECTIONAL_SHADOW
- 1480 | #if !defined(SHADOWS_DISABLED)
- 1481 |
- 1482 | #ifdef LIGHT_USE_PSSM4
- 1483 | if (depth_z < shadow_split_offsets.w) {
- 1484 | #elif defined(LIGHT_USE_PSSM2)
- 1485 | if (depth_z < shadow_split_offsets.y) {
- 1486 | #else
- 1487 | if (depth_z < shadow_split_offsets.x) {
- 1488 | #endif //LIGHT_USE_PSSM4
- 1489 |
- 1490 | vec3 pssm_coord;
- 1491 | float pssm_fade = 0.0;
- 1492 |
- 1493 | #ifdef LIGHT_USE_PSSM_BLEND
- 1494 | float pssm_blend;
- 1495 | vec3 pssm_coord2;
- 1496 | bool use_blend = true;
- 1497 | #endif
- 1498 |
- 1499 | #ifdef LIGHT_USE_PSSM4
- 1500 |
- 1501 | if (depth_z < shadow_split_offsets.y) {
- 1502 | if (depth_z < shadow_split_offsets.x) {
- 1503 | highp vec4 splane = (shadow_matrix1 * vec4(vertex, 1.0));
- 1504 | pssm_coord = splane.xyz / splane.w;
- 1505 |
- 1506 | #if defined(LIGHT_USE_PSSM_BLEND)
- 1507 |
- 1508 | splane = (shadow_matrix2 * vec4(vertex, 1.0));
- 1509 | pssm_coord2 = splane.xyz / splane.w;
- 1510 | pssm_blend = smoothstep(0.0, shadow_split_offsets.x, depth_z);
- 1511 | #endif
- 1512 |
- 1513 | } else {
- 1514 | highp vec4 splane = (shadow_matrix2 * vec4(vertex, 1.0));
- 1515 | pssm_coord = splane.xyz / splane.w;
- 1516 |
- 1517 | #if defined(LIGHT_USE_PSSM_BLEND)
- 1518 | splane = (shadow_matrix3 * vec4(vertex, 1.0));
- 1519 | pssm_coord2 = splane.xyz / splane.w;
- 1520 | pssm_blend = smoothstep(shadow_split_offsets.x, shadow_split_offsets.y, depth_z);
- 1521 | #endif
- 1522 | }
- 1523 | } else {
- 1524 | if (depth_z < shadow_split_offsets.z) {
- 1525 | highp vec4 splane = (shadow_matrix3 * vec4(vertex, 1.0));
- 1526 | pssm_coord = splane.xyz / splane.w;
- 1527 |
- 1528 | #if defined(LIGHT_USE_PSSM_BLEND)
- 1529 | splane = (shadow_matrix4 * vec4(vertex, 1.0));
- 1530 | pssm_coord2 = splane.xyz / splane.w;
- 1531 | pssm_blend = smoothstep(shadow_split_offsets.y, shadow_split_offsets.z, depth_z);
- 1532 | #endif
- 1533 |
- 1534 | } else {
- 1535 | highp vec4 splane = (shadow_matrix4 * vec4(vertex, 1.0));
- 1536 | pssm_coord = splane.xyz / splane.w;
- 1537 | pssm_fade = smoothstep(shadow_split_offsets.z, shadow_split_offsets.w, depth_z);
- 1538 |
- 1539 | #if defined(LIGHT_USE_PSSM_BLEND)
- 1540 | use_blend = false;
- 1541 |
- 1542 | #endif
- 1543 | }
- 1544 | }
- 1545 |
- 1546 | #endif //LIGHT_USE_PSSM4
- 1547 |
- 1548 | #ifdef LIGHT_USE_PSSM2
- 1549 |
- 1550 | if (depth_z < shadow_split_offsets.x) {
- 1551 | highp vec4 splane = (shadow_matrix1 * vec4(vertex, 1.0));
- 1552 | pssm_coord = splane.xyz / splane.w;
- 1553 |
- 1554 | #if defined(LIGHT_USE_PSSM_BLEND)
- 1555 |
- 1556 | splane = (shadow_matrix2 * vec4(vertex, 1.0));
- 1557 | pssm_coord2 = splane.xyz / splane.w;
- 1558 | pssm_blend = smoothstep(0.0, shadow_split_offsets.x, depth_z);
- 1559 | #endif
- 1560 |
- 1561 | } else {
- 1562 | highp vec4 splane = (shadow_matrix2 * vec4(vertex, 1.0));
- 1563 | pssm_coord = splane.xyz / splane.w;
- 1564 | pssm_fade = smoothstep(shadow_split_offsets.x, shadow_split_offsets.y, depth_z);
- 1565 | #if defined(LIGHT_USE_PSSM_BLEND)
- 1566 | use_blend = false;
- 1567 |
- 1568 | #endif
- 1569 | }
- 1570 |
- 1571 | #endif //LIGHT_USE_PSSM2
- 1572 |
- 1573 | #if !defined(LIGHT_USE_PSSM4) && !defined(LIGHT_USE_PSSM2)
- 1574 |
- { //regular orthogonal
- 1575 | highp vec4 splane = (shadow_matrix1 * vec4(vertex, 1.0));
- 1576 | pssm_coord = splane.xyz / splane.w;
- 1577 | }
- 1578 | #endif
- 1579 |
- 1580 | //one one sample
- 1581 |
- 1582 | float shadow = sample_shadow(directional_shadow, directional_shadow_pixel_size, pssm_coord.xy, pssm_coord.z, light_clamp);
- 1583 |
- 1584 | #if defined(LIGHT_USE_PSSM_BLEND)
- 1585 |
- 1586 | if (use_blend) {
- 1587 | shadow = mix(shadow, sample_shadow(directional_shadow, directional_shadow_pixel_size, pssm_coord2.xy, pssm_coord2.z, light_clamp), pssm_blend);
- 1588 | }
- 1589 | #endif
- 1590 |
- 1591 | #ifdef USE_CONTACT_SHADOWS
- 1592 | if (shadow > 0.01 && shadow_color_contact.a > 0.0) {
- 1593 | float contact_shadow = contact_shadow_compute(vertex, -light_direction_attenuation.xyz, shadow_color_contact.a);
- 1594 | shadow = min(shadow, contact_shadow);
- 1595 | }
- 1596 | #endif
- 1597 | light_attenuation = mix(mix(shadow_color_contact.rgb, vec3(1.0), shadow), vec3(1.0), pssm_fade);
- 1598 | }
- 1599 |
- 1600 | #endif // !defined(SHADOWS_DISABLED)
- 1601 | #endif //LIGHT_DIRECTIONAL_SHADOW
- 1602 |
- 1603 | #ifdef USE_VERTEX_LIGHTING
- 1604 | diffuse_light *= mix(vec3(1.0), light_attenuation, diffuse_light_interp.a);
- 1605 | specular_light *= mix(vec3(1.0), light_attenuation, specular_light_interp.a);
- 1606 |
- 1607 | #else
- 1608 | light_compute(normal, -light_direction_attenuation.xyz, eye_vec, binormal, tangent, light_color_energy.rgb, light_attenuation, albedo, transmission, light_params.z * specular_blob_intensity, roughness, metallic, specular, rim, rim_tint, clearcoat, clearcoat_gloss, anisotropy, diffuse_light, specular_light, alpha);
- 1609 | #endif
- 1610 |
- 1611 | #endif //#USE_LIGHT_DIRECTIONAL
- 1612 |
- 1613 | #ifdef USE_VERTEX_LIGHTING
- 1614 | diffuse_light *= albedo;
- 1615 | #endif
- 1616 |
- 1617 | #ifdef USE_FORWARD_LIGHTING
- 1618 |
- 1619 | #ifndef USE_VERTEX_LIGHTING
- 1620 |
- 1621 | for (int i = 0; i < omni_light_count; i++) {
- 1622 | light_process_omni(omni_light_indices[i], vertex, eye_vec, normal, binormal, tangent, albedo, transmission, roughness, metallic, specular, rim, rim_tint, clearcoat, clearcoat_gloss, anisotropy, specular_blob_intensity, diffuse_light, specular_light, alpha);
- 1623 | }
- 1624 |
- 1625 | for (int i = 0; i < spot_light_count; i++) {
- 1626 | light_process_spot(spot_light_indices[i], vertex, eye_vec, normal, binormal, tangent, albedo, transmission, roughness, metallic, specular, rim, rim_tint, clearcoat, clearcoat_gloss, anisotropy, specular_blob_intensity, diffuse_light, specular_light, alpha);
- 1627 | }
- 1628 |
- 1629 | #endif //USE_VERTEX_LIGHTING
- 1630 |
- 1631 | #endif
- 1632 |
- 1633 | #ifdef USE_SHADOW_TO_OPACITY
- 1634 | alpha = min(alpha, clamp(length(ambient_light), 0.0, 1.0));
- 1635 |
- 1636 | #if defined(ALPHA_SCISSOR_USED)
- 1637 | if (alpha < alpha_scissor) {
- 1638 | discard;
- 1639 | }
- 1640 | #endif // ALPHA_SCISSOR_USED
- 1641 |
- 1642 | #ifdef USE_OPAQUE_PREPASS
- 1643 |
- 1644 | if (alpha < opaque_prepass_threshold) {
- 1645 | discard;
- 1646 | }
- 1647 |
- 1648 | #endif // USE_OPAQUE_PREPASS
- 1649 |
- 1650 | #endif // USE_SHADOW_TO_OPACITY
- 1651 |
- 1652 | #ifdef RENDER_DEPTH
- 1653 | //nothing happens, so a tree-ssa optimizer will result in no fragment shader :)
- 1654 | #else
- 1655 |
- 1656 | specular_light *= reflection_multiplier;
- 1657 | ambient_light *= albedo; //ambient must be multiplied by albedo at the end
- 1658 |
- 1659 | #if defined(ENABLE_AO)
- 1660 | ambient_light *= ao;
- 1661 | ao_light_affect = mix(1.0, ao, ao_light_affect);
- 1662 | specular_light *= ao_light_affect;
- 1663 | diffuse_light *= ao_light_affect;
- 1664 | #endif
- 1665 |
- 1666 | // base color remapping
- 1667 | diffuse_light *= 1.0 - metallic; // TODO: avoid all diffuse and ambient light calculations when metallic == 1 up to this point
- 1668 | ambient_light *= 1.0 - metallic;
- 1669 |
- 1670 | if (fog_color_enabled.a > 0.5) {
- 1671 | float fog_amount = 0.0;
- 1672 |
- 1673 | #ifdef USE_LIGHT_DIRECTIONAL
- 1674 |
- 1675 | vec3 fog_color = mix(fog_color_enabled.rgb, fog_sun_color_amount.rgb, fog_sun_color_amount.a * pow(max(dot(normalize(v
- ertex), -light_direction_attenuation.xyz), 0.0), 8.0));
- 1676 | #else
- 1677 |
- 1678 | vec3 fog_color = fog_color_enabled.rgb;
- 1679 | #endif
- 1680 |
- 1681 | //apply fog
- 1682 |
- 1683 | if (fog_depth_enabled) {
- 1684 | float fog_far = fog_depth_end > 0.0 ? fog_depth_end : z_far;
- 1685 |
- 1686 | float fog_z = smoothstep(fog_depth_begin, fog_far, length(vertex));
- 1687 |
- 1688 | fog_amount = pow(fog_z, fog_depth_curve) * fog_density;
- 1689 | if (fog_transmit_enabled) {
- 1690 | vec3 total_light = emission + ambient_light + specular_light + diffuse_light;
- 1691 | float transmit = pow(fog_z, fog_transmit_curve);
- 1692 | fog_color = mix(max(total_light, fog_color), fog_color, transmit);
- 1693 | }
- 1694 | }
- 1695 |
- 1696 | if (fog_height_enabled) {
- 1697 | float y = (camera_matrix * vec4(vertex, 1.0)).y;
- 1698 | fog_amount = max(fog_amount, pow(smoothstep(fog_height_min, fog_height_max, y), fog_height_curve));
- 1699 | }
- 1700 |
- 1701 | float rev_amount = 1.0 - fog_amount;
- 1702 |
- 1703 | emission = emission * rev_amount + fog_color * fog_amount;
- 1704 | ambient_light *= rev_amount;
- 1705 | specular_light *= rev_amount;
- 1706 | diffuse_light *= rev_amount;
- 1707 | }
- 1708 |
- 1709 | #ifdef USE_MULTIPLE_RENDER_TARGETS
- 1710 |
- 1711 | #ifdef SHADELESS
- 1712 | diffuse_buffer = vec4(albedo.rgb, 0.0);
- 1713 | specular_buffer = vec4(0.0);
- 1714 |
- 1715 | #else
- 1716 |
- 1717 | //approximate ambient scale for SSAO, since we will lack full ambient
- 1718 | float max_emission = max(emission.r, max(emission.g, emission.b));
- 1719 | float max_ambient = max(ambient_light.r, max(ambient_light.g, ambient_light.b));
- 1720 | float max_diffuse = max(diffuse_light.r, max(diffuse_light.g, diffuse_light.b));
- 1721 | float total_ambient = max_ambient + max_diffuse;
- 1722 | #ifdef USE_FORWARD_LIGHTING
- 1723 | total_ambient += max_emission;
- 1724 | #endif
- 1725 | float ambient_scale = (total_ambient > 0.0) ? (max_ambient + ambient_occlusion_affect_light * max_diffuse) / total_ambient : 0.0;
- 1726 |
- 1727 | #if defined(ENABLE_AO)
- 1728 | ambient_scale = mix(0.0, ambient_scale, ambient_occlusion_affect_ao_channel);
- 1729 | #endif
- 1730 | diffuse_buffer = vec4(diffuse_light + ambient_light, ambient_scale);
- 1731 | specular_buffer = vec4(specular_light, metallic);
- 1732 |
- 1733 | #ifdef USE_FORWARD_LIGHTING
- 1734 | diffuse_buffer.rgb += emission;
- 1735 | #endif
- 1736 | #endif //SHADELESS
- 1737 |
- 1738 | normal_mr_buffer = vec4(normalize(normal) * 0.5 + 0.5, roughness);
- 1739 |
- 1740 | #if defined(ENABLE_SSS)
- 1741 | sss_buffer = sss_strength;
- 1742 | #endif
- 1743 |
- 1744 | #else //USE_MULTIPLE_RENDER_TARGETS
- 1745 |
- 1746 | #ifdef SHADELESS
- 1747 | frag_color = vec4(albedo, alpha);
- 1748 | #else
- 1749 | frag_color = vec4(ambient_light + diffuse_light + specular_light, alpha);
- 1750 | #ifdef USE_FORWARD_LIGHTING
- 1751 | frag_color.rgb += emission;
- 1752 | #endif
- 1753 | #endif //SHADELESS
- 1754 |
- 1755 | #endif //USE_MULTIPLE_RENDER_TARGETS
- 1756 |
- 1757 | #endif //RENDER_DEPTH
- 1758 | }
- 1759 |
- Placing organelle 'cytoplasm' at: 0, -1
- Placing organelle 'cytoplasm' at: 0, -1
- Placing organelle 'cytoplasm' at: 0, -2
- Placing organelle 'cytoplasm' at: 1, -3
- Placing organelle 'cytoplasm' at: 1, -4
- MicrobeEditor: applying changes to edited Species
- MicrobeEditorReportComponent: applying changes of component
- MicrobeEditorPatchMap: applying changes of component
- CellEditorComponent: applying changes of component
- Edited species name is now Primum Thrivium
- MicrobeEditor: updated organelles for species: Primum Thrivium
- Applying patch (Karronon Volcanic Vent) settings
- Number of clouds in this patch = 8
- oxygen spawn density is 0. It won't spawn
- carbondioxide spawn density is 0. It won't spawn
- nitrogen spawn density is 0. It won't spawn
- sunlight spawn density is 0. It won't spawn
- Number of chunks in this patch = 4
- MARINE_SNOW spawn density is 0. It won't spawn
- Number of species in this patch = 2
- Jukebox now playing from: MicrobeStage
- Jukebox: starting track: res://assets/sounds/microbe-theme-4.ogg position: 0
- Jukebox: starting track: res://assets/sounds/soundeffects
- /microbe-ambience2.ogg position: 0
- Creating a save with name: auto_save_2.thrivesave
- save finished, success: True message: Saving succeeded elapsed: 00:00:02.1639661
- Jukebox: starting track: res://assets/sounds/microbe-theme-1.ogg position: 20.30585
- Jukebox: starting track: res://assets/sounds/soundeffects/microbe-ambience-3.ogg position: 4.762667
- get_uniform (drivers/gles3/shader_gles3.h:362) ERROR: Condition "!version" is true. Returned: -1 at: _get_uniform (drivers/gles3/shader_gles3.h:362) ERROR: Condition "!version" is true. Returned: -1 at: _get_uniform (drivers/gles3/shader_gles3.h:362) ERROR: Condition "!version" is true. Returned: -1 at: _get_uniform (drivers/gles3/shader_gles3.h:362) ERROR: Condition "!version" is true. Returned: -1 at: _get_uniform (drivers/gles3/shader_gles3.h:362) ERROR: SceneShaderGLES3: Program LINK FAILED: Fragment shader(s) failed to link, Vertex shader(s) linked. Fragment Shader not supported by HWWARNING: warning(#276) Symbol 'position_interp' usage doesn't match between two stages at: _display_error_with_code (drivers/gles3/shader_gles3.cpp:156) ERROR: SceneShaderGLES3: Program LINK FAILED: Fragment shader(s) failed to link, Vertex shader(s) linked. Fragment Shader not supported by HWWARNING: warning(#276) Symbol 'position_interp' usage doesn't match between two stages at: get_current_version (drivers/gles3/shader_gles3.cpp:478) ERROR: Method failed. Returning: nullptr at: get_current_version (drivers/gles3/shader_gles3.cpp:485) ERROR: Condition "!version" is true. Returned: false at: bind (drivers/gles3/shader_gles3.cpp:118) ERROR: Condition "!version" is true. Returned: -1 at: _get_uniform (drivers/gles3/shader_gles3.h:362) ERROR: Condition "!version" is true. Returned: -1 at: _get_uniform (drivers/gles3/shader_gles3.h:362) ERROR: Condition "!version" is true. Returned: -1 at: _get_uniform (drivers/gles3/shader_gles3.h:362) ERROR: Condition "!version" is true. Returned: -1 at: _get_uniform (drivers/gles3/shader_gles3.h:362) ERROR: Condition "!version" is true. Returned: -1 at: _get_uniform (drivers/gles3/shader_gles3.h:362) ERROR: SceneShaderGLES3: Program LINK FAILED: Fragment shader(s) failed to link, Vertex shader(s) linked. Fragment Shader not supported by HWWARNING: warning(#276) Symbol 'position_interp' usage doesn't match between two stages at: _display_error_with_code (drivers/gles3/shader_gles3.cpp:156) ERROR: SceneShaderGLES3: Program LINK FAILED: Fragment shader(s) failed to link, Vertex shader(s) linked. Fragment Shader not supported by HWWARNING: warning(#276) Symbol 'position_interp' usage doesn't match between two stages at: get_current_version (drivers/gles3/shader_gles3.cpp:478) ERROR: Method failed. Returning: nullptr at: get_current_version (drivers/gles3/shader_gles3.cpp:485) ERROR: Condition "!version" is true. Returned: false at: bind (drivers/gles3/shader_gles3.cpp:118) ERROR: Condition "!version" is true. Returned: -1 at: _get_uniform (drivers/gles3/shader_gles3.h:362) ERROR: Condition "!version" is true. Returned: -1 at: _get_uniform (drivers/gles3/shader_gles3.h:362) ERROR: Condition "!version" is true. Returned: -1 at: _get_uniform (drivers/gles3/shader_gles3.h:362) ERROR: Condition "!version" is true. Returned: -1 at: _get_uniform (drivers/gles3/shader_gles3.h:362) ERROR: Condition "!version" is true. Returned: -1 at: _get_uniform (drivers/gles3/shader_gles3.h:362)
- child process exited with code 0
- Thrive has exited normally (exit code 0)
Advertisement
Add Comment
Please, Sign In to add comment