initial commit
|
@ -0,0 +1,13 @@
|
|||
CMakeFiles/
|
||||
cmake_install.cmake
|
||||
CMakeCache.txt
|
||||
/fips_targets.yml
|
||||
Makefile
|
||||
/.project
|
||||
/.cproject
|
||||
/.fips-gen.py
|
||||
/.fips-imports.cmake
|
||||
*.a
|
||||
/.settings
|
||||
/fips-*_*
|
||||
/valgrind-*.log
|
|
@ -0,0 +1,29 @@
|
|||
cmake_minimum_required(VERSION 2.8)
|
||||
get_filename_component(FIPS_ROOT_DIR "../fips" ABSOLUTE)
|
||||
get_filename_component(ENGINE_ROOT_DIR "." ABSOLUTE)
|
||||
include("${FIPS_ROOT_DIR}/cmake/fips.cmake")
|
||||
include("${ENGINE_ROOT_DIR}/cmake/common.cmake")
|
||||
set(CMAKE_MODULE_PATH "${ENGINE_ROOT_DIR}/cmake")
|
||||
include(CheckFunctionExists)
|
||||
include(CheckLibraryExists)
|
||||
|
||||
set(FIPS_EXCEPTIONS ON)
|
||||
set(FIPS_UNITTESTS ON)
|
||||
set(FIPS_RTTI ON)
|
||||
set(TB_ENABLE_RTTI ON CACHE BOOL "Do not disable RTTI" FORCE)
|
||||
|
||||
if (${CMAKE_HOST_SYSTEM_NAME} STREQUAL "Windows")
|
||||
elseif (${CMAKE_HOST_SYSTEM_NAME} STREQUAL "Darwin")
|
||||
elseif (${CMAKE_HOST_SYSTEM_NAME} STREQUAL "Linux")
|
||||
# TODO: this is for the header only sauce lib
|
||||
add_definitions(-Wall -Wextra -Wno-deprecated-declarations -Wno-unused-local-typedefs)
|
||||
endif()
|
||||
|
||||
include_directories(src/modules)
|
||||
include_directories(src/modules/ui)
|
||||
|
||||
fips_setup(PROJECT engine)
|
||||
fips_add_subdirectory(src)
|
||||
fips_finish()
|
||||
|
||||
copy_data_files(shared)
|
|
@ -0,0 +1,174 @@
|
|||
# About
|
||||
Voxel engine that depends on [PolyVox](http://www.volumesoffun.com/polyvox-about/) and [AccidentalNoise](http://accidentalnoise.sourceforge.net/)
|
||||
|
||||
The build system is a cmake based system that automatically downloads all the needed dependencies. See
|
||||
[fips homepage](http://floooh.github.io/fips).
|
||||
|
||||
Network message generation depends on [flatbuffers](https://github.com/mgerhardy/fips-flatbuffers)
|
||||
|
||||
Concept: [Link](https://drive.google.com/open?id=0BxzNji4VZ2FaWXplX0I1ZWxOamc&authuser=0)
|
||||
|
||||
# Var
|
||||
There are vars inside the engine that you can override via commandline. Var instances are runtime changeable
|
||||
configuration variables that you can influence from within the game.
|
||||
e.g. run the server with ```./server -set sv_port 1025``` to change the *sv_port* var to 1025 and bind that port.
|
||||
|
||||
* cl_cammaxpitch the max pitch should not be bigger than 89.9 - because at 90 we have a visual switch
|
||||
* cl_camspeed
|
||||
* cl_cammousespeed
|
||||
* sv_seed the server side seed
|
||||
* cl_name the name of the client
|
||||
* cl_port the port to connect to
|
||||
* cl_host e.g. 127.0.0.1
|
||||
* cl_fullscreen true|false
|
||||
* cl_chunksize 16 The size of the chunk that is extracted with each step
|
||||
* core_loglevel 0 = Error => 4 = Trace
|
||||
* cl_vsync false|true To disable|enable vsync
|
||||
|
||||
# Dependencies
|
||||
* You need to have **SDL2** installed
|
||||
* Windows: env var *SDL2DIR* point to the directory where you extracted it into ([Download link](http://libsdl.org/release/SDL2-devel-2.0.3-VC.zip))
|
||||
* Linux: pkg-config support is enough here (e.g. ```apt-get install libsdl2-dev```)
|
||||
* You need to have **git** installed and in your path
|
||||
* You need to have **cmake** installed and in your path
|
||||
* You need to have **python27** installed and in your path
|
||||
* You need to have **postgre** installed (ubuntu package postgresql, libpq-dev and postgresql-server-dev-9.3 (or another version))
|
||||
|
||||
# Compilation
|
||||
* After fulfilling all the above mentioned dependencies, you just have to run ```fips```
|
||||
|
||||
# Profiling
|
||||
* There is built-in [Remotery](https://github.com/Celtoys/Remotery) support - just run the application with e.g.
|
||||
```./fips run server -- -set core_trace true```
|
||||
or without fips:
|
||||
```./server -set core_trace true```
|
||||
The *core_trace* var will activate all those core_trace_* macros.
|
||||
|
||||
# Check this out:
|
||||
* [PolyVox and Bullet](http://www.reddit.com/r/VoxelGameDev/comments/2dmfr1/fun_with_polyvox_and_bullet/)
|
||||
* [PolyVox 3D world generation](http://accidentalnoise.sourceforge.net/minecraftworlds.html)
|
||||
* [AccidentalNoise islands](http://www.gamedev.net/blog/33/entry-2249282-hooking-into-the-tree-to-build-a-map/)
|
||||
* [libnoise tutorials](http://libnoise.sourceforge.net/tutorials/)
|
||||
* [VoxelEditor](https://voxel.codeplex.com/)
|
||||
* [Voxel Engines](http://www.reddit.com/r/gamedev/wiki/block_engines)
|
||||
* [Minecraft Protocol](http://wiki.vg/Protocol)
|
||||
* [CouchDB](http://code.google.com/p/couchdbpp/)
|
||||
* [Quest Generating AI](http://voxelquest.vanillaforums.com/discussion/comment/11/#Comment_11) (VoxelQuest)
|
||||
* [VoxelShip Editor](https://blackflux.com/node/11)
|
||||
* [MagicaVoxel Editor](http://ephtracy.github.io/)
|
||||
|
||||
## PostgreSQL
|
||||
|
||||
first sudo as postgres default superuser 'postgres' on bash
|
||||
|
||||
`sudo -i -u postgres`
|
||||
|
||||
adding an new new user by typing
|
||||
|
||||
`createuser -s dbmaster`
|
||||
|
||||
create a new database
|
||||
|
||||
`createdb engine_db`
|
||||
|
||||
now start postgres and add password for these user
|
||||
|
||||
`psql`
|
||||
|
||||
write this statement
|
||||
|
||||
`ALTER USER dbmaster WITH PASSWORD 'ben711cCefIUit887';`
|
||||
|
||||
now we have done the first initialization.
|
||||
|
||||
|
||||
### quick postreSQL guide:
|
||||
|
||||
to leave PSQL type: `\q`
|
||||
to list all Database type: `\l`
|
||||
to connect to an specific database type: `\c dbname` (for example `\c engine_db`)
|
||||
after you are connected to an database, you can use SQL
|
||||
to list al tables type: `\dt` (`\d+` for all tables. also sequences)
|
||||
|
||||
more stuff: http://wiki.ubuntuusers.de/PostgreSQL
|
||||
|
||||
### console postgres tools
|
||||
|
||||
temporary tools (till rcon is not final) are usable via console.
|
||||
after db is initialized start the server and type `store init`
|
||||
this will create the user table
|
||||
|
||||
to add an user type `store useradd <name> <password>`
|
||||
|
||||
|
||||
|
||||
# AI
|
||||
* Request
|
||||
* Produce
|
||||
* Consume
|
||||
|
||||
## Production chain
|
||||
Define a need, to be able to produce something
|
||||
In order to fulfill this need, the ai should request the needed objects (or walk to a location to get it)
|
||||
Even food can be handled via "request -> produce" (the production is the health)
|
||||
|
||||
We need a system that is able to define the needs and define how to fulfill them.
|
||||
* Points of Interest (where is something produced)
|
||||
* Reference other production chains (The product of something else might be the 'request' to 'produce' my own product
|
||||
* Price one has to pay (exchange with some other good [e.g. of of the 'requests' of the producer] or money)
|
||||
|
||||
So every npc should have several requests:
|
||||
* money (used to get the production chain start good)
|
||||
* food (used to produce health)
|
||||
* production chain start good (use to produce something to get money/food/production chain start good)
|
||||
|
||||
Each of these requests will get a priority. This way we have unique characters where one is just trying to survive, while another one
|
||||
is just trying to get rich and yet another one that is already satisfied if he can fulfill the need of others. (The food should always be relative high)
|
||||
|
||||
## Requests
|
||||
requests[] = {
|
||||
health
|
||||
money
|
||||
}
|
||||
|
||||
## Health
|
||||
Possibe production chains:
|
||||
Money -> Food -> Health
|
||||
InputGood -> OutputGood -> $ReferenceToFoodCreatorRequests
|
||||
|
||||
So we need to save the needed outputs - and then recursively search for stuff that leads to fulfilling the need. If we can
|
||||
fulfill the need on the first level, skip everything else - otherwise go a level deeper.
|
||||
|
||||
fulfills[health] = { food 100% }
|
||||
fulfills[food] = { buyfood 80%, createfood 15%, stealfood 5% }
|
||||
fulfills[createfood] = { huntanimals 50%, producefood 50% }
|
||||
fulfills[buyfood] = { money 100% }
|
||||
fulfills[money] = { sellproduction 95%, stealmoney 5% }
|
||||
fulfills[sellproduction] = { produce 100% }
|
||||
fulfills[produce] = { work 99%, findprofession 1% }
|
||||
fulfills[work] = { getmaterial 1%, convertmaterial 99% }
|
||||
[...]
|
||||
|
||||
I think this can all be modeled into behaviour trees. We need to implement the slot mechanism into SimpleAI to replace
|
||||
profession slot. So the behaviour tree would e.g. look like this:
|
||||
|
||||
|
||||
|
||||
CreateFood[IfFoodCreator]
|
||||
BuyFood[IfEoughMoney]
|
||||
GetFood[IsHungry] StealFood
|
||||
StayHealthy
|
||||
Work
|
||||
|
||||
|
||||
## Requests can't be fulfilled
|
||||
* Walk to the town hall and cry about not being able to fulfill your need. Do that for x time units - after that change your
|
||||
profession, get new requests and try to fulfill those.
|
||||
* A player can now walk into the town hall to resolve unfulfilled requests
|
||||
* After x time units the unfulfilled request is again visible in the town hall for other players.
|
||||
|
||||
# Spawn of npcs
|
||||
* We need points of interest and a fillrate at those POIs.
|
||||
* We need to be able to pick a profession (visual appearance will be tight to the profession)
|
||||
* Do we need a sheriff in each town? One that already investigates unfulfilled requests?
|
||||
* We need one town master chief rocker in the town hall that gives away the collected quests to the users.
|
|
@ -0,0 +1,18 @@
|
|||
if (DEFINED ENV{SDL2DIR})
|
||||
set(SDL2_INCLUDE_DIRS ENV{SDL2DIR}/include)
|
||||
if (FIPS_WINDOWS)
|
||||
set(SDL2_LIBRARIES ENV{SDL2DIR}/libs/SDL_main.lib ENV{SDL2DIR}/libs/SDL.lib)
|
||||
endif()
|
||||
else()
|
||||
if (FIPS_WINDOWS)
|
||||
find_package(SDL REQUIRED)
|
||||
set(SDL2_INCLUDE_DIRS ${SDL_INCLUDE_DIRS})
|
||||
set(SDL2_LIBRARIES ${SDL_LIBRARIES})
|
||||
else()
|
||||
#include(FindPkgConfig)
|
||||
find_package(PkgConfig)
|
||||
if (PKG_CONFIG_FOUND)
|
||||
pkg_search_module(SDL2 REQUIRED sdl2)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
|
@ -0,0 +1,24 @@
|
|||
SET(DEFAULT_LUA_EXECUTABLE lua)
|
||||
|
||||
macro(copy_data_files TARGET)
|
||||
add_custom_target(copy-data-${TARGET} ALL
|
||||
COMMAND cmake -E copy_directory "${FIPS_PROJECT_DIR}/data/${TARGET}/" ${FIPS_DEPLOY_DIR}/${CMAKE_PROJECT_NAME}/${FIPS_CONFIG}
|
||||
COMMENT "Copy ${TARGET} data files...")
|
||||
endmacro()
|
||||
|
||||
macro(check_lua_files TARGET files)
|
||||
find_program(LUA_EXECUTABLE NAMES ${DEFAULT_LUA_EXECUTABLE})
|
||||
if (LUA_EXECUTABLE)
|
||||
message("${LUA_EXECUTABLE} found")
|
||||
foreach(_file ${files})
|
||||
add_custom_target(
|
||||
${_file}
|
||||
COMMAND ${LUA_EXECUTABLE} ${_file}
|
||||
WORKING_DIRECTORY ${FIPS_PROJECT_DIR}/data/${TARGET}
|
||||
)
|
||||
add_dependencies(${TARGET} ${_file})
|
||||
endforeach()
|
||||
else()
|
||||
message(WARNING "No ${DEFAULT_LUA_EXECUTABLE} found")
|
||||
endif()
|
||||
endmacro()
|
After Width: | Height: | Size: 35 KiB |
After Width: | Height: | Size: 28 KiB |
|
@ -0,0 +1,57 @@
|
|||
in vec3 v_pos;
|
||||
in vec3 v_norm;
|
||||
in vec2 v_texcoords;
|
||||
in vec3 v_diffusecolor;
|
||||
in vec3 v_specularcolor;
|
||||
in vec3 v_lightpos;
|
||||
out vec4 o_color;
|
||||
uniform sampler2D u_texture;
|
||||
|
||||
vec3 getMaterialColor() {
|
||||
return texture(u_texture, v_texcoords).rgb;
|
||||
}
|
||||
|
||||
vec3 getAmbientColor(vec3 materialcolor) {
|
||||
const float ambientstrength = 1.0;
|
||||
return ambientstrength * materialcolor;
|
||||
}
|
||||
|
||||
vec3 getDiffuseColor(vec3 lightdir, vec3 normal) {
|
||||
float diffuse = max(dot(lightdir, normal), 0.0);
|
||||
return diffuse * v_diffusecolor;
|
||||
}
|
||||
|
||||
vec3 getSpecularColor(vec3 lightdir, vec3 normal) {
|
||||
const float specularstrength = 0.5;
|
||||
vec3 viewdir = normalize(-v_pos);
|
||||
vec3 reflectdir = reflect(-lightdir, normal);
|
||||
float specangle = max(dot(reflectdir, viewdir), 0.0);
|
||||
float spec = pow(specangle, 32);
|
||||
return specularstrength * spec * v_specularcolor;
|
||||
}
|
||||
|
||||
vec3 getFogColor() {
|
||||
return vec3(0.04, 0.29, 0.94);
|
||||
}
|
||||
|
||||
float getFog() {
|
||||
const float density = 0.05;
|
||||
const float endfog = 1500.0;
|
||||
const float startfog = 500.0;
|
||||
float fogdistance = gl_FragCoord.z / gl_FragCoord.w;
|
||||
float d = density * fogdistance;
|
||||
float fogval = (endfog - fogdistance) / (endfog - startfog);
|
||||
return 1.0 - clamp(fogval, 0.0, 1.0);
|
||||
}
|
||||
|
||||
void main(void) {
|
||||
vec3 lightdir = normalize(v_lightpos - v_pos);
|
||||
|
||||
vec3 materialcolor = getMaterialColor();
|
||||
vec3 ambientcolor = getAmbientColor(materialcolor);
|
||||
vec3 diffusecolor = getDiffuseColor(lightdir, v_norm);
|
||||
vec3 specularcolor = getSpecularColor(lightdir, v_norm);
|
||||
vec3 fogcolor = getFogColor();
|
||||
vec3 finalcolor = (ambientcolor + diffusecolor + specularcolor) * materialcolor;
|
||||
o_color = vec4(mix(finalcolor, fogcolor, getFog()), 1.0);
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
// attributes from the VAOs
|
||||
in vec3 a_pos;
|
||||
in vec3 a_norm;
|
||||
in vec2 a_texcoords;
|
||||
|
||||
uniform mat4 u_projection;
|
||||
uniform mat4 u_model;
|
||||
uniform mat4 u_view;
|
||||
uniform vec3 u_diffusecolor;
|
||||
uniform vec3 u_specularcolor;
|
||||
uniform vec3 u_lightpos;
|
||||
|
||||
out vec3 v_pos;
|
||||
out vec3 v_norm;
|
||||
out vec2 v_texcoords;
|
||||
out vec3 v_diffusecolor;
|
||||
out vec3 v_specularcolor;
|
||||
out vec3 v_lightpos;
|
||||
|
||||
void main(void) {
|
||||
mat4 modelview = u_view * u_model;
|
||||
vec4 pos4 = modelview * vec4(a_pos, 1.0);
|
||||
v_pos = vec3(pos4) / pos4.w;
|
||||
v_norm = a_norm;
|
||||
v_texcoords = a_texcoords;
|
||||
v_diffusecolor = u_diffusecolor;
|
||||
v_specularcolor = u_specularcolor;
|
||||
v_lightpos = u_lightpos;
|
||||
gl_Position = u_projection * modelview * vec4(a_pos, 1.0);
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
uniform sampler2D u_texture;
|
||||
in vec2 v_texcoord;
|
||||
in vec4 v_color;
|
||||
out vec4 o_color;
|
||||
|
||||
void main(void) {
|
||||
vec4 color = texture2D(u_texture, v_texcoord);
|
||||
vec4 fcolor = v_color / 255.0;
|
||||
o_color = color * fcolor * 255.0;
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
// attributes from the VAOs
|
||||
in vec2 a_pos;
|
||||
in vec2 a_texcoord;
|
||||
in vec4 a_color;
|
||||
|
||||
uniform mat4 u_projection;
|
||||
|
||||
out vec2 v_texcoord;
|
||||
out vec4 v_color;
|
||||
|
||||
void main(void) {
|
||||
v_color = a_color;
|
||||
v_texcoord = a_texcoord;
|
||||
gl_Position = u_projection * vec4(a_pos.x, a_pos.y, 0.0, 1.0);
|
||||
}
|
|
@ -0,0 +1,57 @@
|
|||
in vec3 v_pos;
|
||||
in vec3 v_norm;
|
||||
in vec2 v_texcoords;
|
||||
in vec3 v_diffusecolor;
|
||||
in vec3 v_specularcolor;
|
||||
in vec3 v_lightpos;
|
||||
out vec4 o_color;
|
||||
uniform sampler2D u_texture;
|
||||
|
||||
vec3 getMaterialColor() {
|
||||
return texture(u_texture, v_texcoords).rgb;
|
||||
}
|
||||
|
||||
vec3 getAmbientColor(vec3 materialcolor) {
|
||||
const float ambientstrength = 1.0;
|
||||
return ambientstrength * materialcolor;
|
||||
}
|
||||
|
||||
vec3 getDiffuseColor(vec3 lightdir, vec3 normal) {
|
||||
float diffuse = max(dot(lightdir, normal), 0.0);
|
||||
return diffuse * v_diffusecolor;
|
||||
}
|
||||
|
||||
vec3 getSpecularColor(vec3 lightdir, vec3 normal) {
|
||||
const float specularstrength = 0.5;
|
||||
vec3 viewdir = normalize(-v_pos);
|
||||
vec3 reflectdir = reflect(-lightdir, normal);
|
||||
float specangle = max(dot(reflectdir, viewdir), 0.0);
|
||||
float spec = pow(specangle, 32);
|
||||
return specularstrength * spec * v_specularcolor;
|
||||
}
|
||||
|
||||
vec3 getFogColor() {
|
||||
return vec3(0.04, 0.29, 0.94);
|
||||
}
|
||||
|
||||
float getFog() {
|
||||
const float density = 0.05;
|
||||
const float endfog = 1500.0;
|
||||
const float startfog = 500.0;
|
||||
float fogdistance = gl_FragCoord.z / gl_FragCoord.w;
|
||||
float d = density * fogdistance;
|
||||
float fogval = (endfog - fogdistance) / (endfog - startfog);
|
||||
return 1.0 - clamp(fogval, 0.0, 1.0);
|
||||
}
|
||||
|
||||
void main(void) {
|
||||
vec3 lightdir = normalize(v_lightpos - v_pos);
|
||||
|
||||
vec3 materialcolor = getMaterialColor();
|
||||
vec3 ambientcolor = getAmbientColor(materialcolor);
|
||||
vec3 diffusecolor = getDiffuseColor(lightdir, v_norm);
|
||||
vec3 specularcolor = getSpecularColor(lightdir, v_norm);
|
||||
vec3 fogcolor = getFogColor();
|
||||
vec3 finalcolor = (ambientcolor + diffusecolor + specularcolor) * materialcolor;
|
||||
o_color = vec4(mix(finalcolor, fogcolor, getFog()), 1.0);
|
||||
}
|
|
@ -0,0 +1,34 @@
|
|||
// attributes from the VAOs
|
||||
in vec3 a_pos;
|
||||
in vec3 a_norm;
|
||||
in vec2 a_texcoords;
|
||||
|
||||
uniform float u_wavetime;
|
||||
uniform float u_wavewidth;
|
||||
uniform float u_waveheight;
|
||||
uniform mat4 u_projection;
|
||||
uniform mat4 u_model;
|
||||
uniform mat4 u_view;
|
||||
uniform vec3 u_diffusecolor;
|
||||
uniform vec3 u_specularcolor;
|
||||
uniform vec3 u_lightpos;
|
||||
|
||||
out vec3 v_pos;
|
||||
out vec3 v_norm;
|
||||
out vec2 v_texcoords;
|
||||
out vec3 v_diffusecolor;
|
||||
out vec3 v_specularcolor;
|
||||
out vec3 v_lightpos;
|
||||
|
||||
void main(void) {
|
||||
mat4 modelview = u_view * u_model;
|
||||
vec4 pos4 = modelview * vec4(a_pos, 1.0);
|
||||
v_pos = vec3(pos4) / pos4.w;
|
||||
v_norm = a_norm;
|
||||
v_texcoords = a_texcoords;
|
||||
v_diffusecolor = u_diffusecolor;
|
||||
v_specularcolor = u_specularcolor;
|
||||
v_lightpos = u_lightpos;
|
||||
float posw = sin(u_wavewidth * a_pos.x + u_wavetime) * cos(u_wavewidth * a_pos.y + u_wavetime) * u_waveheight;
|
||||
gl_Position = u_projection * modelview * vec4(a_pos, posw);
|
||||
}
|
|
@ -0,0 +1,90 @@
|
|||
flat in int v_material;
|
||||
flat in int v_density;
|
||||
in vec3 v_pos;
|
||||
in vec3 v_diffusecolor;
|
||||
in vec3 v_specularcolor;
|
||||
in vec3 v_lightpos;
|
||||
out vec4 o_color;
|
||||
|
||||
// the different material types
|
||||
const int AIR = 0;
|
||||
const int DIRT = 1;
|
||||
const int GRASS = 2;
|
||||
const int CLOUD = 3;
|
||||
const int WATER = 4;
|
||||
const int LEAVES = 5;
|
||||
const int TRUNK = 6;
|
||||
const int CLOUDS = 7;
|
||||
|
||||
const float MAX_MATERIAL = 16.0;
|
||||
|
||||
vec3 getMaterialColor() {
|
||||
if (v_material == DIRT) {
|
||||
return vec3(0.97, 0.67, 0.39);
|
||||
}
|
||||
if (v_material == GRASS) {
|
||||
return vec3(0.24, 0.67, 0.24);
|
||||
}
|
||||
if (v_material == CLOUD) {
|
||||
return vec3(0.75, 0.75, 0.9);
|
||||
}
|
||||
if (v_material == TRUNK) {
|
||||
return vec3(0.4, 0.2, 0.0);
|
||||
}
|
||||
if (v_material == LEAVES) {
|
||||
return vec3(0.4, 0.6, 0.4);
|
||||
}
|
||||
if (v_material == CLOUDS) {
|
||||
return vec3(0.4, 0.6, 0.9);
|
||||
}
|
||||
// error
|
||||
return vec3(1.0, float(v_material) / (MAX_MATERIAL * 255.0), float(v_density) / (MAX_MATERIAL * 255.0));
|
||||
}
|
||||
|
||||
vec3 getAmbientColor(vec3 materialcolor) {
|
||||
const float ambientstrength = 1.0;
|
||||
return ambientstrength * materialcolor;
|
||||
}
|
||||
|
||||
vec3 getDiffuseColor(vec3 lightdir, vec3 normal) {
|
||||
float diffuse = max(dot(lightdir, normal), 0.0);
|
||||
return diffuse * v_diffusecolor;
|
||||
}
|
||||
|
||||
vec3 getSpecularColor(vec3 lightdir, vec3 normal) {
|
||||
const float specularstrength = 0.5;
|
||||
vec3 viewdir = normalize(-v_pos);
|
||||
vec3 reflectdir = reflect(-lightdir, normal);
|
||||
float specangle = max(dot(reflectdir, viewdir), 0.0);
|
||||
float spec = pow(specangle, 32);
|
||||
return specularstrength * spec * v_specularcolor;
|
||||
}
|
||||
|
||||
vec3 getFogColor() {
|
||||
return vec3(0.04, 0.29, 0.94);
|
||||
}
|
||||
|
||||
float getFog() {
|
||||
const float density = 0.05;
|
||||
const float endfog = 1500.0;
|
||||
const float startfog = 500.0;
|
||||
float fogdistance = gl_FragCoord.z / gl_FragCoord.w;
|
||||
float d = density * fogdistance;
|
||||
float fogval = (endfog - fogdistance) / (endfog - startfog);
|
||||
return 1.0 - clamp(fogval, 0.0, 1.0);
|
||||
}
|
||||
|
||||
void main(void) {
|
||||
vec3 fdx = vec3(dFdx(v_pos.x), dFdx(v_pos.y), dFdx(v_pos.z));
|
||||
vec3 fdy = vec3(dFdy(v_pos.x), dFdy(v_pos.y), dFdy(v_pos.z));
|
||||
vec3 normal = normalize(cross(fdx, fdy));
|
||||
vec3 lightdir = normalize(v_lightpos - v_pos);
|
||||
|
||||
vec3 materialcolor = getMaterialColor();
|
||||
vec3 ambientcolor = getAmbientColor(materialcolor);
|
||||
vec3 diffusecolor = getDiffuseColor(lightdir, normal);
|
||||
vec3 specularcolor = getSpecularColor(lightdir, normal);
|
||||
vec3 fogcolor = getFogColor();
|
||||
vec3 finalcolor = (ambientcolor + diffusecolor + specularcolor) * materialcolor;
|
||||
o_color = vec4(mix(finalcolor, fogcolor, getFog()), 1.0);
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
// attributes from the VAOs
|
||||
in vec3 a_pos;
|
||||
in ivec2 a_materialdensity;
|
||||
|
||||
uniform mat4 u_projection;
|
||||
uniform mat4 u_model;
|
||||
uniform mat4 u_view;
|
||||
uniform vec3 u_diffusecolor;
|
||||
uniform vec3 u_specularcolor;
|
||||
uniform vec3 u_lightpos;
|
||||
|
||||
flat out int v_material;
|
||||
flat out int v_density;
|
||||
out vec3 v_pos;
|
||||
out vec3 v_diffusecolor;
|
||||
out vec3 v_specularcolor;
|
||||
out vec3 v_lightpos;
|
||||
|
||||
void main(void) {
|
||||
mat4 modelview = u_view * u_model;
|
||||
vec4 pos4 = modelview * vec4(a_pos, 1.0);
|
||||
v_pos = vec3(pos4) / pos4.w;
|
||||
v_material = a_materialdensity.x;
|
||||
v_density = a_materialdensity.y;
|
||||
v_diffusecolor = u_diffusecolor;
|
||||
v_specularcolor = u_specularcolor;
|
||||
v_lightpos = u_lightpos;
|
||||
gl_Position = u_projection * modelview * vec4(a_pos, 1.0);
|
||||
}
|
After Width: | Height: | Size: 1.2 MiB |
|
@ -0,0 +1,15 @@
|
|||
info
|
||||
glyph_str !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ
|
||||
name Segoe
|
||||
size 14
|
||||
bitmap font_14.png
|
||||
ascent 15
|
||||
descent 5
|
||||
advance_delta -3
|
||||
space_advance 5
|
||||
size 28
|
||||
bitmap font_28.png
|
||||
ascent 31
|
||||
descent 10
|
||||
advance_delta -7
|
||||
space_advance 10
|
After Width: | Height: | Size: 47 KiB |
After Width: | Height: | Size: 122 KiB |
|
@ -0,0 +1,5 @@
|
|||
w +move_forward
|
||||
a +move_left
|
||||
s +move_backward
|
||||
d +move_right
|
||||
ctrl+w quit
|
|
@ -0,0 +1,14 @@
|
|||
TBMessageWindow.ok Ok
|
||||
TBMessageWindow.cancel Cancel
|
||||
TBMessageWindow.yes Yes
|
||||
TBMessageWindow.no No
|
||||
TBList.header Showing %d of %d
|
||||
connect Connect
|
||||
password Password
|
||||
login Login
|
||||
email Email
|
||||
ok Ok
|
||||
disconnect Disconnect
|
||||
disconnecttext You either got disconnected or the connect attempt failed
|
||||
authfailed Authentication failed
|
||||
authfailedtext Authentication failed
|
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 3.0 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 2.5 KiB |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 1.0 KiB |
After Width: | Height: | Size: 971 B |
After Width: | Height: | Size: 3.1 KiB |
After Width: | Height: | Size: 2.8 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 929 B |
After Width: | Height: | Size: 2.7 KiB |
After Width: | Height: | Size: 5.1 KiB |
After Width: | Height: | Size: 2.0 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 1.2 KiB |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 1.0 KiB |
|
@ -0,0 +1,464 @@
|
|||
# This is the default skin of Turbo Badger
|
||||
# The license of the skin is Public Domain.
|
||||
#
|
||||
# For more information about Turbo Badger and its license,
|
||||
# see tb_core.h.
|
||||
description
|
||||
name Turbo Badger Default skin
|
||||
# Dimensions in dp (the default unit for padding and such) and bitmaps are specified for this DPI.
|
||||
base-dpi 96
|
||||
# The skin also has graphics available in these DPI modes
|
||||
supported-dpi 96
|
||||
defaults
|
||||
spacing 5
|
||||
text-color #fefefe
|
||||
placeholder
|
||||
opacity 0.2
|
||||
disabled
|
||||
opacity 0.3
|
||||
elements
|
||||
TBButton
|
||||
text-color #fefefe
|
||||
bitmap button.png
|
||||
cut 17
|
||||
expand 7
|
||||
padding 6 8
|
||||
overrides
|
||||
element TBButtonInGroup
|
||||
condition: target: parent, property: skin, value: button_group
|
||||
condition: target: parent, property: axis, value: x
|
||||
element TBButton.pressed
|
||||
state pressed
|
||||
TBButton.pressed
|
||||
text-color #fefefe
|
||||
bitmap button_pressed.png
|
||||
cut 17
|
||||
expand 7
|
||||
content-ofs-x 1
|
||||
content-ofs-y 1
|
||||
|
||||
TBButton.flat
|
||||
text-color #fefefe
|
||||
padding 6 8
|
||||
children
|
||||
element TBButton.flat.hovered
|
||||
state hovered
|
||||
element TBButton.flat.pressed
|
||||
state pressed
|
||||
TBButton.flat.hovered
|
||||
bitmap button_flat_outline.png
|
||||
cut 15
|
||||
expand 6
|
||||
TBButton.flat.pressed
|
||||
bitmap button_flat_pressed.png
|
||||
cut 8
|
||||
|
||||
# == TBButtonInGroup is not a widget. It's only used as override for TBButton under a "button_group" ====
|
||||
TBButtonInGroup
|
||||
bitmap button_grouped_x_middle_up.png
|
||||
cut 17
|
||||
expand 7
|
||||
padding 6 8
|
||||
overrides
|
||||
element TBButtonInGroup.first
|
||||
condition: target: prev sibling, property: skin, value: TBButton, test: !=
|
||||
element TBButtonInGroup.last
|
||||
condition: target: next sibling, property: skin, value: TBButton, test: !=
|
||||
element TBButtonInGroup.pressed
|
||||
state pressed
|
||||
TBButtonInGroup.pressed
|
||||
clone TBButtonInGroup
|
||||
bitmap button_grouped_x_middle_down.png
|
||||
content-ofs-x 1
|
||||
content-ofs-y 1
|
||||
overrides
|
||||
TBButtonInGroup.first
|
||||
clone TBButtonInGroup
|
||||
bitmap button_grouped_x_first_up.png
|
||||
overrides
|
||||
element TBButtonInGroup.first.pressed
|
||||
state pressed
|
||||
TBButtonInGroup.first.pressed
|
||||
clone TBButtonInGroup.pressed
|
||||
bitmap button_grouped_x_first_down.png
|
||||
overrides
|
||||
TBButtonInGroup.last
|
||||
clone TBButtonInGroup
|
||||
bitmap button_grouped_x_last_up.png
|
||||
overrides
|
||||
element TBButtonInGroup.last.pressed
|
||||
state pressed
|
||||
TBButtonInGroup.last.pressed
|
||||
clone TBButtonInGroup.pressed
|
||||
bitmap button_grouped_x_last_down.png
|
||||
overrides
|
||||
|
||||
# == button_group is not a widget. It's specified on widgets that should group TBButton =======
|
||||
button_group
|
||||
spacing -1px
|
||||
|
||||
# == TBSection skins ==========================================================================
|
||||
TBSection.layout
|
||||
spacing -1px
|
||||
TBSection.container
|
||||
bitmap section_container.png
|
||||
type StretchBorder
|
||||
cut 11
|
||||
expand 6
|
||||
padding 10
|
||||
TBSectionHeader
|
||||
bitmap window_mover_bg_tile.png
|
||||
type Tile
|
||||
expand -1
|
||||
padding 3 16
|
||||
children
|
||||
element TBSectionHeader.icon_0
|
||||
condition: target: this, property: value, value: 0
|
||||
condition: target: this, property: capture, test: !=
|
||||
element TBSectionHeader.icon_1
|
||||
condition: target: this, property: value, value: 1
|
||||
condition: target: this, property: capture, test: !=
|
||||
element TBSectionHeader.icon_pressed
|
||||
condition: target: this, property: capture
|
||||
overlays
|
||||
element TBSectionHeader.overlay
|
||||
state all
|
||||
TBSectionHeader.overlay
|
||||
bitmap window_mover_overlay.png
|
||||
type StretchBorder
|
||||
cut 16
|
||||
expand 3
|
||||
TBSectionHeader.icon_0
|
||||
bitmap toggle_section_icon_up.png
|
||||
type Image
|
||||
img-position-x 0
|
||||
img-ofs-x 4
|
||||
TBSectionHeader.icon_1
|
||||
bitmap toggle_section_icon_down.png
|
||||
type Image
|
||||
img-position-x 0
|
||||
img-ofs-x 4
|
||||
TBSectionHeader.icon_pressed
|
||||
bitmap toggle_section_icon_middle.png
|
||||
type Image
|
||||
img-position-x 0
|
||||
img-ofs-x 4
|
||||
|
||||
# == TBTabContainer skins - Create strong overrides for the tab buttons four alignments ============
|
||||
TBTabContainer.rootlayout
|
||||
spacing -1px
|
||||
TBTabContainer.tablayout_x
|
||||
padding 0 10
|
||||
TBTabContainer.tablayout_y
|
||||
padding 10 0
|
||||
TBTabContainer.container
|
||||
clone TBContainer
|
||||
TBTabContainer.tab
|
||||
strong-overrides
|
||||
element TBTabContainer.tab_top
|
||||
condition: target: ancestors, property: align, value: top
|
||||
element TBTabContainer.tab_bottom
|
||||
condition: target: ancestors, property: align, value: bottom
|
||||
element TBTabContainer.tab_left
|
||||
condition: target: ancestors, property: align, value: left
|
||||
element TBTabContainer.tab_right
|
||||
condition: target: ancestors, property: align, value: right
|
||||
# == Top tab button =============================
|
||||
TBTabContainer.tab_top
|
||||
bitmap tab_button_top_inactive.png
|
||||
cut 12
|
||||
expand 6
|
||||
padding 6 6 3 6
|
||||
min-width 50
|
||||
overrides
|
||||
element TBTabContainer.tab_top.pressed
|
||||
state pressed
|
||||
children
|
||||
element tab_top_focus
|
||||
state focused
|
||||
tab_top_focus
|
||||
type StretchBorder
|
||||
bitmap focus_tabbutton_top.png
|
||||
cut 12
|
||||
expand 6
|
||||
TBTabContainer.tab_top.pressed
|
||||
bitmap tab_button_top_active.png
|
||||
cut 13
|
||||
expand 6
|
||||
# == Bottom tab button =============================
|
||||
TBTabContainer.tab_bottom
|
||||
bitmap tab_button_bottom_inactive.png
|
||||
cut 12
|
||||
expand 6
|
||||
padding 3 6 6 6
|
||||
min-width 50
|
||||
overrides
|
||||
element TBTabContainer.tab_bottom.pressed
|
||||
state pressed
|
||||
children
|
||||
element tab_bottom_focus
|
||||
state focused
|
||||
tab_bottom_focus
|
||||
clone tab_top_focus
|
||||
flip-y 1
|
||||
TBTabContainer.tab_bottom.pressed
|
||||
bitmap tab_button_bottom_active.png
|
||||
cut 13
|
||||
expand 6
|
||||
# == Left tab button =============================
|
||||
TBTabContainer.tab_left
|
||||
bitmap tab_button_left_inactive.png
|
||||
cut 12
|
||||
expand 6
|
||||
padding 6 3 6 6
|
||||
min-width 50
|
||||
overrides
|
||||
element TBTabContainer.tab_left.pressed
|
||||
state pressed
|
||||
children
|
||||
element tab_left_focus
|
||||
state focused
|
||||
tab_left_focus
|
||||
type StretchBorder
|
||||
bitmap focus_tabbutton_left.png
|
||||
cut 12
|
||||
expand 6
|
||||
TBTabContainer.tab_left.pressed
|
||||
bitmap tab_button_left_active.png
|
||||
cut 13
|
||||
expand 6
|
||||
# == Right tab button =============================
|
||||
TBTabContainer.tab_right
|
||||
bitmap tab_button_right_inactive.png
|
||||
cut 12
|
||||
expand 6
|
||||
padding 6 6 6 3
|
||||
min-width 50
|
||||
overrides
|
||||
element TBTabContainer.tab_right.pressed
|
||||
state pressed
|
||||
children
|
||||
element tab_right_focus
|
||||
state focused
|
||||
tab_right_focus
|
||||
clone tab_left_focus
|
||||
flip-x 1
|
||||
TBTabContainer.tab_right.pressed
|
||||
bitmap tab_button_right_active.png
|
||||
cut 13
|
||||
expand 6
|
||||
|
||||
# == TBEditField skin. Create strong overrides for the search type to add magnifier glass icon =====
|
||||
TBEditField.selection
|
||||
cut 2
|
||||
bitmap selection.png
|
||||
TBEditField
|
||||
bitmap editfield.png
|
||||
cut 12
|
||||
expand 4
|
||||
padding 4
|
||||
strong-overrides
|
||||
element TBEditField.search
|
||||
condition: target: this, property: edit-type, value: "search"
|
||||
|
||||
TBEditField.search
|
||||
clone TBEditField
|
||||
padding 4 4 4 24
|
||||
min-width 50
|
||||
children
|
||||
element TBEditField.search.icon
|
||||
TBEditField.search.icon
|
||||
bitmap search.png
|
||||
type Image
|
||||
img-position-x 0
|
||||
img-ofs-x 5
|
||||
|
||||
# == TBWindow skin =================================================================================
|
||||
TBWindow
|
||||
bitmap window.png
|
||||
cut 16
|
||||
expand 12
|
||||
padding 10
|
||||
overrides
|
||||
element TBWindow.selected
|
||||
state selected
|
||||
TBWindow.selected
|
||||
bitmap window_active.png
|
||||
cut 16
|
||||
expand 12
|
||||
TBWindow.close
|
||||
bitmap window_close.png
|
||||
type Image
|
||||
children
|
||||
element TBWindow.close.pressed
|
||||
state pressed
|
||||
TBWindow.close.pressed
|
||||
bitmap window_close_pressed.png
|
||||
type Image
|
||||
TBWindow.mover
|
||||
text-color #b8b8b8
|
||||
bitmap window_mover_bg_tile.png
|
||||
type Tile
|
||||
expand -1
|
||||
padding 4
|
||||
overrides
|
||||
element TBWindow.mover.active
|
||||
state selected
|
||||
children
|
||||
element TBWindow.mover.overlay
|
||||
state all
|
||||
TBWindow.mover.overlay
|
||||
bitmap window_mover_overlay.png
|
||||
cut 12
|
||||
expand 3
|
||||
TBWindow.mover.active
|
||||
clone TBWindow.mover
|
||||
text-color #fefefe
|
||||
overrides
|
||||
overlays
|
||||
children
|
||||
|
||||
# == Misc skins ====================================================================================
|
||||
TBContainer
|
||||
bitmap container.png
|
||||
type StretchBorder
|
||||
cut 12
|
||||
expand 6
|
||||
padding 10
|
||||
TBCheckBox
|
||||
bitmap checkbox.png
|
||||
cut 19
|
||||
expand 7
|
||||
children
|
||||
element TBCheckBox.selected
|
||||
state selected
|
||||
element TBCheckBox.pressed
|
||||
state pressed
|
||||
TBCheckBox.selected
|
||||
bitmap checkbox_mark.png
|
||||
type Image
|
||||
expand 7
|
||||
TBCheckBox.pressed
|
||||
bitmap checkbox_pressed.png
|
||||
type Image
|
||||
TBRadioButton
|
||||
bitmap radio.png
|
||||
cut 19
|
||||
expand 7
|
||||
children
|
||||
element TBRadioButton.selected
|
||||
state selected
|
||||
element TBRadioButton.pressed
|
||||
state pressed
|
||||
TBRadioButton.selected
|
||||
bitmap radio_mark.png
|
||||
type Image
|
||||
expand 7
|
||||
TBRadioButton.pressed
|
||||
bitmap radio_pressed.png
|
||||
type Image
|
||||
expand 7
|
||||
TBLayout.fadeout_x
|
||||
bitmap fadeout_x.png
|
||||
TBLayout.fadeout_y
|
||||
bitmap fadeout_y.png
|
||||
TBSelectList
|
||||
clone TBEditField
|
||||
padding 2
|
||||
TBSelectDropdown
|
||||
clone TBButton
|
||||
TBSelectDropdown.arrow
|
||||
clone arrow.down
|
||||
TBSelectDropdown.window
|
||||
clone TBPopupWindow
|
||||
TBPopupWindow
|
||||
clone TBWindow
|
||||
padding 2
|
||||
TBMenuWindow
|
||||
clone TBPopupWindow
|
||||
TBSelectItem
|
||||
padding 4 10
|
||||
children
|
||||
element TBSelectItem.hovered
|
||||
state hovered
|
||||
element TBSelectItem.selected
|
||||
state selected
|
||||
TBSelectItem.selected
|
||||
cut 7
|
||||
bitmap item_selected.png
|
||||
TBSelectItem.hovered
|
||||
cut 7
|
||||
bitmap item_hover.png
|
||||
TBSelectItem.separator
|
||||
clone TBSeparator
|
||||
|
||||
TBSeparator
|
||||
bitmap item_separator_x.png
|
||||
type Stretch Image
|
||||
overrides
|
||||
element TBSeparator.y
|
||||
condition: target: parent, property: axis, value: x
|
||||
TBSeparator.y
|
||||
bitmap item_separator_y.png
|
||||
type Stretch Image
|
||||
|
||||
TBScrollBarBgX
|
||||
bitmap scroll_bg_x.png
|
||||
cut 11
|
||||
expand 5
|
||||
TBScrollBarFgX
|
||||
bitmap scroll_fg_x.png
|
||||
cut 11
|
||||
expand 5
|
||||
TBScrollBarBgY
|
||||
bitmap scroll_bg_y.png
|
||||
cut 11
|
||||
expand 5
|
||||
TBScrollBarFgY
|
||||
bitmap scroll_fg_y.png
|
||||
cut 11
|
||||
expand 5
|
||||
|
||||
TBSliderBgX
|
||||
bitmap slider_bg_x.png
|
||||
cut 9
|
||||
min-height 19
|
||||
max-height 19
|
||||
min-width 50
|
||||
TBSliderFgX
|
||||
bitmap slider_handle.png
|
||||
expand 5
|
||||
|
||||
TBSliderBgY
|
||||
bitmap slider_bg_y.png
|
||||
cut 9
|
||||
min-width 19
|
||||
max-width 19
|
||||
min-height 50
|
||||
TBSliderFgY
|
||||
clone TBSliderFgX
|
||||
|
||||
TBResizer
|
||||
bitmap resizer.png
|
||||
TBInlineSelect
|
||||
max-width 110
|
||||
TBDimmer
|
||||
background-color #00000088
|
||||
|
||||
TBProgressSpinner
|
||||
min-width 28
|
||||
min-height 28
|
||||
TBProgressSpinner.fg
|
||||
bitmap progress_spinner_strip.png
|
||||
|
||||
# The TBList header is always disabled, thus gets slightly less opacity default.
|
||||
TBList.header
|
||||
|
||||
arrow.left: type: Image, bitmap: arrow_left.png, min-width: 5, min-height: 10
|
||||
arrow.right: type: Image, bitmap: arrow_right.png, min-width: 5, min-height: 10
|
||||
arrow.up: type: Image, bitmap: arrow_up.png, min-width: 10, min-height: 5
|
||||
arrow.down: type: Image, bitmap: arrow_down.png, min-width: 10, min-height: 5
|
||||
generic_focus
|
||||
bitmap focus_r4.png
|
||||
cut 11
|
||||
expand 4
|
After Width: | Height: | Size: 2.9 KiB |
After Width: | Height: | Size: 2.9 KiB |
After Width: | Height: | Size: 2.0 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 2.0 KiB |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 1008 B |
After Width: | Height: | Size: 1.4 KiB |
|
@ -0,0 +1,10 @@
|
|||
WindowInfo
|
||||
title @authfailed
|
||||
TBLayout
|
||||
axis y
|
||||
distribution gravity
|
||||
TBTextField
|
||||
text @authfailedtext
|
||||
TBButton
|
||||
text @ok
|
||||
id ok
|
|
@ -0,0 +1,10 @@
|
|||
WindowInfo
|
||||
title @disconnect
|
||||
TBLayout
|
||||
axis y
|
||||
distribution gravity
|
||||
TBTextField
|
||||
text @disconnecttext
|
||||
TBButton
|
||||
text @ok
|
||||
id ok
|
|
@ -0,0 +1,10 @@
|
|||
WindowInfo
|
||||
position: 0 0
|
||||
TBLayout
|
||||
axis y
|
||||
distribution gravity
|
||||
TBTextField
|
||||
text @disconnecttext
|
||||
TBButton
|
||||
text @disconnect
|
||||
id disconnect
|
|
@ -0,0 +1,36 @@
|
|||
WindowInfo
|
||||
title @connect
|
||||
TBLayout
|
||||
axis y
|
||||
distribution gravity
|
||||
TBLayout
|
||||
axis x
|
||||
gravity left right
|
||||
distribution-position right
|
||||
TBTextField
|
||||
text @email
|
||||
TBEditField
|
||||
placeholder @email
|
||||
id email
|
||||
type email
|
||||
lp
|
||||
width 400
|
||||
TBLayout
|
||||
axis x
|
||||
gravity left right
|
||||
distribution-position right
|
||||
TBTextField
|
||||
text @password
|
||||
TBEditField
|
||||
placeholder @password
|
||||
id password
|
||||
type password
|
||||
lp
|
||||
width 400
|
||||
TBLayout
|
||||
axis x
|
||||
gravity right
|
||||
distribution-position right bottom
|
||||
TBButton
|
||||
text @login
|
||||
id login
|
|
@ -0,0 +1,2 @@
|
|||
INCREASE_COOLDOWNID = 1
|
||||
HUNT_COOLDOWNID = 2
|
|
@ -0,0 +1,14 @@
|
|||
require "ai.shared"
|
||||
|
||||
function rabbitStayAlive (parentnode)
|
||||
parentnode:addNode("Steer(SelectionFlee)", "fleefromhunter"):setCondition("And(Filter(SelectNpcsOfTypes{ANIMAL_WOLF}),IsCloseToSelection{10})")
|
||||
end
|
||||
|
||||
function rabbit ()
|
||||
local name = "ANIMAL_RABBIT"
|
||||
local rootNode = AI.createTree(name):createRoot("PrioritySelector", name)
|
||||
rabbitStayAlive(rootNode)
|
||||
increasePopulation(rootNode)
|
||||
idle(rootNode)
|
||||
die(rootNode)
|
||||
end
|
|
@ -0,0 +1,37 @@
|
|||
require "ai.constants"
|
||||
|
||||
function increasePopulation (parentnode)
|
||||
local parallel = parentnode:addNode("Parallel", "increasepopulation")
|
||||
parallel:setCondition("And(Not(IsOnCooldown{".. INCREASE_COOLDOWNID .."}),Filter(SelectIncreasePartner{".. INCREASE_COOLDOWNID .."}))")
|
||||
|
||||
parallel:addNode("Steer(SelectionSeek)", "followincreasepartner")
|
||||
local spawn = parallel:addNode("Parallel", "spawn")
|
||||
spawn:setCondition("IsCloseToSelection{1}")
|
||||
|
||||
spawn:addNode("Spawn", "spawn")
|
||||
spawn:addNode("TriggerCooldown{".. INCREASE_COOLDOWNID .."}", "increasecooldown")
|
||||
spawn:addNode("TriggerCooldownOnSelection{".. INCREASE_COOLDOWNID .."}", "increasecooldownonpartner")
|
||||
end
|
||||
|
||||
function hunt (parentnode)
|
||||
local parallel = parentnode:addNode("Parallel", "hunt")
|
||||
parallel:setCondition("Not(IsOnCooldown{".. HUNT_COOLDOWNID .."})")
|
||||
|
||||
parallel:addNode("Steer(SelectionSeek)", "follow"):setCondition("Filter(SelectPrey{ANIMAL_RABBIT})")
|
||||
parallel:addNode("AttackOnSelection", "attack"):setCondition("IsCloseToSelection{1}")
|
||||
parallel:addNode("SetPointOfInterest", "setpoi"):setCondition("IsCloseToSelection{1}")
|
||||
parallel:addNode("TriggerCooldown{".. HUNT_COOLDOWNID .."}", "increasecooldown"):setCondition("Not(IsSelectionAlive)")
|
||||
end
|
||||
|
||||
function idle (parentnode)
|
||||
local prio = parentnode:addNode("PrioritySelector", "walkuncrowded")
|
||||
|
||||
-- if there are too many objects (see parameter) visible of either the same npc type or the max count, leave the area
|
||||
-- otherwise walk randomly around in the area around your home position
|
||||
--prio:addNode("Steer(WanderAroundHome{100})", "wanderathome"):addCondition("Not(IsCrowded{10, 100})")
|
||||
-- if we can't walk in our home base area, we are wandering freely around to find another not crowded area
|
||||
prio:addNode("Steer(Wander)", "wanderfreely")
|
||||
end
|
||||
|
||||
function die (parentnode)
|
||||
end
|
|
@ -0,0 +1,14 @@
|
|||
require "ai.shared"
|
||||
|
||||
function wolfStayAlive (parentnode)
|
||||
end
|
||||
|
||||
function wolf ()
|
||||
local name = "ANIMAL_WOLF"
|
||||
local rootNode = AI.createTree(name):createRoot("PrioritySelector", name)
|
||||
wolfStayAlive(rootNode)
|
||||
hunt(rootNode)
|
||||
increasePopulation(rootNode)
|
||||
idle(rootNode)
|
||||
die(rootNode)
|
||||
end
|
|
@ -0,0 +1,18 @@
|
|||
function animalDefault(container)
|
||||
container:absolute("SPEED", 10.0)
|
||||
container:absolute("HEALTH", 100.0)
|
||||
container:absolute("ATTACKRANGE", 0.0)
|
||||
container:absolute("STRENGTH", 5.0)
|
||||
end
|
||||
|
||||
function init()
|
||||
local wolf = attrib.createContainer("ANIMAL_WOLF")
|
||||
animalDefault(wolf)
|
||||
wolf:absolute("ATTACKRANGE", 2.0)
|
||||
wolf:register()
|
||||
|
||||
local rabbit = attrib.createContainer("ANIMAL_RABBIT")
|
||||
animalDefault(rabbit)
|
||||
rabbit:absolute("SPEED", 9.0)
|
||||
rabbit:register()
|
||||
end
|
|
@ -0,0 +1,7 @@
|
|||
require "ai.wolf"
|
||||
require "ai.rabbit"
|
||||
|
||||
function init ()
|
||||
wolf()
|
||||
rabbit()
|
||||
end
|
|
@ -0,0 +1,47 @@
|
|||
Project Voxel
|
||||
-------------------
|
||||
|
||||
# Milestone #1
|
||||
* VoxelVolume on Server [done]
|
||||
* Network message to connect and send the server seed to create the client side world [done]
|
||||
* VoxelVolume on Client [done]
|
||||
* Render VoxelVolume on the client side [done]
|
||||
* Camera movement without clipping [done]
|
||||
|
||||
# Milestone #2
|
||||
* Network handlers for user/irrlicht movement [done]
|
||||
* Irrlich movement (clipping on the Voxels) and send movement messages to the server and back to the client [done]
|
||||
** lerping between the messages
|
||||
* Server needs some user representation [done]
|
||||
|
||||
# Milestone #3
|
||||
* NPCs [done]
|
||||
* Network messages for spawning npcs [done]
|
||||
* Network messages for npc movement [done]
|
||||
* Network handlers for spawning npcs [done]
|
||||
* Network handlers for npc movement [done]
|
||||
* Take over NPCs
|
||||
|
||||
# Milestone #4
|
||||
* Behaviour trees for a simple NPC chain (Shephard => Trader)
|
||||
* Visibility (QuadTree in the EntityStorage::update method) [done]
|
||||
|
||||
# Milestone #5
|
||||
* Login (Authentification and Authorization - see EntityStorage::login)
|
||||
* Logout -> NPC falls asleep for some time, NPC will follow BehaviourTree again after some time
|
||||
|
||||
# Milestone #6
|
||||
* Bigger worlds
|
||||
* Some sort of AMS [done]
|
||||
* Persist user data
|
||||
* Persist world data on server shutdown
|
||||
|
||||
|
||||
Voxel AMS
|
||||
-------------------
|
||||
|
||||
* Buffs/Debuffs
|
||||
* AreaEffects
|
||||
* Spells/Dispells
|
||||
* Skills
|
||||
* Cooldowns [done]
|
|
@ -0,0 +1,17 @@
|
|||
#!/usr/bin/env python
|
||||
"""fips main entry"""
|
||||
import os
|
||||
import sys
|
||||
import subprocess
|
||||
proj_path = os.path.dirname(os.path.abspath(__file__))
|
||||
fips_path = os.path.dirname(proj_path) + '/fips'
|
||||
if not os.path.isdir(fips_path) :
|
||||
print("\033[93m=== cloning fips build system to '{}':\033[0m".format(fips_path))
|
||||
subprocess.call(['git', 'clone', 'https://github.com/floooh/fips.git', fips_path])
|
||||
sys.path.insert(0,fips_path)
|
||||
try :
|
||||
from mod import fips
|
||||
except ImportError :
|
||||
print("\033[91m[ERROR]\033[0m failed to initialize fips build system in '{}'".format(proj_path))
|
||||
sys.exit(10)
|
||||
fips.run(fips_path, proj_path, sys.argv)
|
|
@ -0,0 +1,54 @@
|
|||
imports:
|
||||
fips-glm:
|
||||
git: https://github.com/floooh/fips-glm.git
|
||||
fips-accidentalnoise:
|
||||
git: https://github.com/mgerhardy/fips-accidentalnoise.git
|
||||
fips-enet:
|
||||
git: https://github.com/mgerhardy/fips-enet.git
|
||||
fips-polyvox:
|
||||
git: https://github.com/mgerhardy/fips-polyvox.git
|
||||
fips-simpleai:
|
||||
git: https://github.com/mgerhardy/fips-simpleai.git
|
||||
fips-flatbuffers:
|
||||
git: https://github.com/mgerhardy/fips-flatbuffers.git
|
||||
fips-sauce:
|
||||
git: https://github.com/mgerhardy/fips-sauce.git
|
||||
fips-googletest:
|
||||
git: https://github.com/mgerhardy/fips-googletest.git
|
||||
fips-turbobadger:
|
||||
git: https://github.com/fungos/fips-turbobadger.git
|
||||
fips-stb:
|
||||
git: https://github.com/fungos/fips-stb.git
|
||||
fips-assimp:
|
||||
git: https://github.com/fungos/fips-assimp.git
|
||||
fips-lua:
|
||||
git: https://github.com/mgerhardy/fips-lua.git
|
||||
fips-zlib:
|
||||
git: https://github.com/floooh/fips-zlib.git
|
||||
fips-noisepp:
|
||||
git: https://github.com/mgerhardy/fips-noisepp.git
|
||||
|
||||
exports:
|
||||
header-dirs:
|
||||
- src/client
|
||||
- src/server
|
||||
- src/worldgenerator
|
||||
- src/modules
|
||||
- src/modules/ui
|
||||
modules:
|
||||
core: src/modules/core
|
||||
io: src/modules/io
|
||||
video: src/modules/video
|
||||
ui: src/modules/ui
|
||||
util: src/modules/util
|
||||
network: src/modules/network
|
||||
voxel: src/modules/voxel
|
||||
attrib: src/modules/attrib
|
||||
noise: src/modules/noise
|
||||
backend: src/modules/backend
|
||||
frontend: src/modules/frontend
|
||||
client: src/client
|
||||
server: src/server
|
||||
rcon: src/rcon
|
||||
worldgenerator: src/worldgenerator
|
||||
commonlua: src/modules/commonlua
|