Volumetric Lighting, New UI & More!

major update

Portal 2: Community Edition · build 22394218 · published

On SteamNotes only · this build shipped before we watched the app

It's been a little while. Let's discuss what we've been up to, and what's next for Portal 2: Community Edition.

Volumetric Lighting

To begin, as of today, all dynamic lights in the engine have been upgraded with the abiliy to produce real-time Volumetric Lighting effects within the game world.

Our new Volumetric Lighting simulates aspects of light scattering through the environment, colliding with all the little particles and dust which float around our atmosphere.

To see Volumetric Lighting in action in an enhanced version of Portal 2's Core Transfer sequence, see the video below:

There are multiple styles of Volumetric Lighting available to be used by level designers! Let's get into them now...

Volumetric Spot-Lights:

Cast from light_rt_spot entities, this is likely to be the most common form of Volumetric Lighting which will be present in our community's levels.

Similar to a lighting setup you'd see on a stage, or with the old point_spotlight entity in-game, this style creates light within a cone, producing a 'frustum' of fog which raidiates outwards based on the light's field of view.

These can often be used to direct the player to various places, or simply just to look cool in maps.

(Dustmotes are not included with Volumetric Lighting by default. They have been added here to enhance the effect, and can be added to maps using the func_dustmotes brush entity: https://developer.valvesoftware.com/wiki/Func_dustmotes)

Volumetric Point-Lights:

Produced by light_rt entities, this is more akin to the style of fog you'd see created by a light bulb within a dusty old house.

These can be used to add special visual-flare to specific areas within levels.

(Reflection Cube lighting will be available via the 'Reflection Cube Lights' local addon in-game in a future update - Volumetric Lighting exaggerated for explanatory purposes.)

(Hard-Light Bridge lighting is available via the 'Dynamic Light Bridge Lights' local addon in-game.)

Volumetric Sun-Shafts:

These can be cast from light_environment entities within levels, provided they make use of CSM (Cascaded Shadowmaps - env_casecade_light entity).

They have the ability to make sunlit, outdoor environments look especially stunning.

NOTE: These don't currently create Volumetric Density on their own, and require already-existing fog to be present. This is planned to change in a future update.

(Scene created for explanatory purposes, not present within Portal 2's campaign.)

'But what if I want Volumetric Lighting, without being tied to lights?'

Inspired by Source 2, our all-new obb_volumefog entity allow you to do just that! With this entity, you have the ability to define a bounding-box you'd like fog to be created in, no specific light entities required.

You can have the fog fill up the whole cuboidal area, or appear in a more spherical fashion.

All dynamic lights in the engine will interact with the fog and colour/illuminate it realistically, regardless of if they themselves have Volumetric Lighting enabled or not.

NOTE: This entity is still a W.I.P and is subject to change at any time.

Further, this entity also accepts 3D textures to define its shape!

...Okay, but what is the performance like?

Having fancy new lighting effects is great and all, but why should we bother adding them if you need a supercomputer to run them?

Fortunately, from our testing we have observed little-to-no performance drop when using Volumetric Lighting compared to standard lighting with Clustered.

Overall then...

Volumetric Lighting has been our most requested feature ever, especially since we added Clustered Lighting to Strata Source back in May last year.

Volumetric Lighting is available to play with NOW on the steam branch 'volumetrics'!

We really hope you enjoy creating, or playing, community levels with it!

NOTE: Volumetric Lighting as a whole is still in an early stage, and is subject to change a lot in the short term.


But wait, there's more...

All-New UI & Campaign System

Our Panorama UI overhaul is almost complete, and with it comes a campaign system designed to make playing Workshop content as simple as possible.

NOTE: The new UI and campaign system still a W.I.P, any issues currently present in the screenshots below will be addressed in due course.

Main-Menu:

This is the central hub for Portal 2: Community Edition. From here, you can access various campaigns, manage mounted addons and adjust settings.

The main-menu background randomly rotates from a set of curated images created by the community, this one was provided to us by Discord user: @mika.tastrophe (Thanks!)

Campaigns:

On the topic of campaigns, here is where you can choose what campaign you would like to play!

Subscribing to any campaign uploaded on the workshop automatically adds it to this list! And entering it will automatically mount any of it's required addons as well. (No more forgetting to mount required content!)

Campaign Sub-Menu:

Each campaign is provided with it's own mini main-menu which can be customised! Creators can provide various different assets to suit their campaign!

The campaign shown below is "Portal: System Failure - Alpha Preview", and can be found on the P2:CE workshop here:

'So, how do I make my own campaigns?'

Making your own campaign, like shown above, is very simple!

Whilst we won't be going into the full details here, check out our Wiki page on making full use of the system here: https://wiki.stratasource.org/modding/p2ce-campaigns

The new UI and campaign system can be played with in both the all-new 'volumetrics' branch, and the default branch, now!


But wait! There's even more...

Updated Weighted Storage Cubes

Weighted Storage Cubes have been given a large update to make them much more useful for mappers and modders alike.

Cube Types:

Previously, the prop_weighted_cube entity contained a set of predefined cube 'Types', which could be selected by the mapper. These included: Standard, Companion, Reflection, etc.

Now, all cube types have now been split into 'Model', 'Behaviour' and 'Shape'!

This provides the mapper with much more flexibility, allowing you to create... strange concoctions such as a Companion Reflection Cube, or a Schrödinger Sphere, if you're into that...

'Shape' and 'Model' can also have custom values provided!

See below for a list of 'Models', 'Behaviours' and 'Shapes!

Models:

  • Weighted Storage Cube

  • Weighted Storage Cube (Rusty)

  • Weighted Companion Cube

  • Discouragement Redirection Cube

  • Discouragement Redirection Cube (Rusty)

  • Edgeless Safety Cube

  • Antique Cube

  • Schrödinger's Cube

  • Schrödinger's Cube (Rusty)

Behaviours:

  • Auto (Chosen based on selected 'Model')

  • Standard

  • Reflection

  • Schrödinger

Shapes:

  • Auto (Chosen based on selected 'Model')

  • Cubic

  • Spherical

Internally, each model now has a consistent layout of skins, corresponding to if they are on/off a button, and if they are painted/unpainted (with any type of gel).

On the topic of gel...

Gel-Covered Cubes:

As a result of the skin reorganisation for cube models, all cubes now have the ability to be dynamically tinted and covered by paint!

This allows all paint types to be visible on all cube models, and it even matches your own configured paint colours!

Cubes can now also be painted with conversion gel! Whilst this remains disabled by default for consistency with vanilla Portal 2, it can be enabled within the info_portal_gamerules entity.

Additional Notes:

These new cube changes do not apply to old maps! Only new maps, which will use the new functionality.

Further, we are working on a new 'color vars' feature! This will allow you to tell Static Props and Overlays to use a special identifying name, and then the game can provide a tint to override any props/overlays with that identifer. This can allow for creating gel pipes and paint splatters which match the player's configured paint colours, as an example. This feature is not quite ready yet, however it will be available in a future update.

Finally, for any VScripters, the old GetCubeType() method has been removed, and replaced with GetCubeBehavior() and GetCubeShape() methods instead. Any scripts using the old method must be updated in order to continue functioning correctly.


The future of Portal 2: Community Edition...

With all these new additions to Portal 2: Community Edition over the past year, you are probably wondering what the release of this mod will look like.

The Portal 2: Community Edition Open Beta will begin in ~2 months time, exact date TBD.

When that happens, you will no longer be required to apply through https://p2ce.org/beta, and will be able to simply download P2:CE off Steam, like any other mod - all going well.

(As a reminder, ownership of vanilla Portal 2 is required).

Please note that is this an open beta, not a final v1.0 release. As such, there will be bugs and issues, but we're working hard to ensure everything will go as smoothly as possible.

We'd like to thank you for sticking with us after all these years. It is extremely exciting for us to finally be getting this project out the door and in the hands of the general public, and we cannot wait to see what you'll do with P2:CE.

Please join our Discord server to keep up with any future updates: https://p2ce.org/discord

Thanks, and have fun!

- The P2:CE Team

(See below for the full changelog...)

Additions: (17)

  • Added a whole new UI and the Campaign System

  • Added 360 video export to 'startmovie'

  • Added a 'sound' KV to 'env_spark' to change the spark sound

  • Added ability to configure the filter used for floor buttons

  • Added Controller LED coloring by last shot portal (stolen from Portal 2)

  • Added ConVar 'cl_portal_use_old_fizzle_effects' for using old Portal 1 style portal fizzle effects

  • Added '-debug_dynamic_mounts' to debug Steam dynamic mounts

  • Added enabled field to particle operators to toggle operator on/off

  • Added new customization option to show Conversion Gel on cubes. This is also available as an 'info_portal_gamerules' keyvalue for mapmakers

  • Added 'OnFizzled' output to 'prop_portal'

  • Added 'OnPressedCube' / 'OnPressedPlayer' to floor buttons

  • Added 'player_weapons_removed' & 'player_equipped' game events

  • Added 'sv_force_upgrade_weighted_cube' ConVar, to force the new models, allowing always seeing paint at the cost of backwards compatibility. This is intended for situations like default levels that are known not to check for specific models

  • Added texture flag to fully ignore 'mat_picmip' (NOLOD only ignores 'mat_picmip' when ConVar is positive) at 2^18

  • All paintable props now have 'OnPainted' and 'OnUnpainted' outputs

  • Floor buttons will now use the second hitbox set, if present to configure the trigger bounds

  • 'prop_monster_box' now has gel overlays like regular cubes. It also has a new keyvalue to determine whether it should use the partially broken paint behaviour like in base Portal 2, or behave the same as regular cubes

  • 'prop_physics_paintable' can specify which skins to swap to in order to use gel overlays

Fixes: (25)

  • Allowed .dat files to be included in addons

  • Fixed a crash if entity filters are evaluated on dead entities

  • Fixed a crash in some cases when cubes are pulled out of the way of a laser

  • Fixed an issue where scenes inside 'scenes.image' files would not be properly precached, which resulted in their associated audio files being unable to play

  • Fixed crash with ragdolls

  • Fixed crash with the netconsole

  • Fixed 'cvar_defaults.cfg' not properly overriding ConVars marked with FCVAR_REPLICATED

  • Fixed 'host_map_mount_order_detection' not prioritizing custom asset paths in some cases

  • Fixed issues with map name handling for 'trigger_changelevel' and 'point_changelevel'

  • Fixed local splitscreen

  • Fixed misspelled KV on 'snd_op_occlusion': 'occlusio_db_loss' is now 'occlusion_db_loss' (old KV still works though)

  • Fixed painted cubes not displaying adhesion gel skins

  • Fixed pellets produced by 'fire_energy_ball' not hurting players

  • Fixed rare crash when using 'point_template' under some circumstances

  • Fixed save screenshots containing garbage

  • Fixed saves not working properly on Linux, due to a file system bug

  • Fixed splitscreen mode not rendering correctly

  • Fixed 'sv_alternateticks' being forced off on Linux. Apparently it's even doing this in Portal 2

  • Fixed 'sv_schrodinger_emit_sound'

  • Fixed the game not responding to 'SIGINT'

  • Fixed WebM video export

  • Make 'env_global''s GetCounter input usable

  • Preserve bodygroups (frankenturret heads, etc) when fizzling objects

  • Properly clear 'env_global' counters when initially created

  • VTF textures below 'v7.5' are no longer allowed to set 'v7.5'-specific flags to guard against flags from TF2 being set

Improvements: (18)

  • Cloth no longer simulates while the game is paused by default

  • 'cl_portal_use_new_dissolve' and 'fx_new_sparks' no longer require cheats to be enabled

  • Console input autocomplete suggestions now include fuzzy matches

  • Entity filters will no longer crash if chained in an infinite loop

  • 'env_spark' entities can now override 'fx_new_sparks' to use new or old sparks

  • Exposed the following debug ConVars: 'snd_occlusion_pos_override', 'snd_occlusion_material_override', 'snd_occlusion_visualize', 'snd_occlusion_visualize_filter', 'snd_occlusion_indirect_radius', 'snd_occlusion_indirect_min', 'snd_occlusion_indirect_max', 'snd_occlusion_collide_min_distance'

  • 'fps_max_menu' is now also respected while in game with opened menu

  • High Energy Pellets will now obey damage filters on the player

  • Lightboard KeyValues definitions file no longer needs to exist for the game to boot

  • Made 'sv_gravity' affect cloth

  • Marked 'hud_fastswitch' as archive

  • Marked 'r_portal_light_intensity' as archived

  • Marked 'sv_portal_legacy_compat', 'sv_enableholdrotation', 'mv_uncrouch_on_jump', 'mv_duckjump', and 'mv_bhop' ConVars as executable by maps

  • Move rumble to Steam input

  • Removed devonly flag from 'net_fakelag'

  • Removed 'soundsystem.dll'

  • Reworked how 'prop_weighted_cube' functions. Every cube type has its own model, with identical skin layout. Cube type has been split into 'behavior' and 'shape' fields, allowing things like a spherical reflection cube. These new models dynamically tint, allowing showing all gel types as well as matching the configured colors

  • Schrödinger cubes now emit 'SchrodingerCube.Music' for music

AngelScript: (27)

  • 'util::TraceLine' can now take 'array<CBaseEntity@>' as ent to ignore

  • 'util::TraceLinePortal' can now take 'array<CBaseEntity@>' as ent to ignore

  • Added (cl|sv)_scriptsystem_dump_lsp commands to game

  • Added 'CBaseEntity::GetGroundEntity' 'CBaseEntity::IsOnGround' 'CBaseAnimating::IsOnFire'

  • Added 'EHandle<>' template type to AS

  • Added 'scriptsystem_dump' (and _json/_lsp) variant commands to Hammer

  • Added access masks to angelscript bindings. This will prevent client/server functions from being called in the wrong places

  • Added bindings for 'AngleVectors'

  • Added ConVar change callback support to scriptsystem

  • Added KV and output support for script classes

  • Added parameter names to a lot of AS functions/methods

  • Applied access masks to attributes. ServerCommand/ClientCommand are only available in their respective domains

  • Entities in AS can now be casted

  • Entity outputs now have 'Init' and 'Get' methods

  • Exposed 'CBaseEntity::KeyValues' methods to AS

  • Exposed more base entity classes to AS (only a stub for now)

  • Fixed AngelScript malformed attribute error displaying 'Entity' attribute name instead of the real name in some cases

  • Fixed AS debugger not working

  • Fixed casting in AS

  • Fixed issue where 'CommandArgs@' in custom commands had to be non-const. It now requires const

  • Fixed Scriptsystem in Hammer not being able to load any scripts

  • Refactored script loading. Each search path will now load 'sv_init.as' 'cl_init.as' and 'init.as' and define 'SERVER' and 'CLIENT' to differentiate where the modules are to be loaded

  • Scriptsystem debugger now works properly

  • Scriptsystem dumps now contain global funcdefs

  • Scriptsystem json dumps now use AS method names

  • Scriptsystem lsp dumps now doesn't duplicate methods from parent classes

  • Scriptsystem's 'string.toInt' and 'string.toUInt' can now convert numbers from any base

Graphics: (21)

  • Added '$emissiontransform' to PBR, to apply transform to the emission texture specifically

  • Added 'nearz' property to clustered light entities

  • Added 'sv_reloadmaterialsonmapload' ConVar that controls material reload behavior when loading map, can improve map load times when disabled

  • Added DoSSAO function to viewpostprocess

  • Added light cookies to 'light_rt' entities

  • Added various ConVars to control AO

  • Doubled cookie atlas size, allowing 4 times the texture data to be allocated before exhaustion

  • Fixed 'r_ssao' breaking cubemap building

  • Fixed 'SetLightScale' on clustered lights not changing the light intensity

  • Fixed cookied lights only displaying cookies when shadowed

  • Fixed crashes when using some material proxies on non-standard stuff

  • Fixed flashlight and 'env_projectedtexture' shadows being 4x larger per-dimension than their pre-clustered equivalents

  • Fixed lightmappedgeneric ssbump detail textures not working properly

  • Fixed multi-frame texture cookies only ever displaying the first frame

  • Fixed SSAO crashing game in some cases

  • Fixed sun specular not blending with lightmaps properly on PBR textures

  • Increased default clustered shadow budget from 6 to 12

  • Light cookies now correctly use the light entity orientation

  • PBR materials with manually specified '$envmap' will no longer be overridden to use 'env_cubemap'

  • Rate limited the clustered atlas allocator warning to 1 message per second

  • Replaced general clustered light modes with independent lighting component modes

Panorama: (5)

  • Added 'SettingsEnumBitField' Panorama control

  • Added 'WeaponEquipped' and 'WeaponsDropped' Panorama events

  • Fixed 'SettingsSlider' 'invert' not working correctly when the slider is set to display a percentage

  • Fixed crash with the video settings screen when an incorrect panel type is used for the setting dropdowns

  • Fixed Panorama rendertargets being invalidated when 'mat_picmip' is changed

Tools: (41)

  • 'devui_auto_scale' will now use the smallest window dimension to calculate scale factor

  • Added "Paste Special Again" context menu option in Hammer, which will use the last saved Paste Special options in the session without a prompt

  • Added '-EnvCubemapNotForcedForPBR' parameter to VBSP, for mappers that need PBR materials with handmade envmaps

  • Added '-help'/'-?' to StudioMDL

  • Added '-nowinerenderfix' to disable rerendering Hammer views on each frame in Wine

  • Added a "Use Native File Browser" option in Hammer, to allow using Qt file dialogs and vice versa

  • Added an ImGui game events debugger

  • Added an in-game cloth/softbody debugger

  • Added an in-game ImGui material inspector/rudimentary editor

  • Added ConVar 'devui_auto_scale' which, when enabled, automatically scales DevUI to match the reference resolution of 1920x1080, like Panorama

  • Added displays thickness of ropes and cables in Hammer

  • Added manual inputs to clustered light inspector

  • Added mdl2dmx, a very basic static prop decompiler

  • Added Near Z property slider to clustered light inspector

  • Added position/angle inputs to clustered light inspector

  • Added script module info DevUI panel

  • Added support for custom fonts in DevUI themes. FontScaleDpi, FontScaleMain, FontScaleBase control font size. Font property controls the actual font and is a path like 'resource/MyFont.ttf'

  • Added support for Hammer++ rectangle map hotspot definitions

  • Added vtex config flag "ignorepicmip" to control setting the IGNORE_PICMIP flag in the compiled VTF

  • Allow 'bool'/'boolean' to be interchangably for FGD IO and KV definitions

  • Displacement tools now edit continuously without needing to move mouse

  • Entity report dialog can now be sorted

  • Fixed 'devui_auto_scale' not performing any scaling

  • Fixed 'devui_auto_scale' turning text into a blurry mess below 1080p

  • Fixed a crash in Hammer when copy-pasting brushes

  • Fixed a crash when removing/changing loaded FGDs in Hammer

  • Fixed copy+paste in ImGui windows

  • Fixed ImGui looking blurry due to autoscaling

  • Fixed Paste Special entity name prefix field not retaining its value across multiple different invocations of the dialog

  • Fixed StudioMDL trying to run 'md' on Linux to create the output dir. It now runs 'mkdir -p'

  • Hammer now does not spam warning about unknown detail object types

  • Hammer prints more FGD errors when something goes wrong

  • Hammer's Discord Rich Presence no longer shares map name by default

  • Model browser getting sometimes getting stuck

  • Removed '-winecompat' from Hammer, fixes will be applied when Wine is detected automatically

  • Removed zlib and libxml2 dependencies from StudioMDL on Linux

  • Shift+F1 keybind will now toggle the DevUI menu instead of failing to open a nonexistent VGUI window

  • The '-noao' VRAD parameter now sets 'LVLFLAGS_DISABLE_BAKED_AO'

  • Updated VRAD help text

  • VRAD AO is now DISABLED by default and can be enabled by passing '-ao'. XeGTAO should be preferred for VRAD baked AO

  • When using the eyedropper tool, Hammer will prompt to name entities if they did not have one already

VScript: (8)

  • 'prop_weighted_cube' now has 'GetCubeBehavior()', 'GetCubeShape()', 'GetLaser()', 'IsEmissionLocked()', 'IsPressingButton()' and 'GetPaint()' VScript functions. 'GetCubeType()' was removed, use behavior/shape instead or a model check

  • Added 'CBasePortal::IsActive'

  • Added 'vscript_script_max_exec_time' to control max allowed script execution time. Use with caution

  • Fixed a crash in VScript when calling 'CreateEntityByName' on a non-existing class

  • Fixed rare crash from VScript while converting some values to string

  • Fixed VScript crash related to saving tables that reference themselves

  • VScript 'TraceLineEx' can now take an array of entities to ignore

  • VScript 'TracePortalLine' can now take an array of entities to ignore