diff options
author | WlodekM <[email protected]> | 2024-06-16 10:35:45 +0300 |
---|---|---|
committer | WlodekM <[email protected]> | 2024-06-16 10:35:45 +0300 |
commit | abef6da56913f1c55528103e60a50451a39628b1 (patch) | |
tree | b3c8092471ecbb73e568cd0d336efa0e7871ee8d /src/Lighting.h |
initial commit
Diffstat (limited to 'src/Lighting.h')
-rw-r--r-- | src/Lighting.h | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/src/Lighting.h b/src/Lighting.h new file mode 100644 index 0000000..0219088 --- /dev/null +++ b/src/Lighting.h @@ -0,0 +1,88 @@ +#ifndef CC_WORLDLIGHTING_H +#define CC_WORLDLIGHTING_H +#include "PackedCol.h" +/* +Abstracts lighting of blocks in the world + Built-in lighting engines: + - ClassicLighting: Uses a simple heightmap, where each block is either in sun or shadow + +Copyright 2014-2023 ClassiCube | Licensed under BSD-3 +*/ +struct IGameComponent; +extern struct IGameComponent Lighting_Component; + +enum LightingMode { + LIGHTING_MODE_CLASSIC, LIGHTING_MODE_FANCY, LIGHTING_MODE_COUNT +}; +extern const char* const LightingMode_Names[LIGHTING_MODE_COUNT]; +extern cc_uint8 Lighting_Mode; + +extern cc_bool Lighting_ModeLockedByServer; +/* True if the current lighting mode has been set by the server instead of the client */ +extern cc_bool Lighting_ModeSetByServer; +/* The lighting mode that was set by the client before being set by the server */ +extern cc_uint8 Lighting_ModeUserCached; +void Lighting_SetMode(cc_uint8 mode, cc_bool fromServer); + + +/* How much ambient occlusion to apply in fancy lighting where 1.0f = none and 0.0f = maximum*/ +#define FANCY_AO 0.5F +/* How many unique "levels" of light there are when fancy lighting is used. */ +#define FANCY_LIGHTING_LEVELS 16 +#define FANCY_LIGHTING_MAX_LEVEL (FANCY_LIGHTING_LEVELS - 1) +/* How many bits to shift lamplight level to the left when storing it in a byte along with lavalight level. */ +#define FANCY_LIGHTING_LAMP_SHIFT 4 +/* A byte that fills the lamp level area with ones. Equivalent to 0b_1111_0000 */ +#define FANCY_LIGHTING_LAMP_MASK 0xF0 + +CC_VAR extern struct _Lighting { + /* Releases/Frees the per-level lighting state */ + void (*FreeState)(void); + /* Allocates the per-level lighting state */ + /* (called after map has been fully loaded) */ + void (*AllocState)(void); + /* Quickly calculates lighting for the blocks in the region */ + /* [x, y, z] to [x + 18, y + 18, z + 18] */ + void (*LightHint)(int startX, int startY, int startZ); + + /* Called when a block is changed to update internal lighting state. */ + /* NOTE: Implementations ***MUST*** mark all chunks affected by this lighting change as needing to be refreshed. */ + void (*OnBlockChanged)(int x, int y, int z, BlockID oldBlock, BlockID newBlock); + /* Invalidates/Resets lighting state for all of the blocks in the world */ + /* (e.g. because a block changed whether it is full bright or not) */ + void (*Refresh)(void); + + /* Returns whether the block at the given coordinates is fully in sunlight. */ + /* NOTE: Does ***NOT*** check that the coordinates are inside the map. */ + cc_bool (*IsLit)(int x, int y, int z); + /* Returns the light colour at the given coordinates. */ + PackedCol (*Color)(int x, int y, int z); + /* Returns the light colour at the given coordinates. */ + PackedCol (*Color_XSide)(int x, int y, int z); + + /* _Fast functions assume Lighting_LightHint has already been called */ + /* and performed the necessary calculations for the given x/z coords */ + /* _Fast functions also do NOT check coordinates are inside the map */ + + cc_bool (*IsLit_Fast)(int x, int y, int z); + PackedCol (*Color_Sprite_Fast)(int x, int y, int z); + PackedCol (*Color_YMax_Fast)(int x, int y, int z); + PackedCol (*Color_YMin_Fast)(int x, int y, int z); + PackedCol (*Color_XSide_Fast)(int x, int y, int z); + PackedCol (*Color_ZSide_Fast)(int x, int y, int z); +} Lighting; + +void FancyLighting_SetActive(void); +void FancyLighting_OnInit(void); + +/* Expose ClassicLighting functions for reuse in Fancy lighting */ +void ClassicLighting_Refresh(void); +void ClassicLighting_FreeState(void); +void ClassicLighting_AllocState(void); +int ClassicLighting_GetLightHeight(int x, int z); +void ClassicLighting_LightHint(int startX, int startY, int startZ); +cc_bool ClassicLighting_IsLit(int x, int y, int z); +cc_bool ClassicLighting_IsLit_Fast(int x, int y, int z); +void ClassicLighting_OnBlockChanged(int x, int y, int z, BlockID oldBlock, BlockID newBlock); + +#endif |