Initial commit
This commit is contained in:
commit
8418010c1e
10 changed files with 1099 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
game
|
61
.vscode/c_cpp_properties.json
vendored
Normal file
61
.vscode/c_cpp_properties.json
vendored
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
{
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "Win32",
|
||||||
|
"includePath": [
|
||||||
|
"C:/raylib/raylib/src/**",
|
||||||
|
"${workspaceFolder}/**"
|
||||||
|
],
|
||||||
|
"defines": [
|
||||||
|
"_DEBUG",
|
||||||
|
"UNICODE",
|
||||||
|
"_UNICODE",
|
||||||
|
"GRAPHICS_API_OPENGL_33",
|
||||||
|
"PLATFORM_DESKTOP"
|
||||||
|
],
|
||||||
|
"compilerPath": "C:/raylib/mingw/bin/gcc.exe",
|
||||||
|
"cStandard": "c99",
|
||||||
|
"cppStandard": "c++14",
|
||||||
|
"intelliSenseMode": "gcc-x64"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Mac",
|
||||||
|
"includePath": [
|
||||||
|
"<path_to_raylib>/src/**",
|
||||||
|
"${workspaceFolder}/**"
|
||||||
|
],
|
||||||
|
"defines": [
|
||||||
|
"_DEBUG",
|
||||||
|
"UNICODE",
|
||||||
|
"_UNICODE",
|
||||||
|
"GRAPHICS_API_OPENGL_33",
|
||||||
|
"PLATFORM_DESKTOP"
|
||||||
|
],
|
||||||
|
"macFrameworkPath": [
|
||||||
|
"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk/System/Library/Frameworks"
|
||||||
|
],
|
||||||
|
"compilerPath": "/usr/bin/clang",
|
||||||
|
"cStandard": "c11",
|
||||||
|
"cppStandard": "c++14",
|
||||||
|
"intelliSenseMode": "clang-x64"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Linux",
|
||||||
|
"includePath": [
|
||||||
|
"${workspaceFolder}/**"
|
||||||
|
],
|
||||||
|
"defines": [
|
||||||
|
"_DEBUG",
|
||||||
|
"UNICODE",
|
||||||
|
"_UNICODE",
|
||||||
|
"GRAPHICS_API_OPENGL_33",
|
||||||
|
"PLATFORM_DESKTOP"
|
||||||
|
],
|
||||||
|
"compilerPath": "/usr/bin/g++",
|
||||||
|
"cStandard": "c11",
|
||||||
|
"cppStandard": "c++14",
|
||||||
|
"intelliSenseMode": "gcc-x64"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"version": 4
|
||||||
|
}
|
60
.vscode/launch.json
vendored
Normal file
60
.vscode/launch.json
vendored
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
{
|
||||||
|
// Use IntelliSense to learn about possible attributes.
|
||||||
|
// Hover to view descriptions of existing attributes.
|
||||||
|
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "Debug",
|
||||||
|
"type": "cppdbg",
|
||||||
|
"request": "launch",
|
||||||
|
"program": "${workspaceFolder}/game",
|
||||||
|
"args": [],
|
||||||
|
"stopAtEntry": false,
|
||||||
|
"cwd": "${workspaceFolder}",
|
||||||
|
"environment": [],
|
||||||
|
"externalConsole": false,
|
||||||
|
"MIMode": "gdb",
|
||||||
|
"setupCommands": [
|
||||||
|
{
|
||||||
|
"description": "Enable pretty-printing for gdb",
|
||||||
|
"text": "-enable-pretty-printing",
|
||||||
|
"ignoreFailures": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"windows": {
|
||||||
|
"miDebuggerPath": "C:/raylib/mingw/bin/gdb.exe",
|
||||||
|
},
|
||||||
|
"osx": {
|
||||||
|
"MIMode": "lldb"
|
||||||
|
},
|
||||||
|
"linux": {
|
||||||
|
"miDebuggerPath": "/usr/bin/gdb",
|
||||||
|
},
|
||||||
|
"preLaunchTask": "build debug"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Run",
|
||||||
|
"type": "cppdbg",
|
||||||
|
"request": "launch",
|
||||||
|
"args": [],
|
||||||
|
"stopAtEntry": false,
|
||||||
|
"cwd": "${workspaceFolder}",
|
||||||
|
"environment": [],
|
||||||
|
"externalConsole": false,
|
||||||
|
"program": "${workspaceFolder}/game",
|
||||||
|
"MIMode": "gdb",
|
||||||
|
"windows": {
|
||||||
|
"program": "${workspaceFolder}/game.exe",
|
||||||
|
"miDebuggerPath": "C:/raylib/mingw/bin/gdb.exe"
|
||||||
|
},
|
||||||
|
"osx": {
|
||||||
|
"MIMode": "lldb"
|
||||||
|
},
|
||||||
|
"linux": {
|
||||||
|
"miDebuggerPath": "/usr/bin/gdb"
|
||||||
|
},
|
||||||
|
"preLaunchTask": "build release",
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
72
.vscode/settings.json
vendored
Normal file
72
.vscode/settings.json
vendored
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
{
|
||||||
|
"files.exclude": {
|
||||||
|
"**/.git": true,
|
||||||
|
"**/.svn": true,
|
||||||
|
"**/.hg": true,
|
||||||
|
"**/CVS": true,
|
||||||
|
"**/.DS_Store": true,
|
||||||
|
"**/*.o": true,
|
||||||
|
"**/*.exe": true,
|
||||||
|
},
|
||||||
|
"files.associations": {
|
||||||
|
"array": "cpp",
|
||||||
|
"atomic": "cpp",
|
||||||
|
"hash_map": "cpp",
|
||||||
|
"bit": "cpp",
|
||||||
|
"*.tcc": "cpp",
|
||||||
|
"cctype": "cpp",
|
||||||
|
"chrono": "cpp",
|
||||||
|
"clocale": "cpp",
|
||||||
|
"cmath": "cpp",
|
||||||
|
"compare": "cpp",
|
||||||
|
"concepts": "cpp",
|
||||||
|
"condition_variable": "cpp",
|
||||||
|
"cstdarg": "cpp",
|
||||||
|
"cstddef": "cpp",
|
||||||
|
"cstdint": "cpp",
|
||||||
|
"cstdio": "cpp",
|
||||||
|
"cstdlib": "cpp",
|
||||||
|
"cstring": "cpp",
|
||||||
|
"ctime": "cpp",
|
||||||
|
"cwchar": "cpp",
|
||||||
|
"cwctype": "cpp",
|
||||||
|
"deque": "cpp",
|
||||||
|
"list": "cpp",
|
||||||
|
"map": "cpp",
|
||||||
|
"unordered_map": "cpp",
|
||||||
|
"vector": "cpp",
|
||||||
|
"exception": "cpp",
|
||||||
|
"algorithm": "cpp",
|
||||||
|
"functional": "cpp",
|
||||||
|
"iterator": "cpp",
|
||||||
|
"memory": "cpp",
|
||||||
|
"memory_resource": "cpp",
|
||||||
|
"numeric": "cpp",
|
||||||
|
"optional": "cpp",
|
||||||
|
"random": "cpp",
|
||||||
|
"ratio": "cpp",
|
||||||
|
"string": "cpp",
|
||||||
|
"string_view": "cpp",
|
||||||
|
"system_error": "cpp",
|
||||||
|
"tuple": "cpp",
|
||||||
|
"type_traits": "cpp",
|
||||||
|
"utility": "cpp",
|
||||||
|
"initializer_list": "cpp",
|
||||||
|
"iosfwd": "cpp",
|
||||||
|
"iostream": "cpp",
|
||||||
|
"istream": "cpp",
|
||||||
|
"limits": "cpp",
|
||||||
|
"mutex": "cpp",
|
||||||
|
"new": "cpp",
|
||||||
|
"ostream": "cpp",
|
||||||
|
"ranges": "cpp",
|
||||||
|
"sstream": "cpp",
|
||||||
|
"stdexcept": "cpp",
|
||||||
|
"stop_token": "cpp",
|
||||||
|
"streambuf": "cpp",
|
||||||
|
"thread": "cpp",
|
||||||
|
"cinttypes": "cpp",
|
||||||
|
"typeinfo": "cpp",
|
||||||
|
"valarray": "cpp"
|
||||||
|
}
|
||||||
|
}
|
67
.vscode/tasks.json
vendored
Normal file
67
.vscode/tasks.json
vendored
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
{
|
||||||
|
// See https://go.microsoft.com/fwlink/?LinkId=733558
|
||||||
|
// for the documentation about the tasks.json format
|
||||||
|
"version": "2.0.0",
|
||||||
|
"tasks": [
|
||||||
|
{
|
||||||
|
"label": "build debug",
|
||||||
|
"type": "process",
|
||||||
|
"command": "make",
|
||||||
|
"args": [
|
||||||
|
"PLATFORM=PLATFORM_DESKTOP",
|
||||||
|
"BUILD_MODE=DEBUG"
|
||||||
|
],
|
||||||
|
"windows": {
|
||||||
|
"command": "C:/raylib/mingw/bin/mingw32-make.exe",
|
||||||
|
"args": [
|
||||||
|
"RAYLIB_PATH=C:/raylib/raylib",
|
||||||
|
"PROJECT_NAME=${fileBasenameNoExtension}",
|
||||||
|
"OBJS=${fileBasenameNoExtension}.c",
|
||||||
|
"BUILD_MODE=DEBUG"
|
||||||
|
],
|
||||||
|
},
|
||||||
|
"osx": {
|
||||||
|
"args": [
|
||||||
|
"RAYLIB_PATH=<path_to_raylib>/raylib",
|
||||||
|
"PROJECT_NAME=${fileBasenameNoExtension}",
|
||||||
|
"OBJS=${fileBasenameNoExtension}.c",
|
||||||
|
"BUILD_MODE=DEBUG"
|
||||||
|
],
|
||||||
|
},
|
||||||
|
"group": {
|
||||||
|
"kind": "build",
|
||||||
|
"isDefault": true
|
||||||
|
},
|
||||||
|
"problemMatcher": [
|
||||||
|
"$gcc"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "build release",
|
||||||
|
"type": "process",
|
||||||
|
"command": "make",
|
||||||
|
"args": [
|
||||||
|
"PLATFORM=PLATFORM_DESKTOP",
|
||||||
|
],
|
||||||
|
"windows": {
|
||||||
|
"command": "C:/raylib/mingw/bin/mingw32-make.exe",
|
||||||
|
"args": [
|
||||||
|
"RAYLIB_PATH=C:/raylib/raylib",
|
||||||
|
"PROJECT_NAME=${fileBasenameNoExtension}",
|
||||||
|
"OBJS=${fileBasenameNoExtension}.c"
|
||||||
|
],
|
||||||
|
},
|
||||||
|
"osx": {
|
||||||
|
"args": [
|
||||||
|
"RAYLIB_PATH=<path_to_raylib>/raylib",
|
||||||
|
"PROJECT_NAME=${fileBasenameNoExtension}",
|
||||||
|
"OBJS=${fileBasenameNoExtension}.c"
|
||||||
|
],
|
||||||
|
},
|
||||||
|
"group": "build",
|
||||||
|
"problemMatcher": [
|
||||||
|
"$gcc"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
409
Makefile
Normal file
409
Makefile
Normal file
|
@ -0,0 +1,409 @@
|
||||||
|
#**************************************************************************************************
|
||||||
|
#
|
||||||
|
# raylib makefile for Desktop platforms, Raspberry Pi, Android and HTML5
|
||||||
|
#
|
||||||
|
# Copyright (c) 2013-2019 Ramon Santamaria (@raysan5)
|
||||||
|
#
|
||||||
|
# This software is provided "as-is", without any express or implied warranty. In no event
|
||||||
|
# will the authors be held liable for any damages arising from the use of this software.
|
||||||
|
#
|
||||||
|
# Permission is granted to anyone to use this software for any purpose, including commercial
|
||||||
|
# applications, and to alter it and redistribute it freely, subject to the following restrictions:
|
||||||
|
#
|
||||||
|
# 1. The origin of this software must not be misrepresented; you must not claim that you
|
||||||
|
# wrote the original software. If you use this software in a product, an acknowledgment
|
||||||
|
# in the product documentation would be appreciated but is not required.
|
||||||
|
#
|
||||||
|
# 2. Altered source versions must be plainly marked as such, and must not be misrepresented
|
||||||
|
# as being the original software.
|
||||||
|
#
|
||||||
|
# 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
#
|
||||||
|
#**************************************************************************************************
|
||||||
|
|
||||||
|
.PHONY: all clean
|
||||||
|
|
||||||
|
# Define required raylib variables
|
||||||
|
PROJECT_NAME ?= game
|
||||||
|
RAYLIB_VERSION ?= 2.5.0
|
||||||
|
RAYLIB_API_VERSION ?= 251
|
||||||
|
RAYLIB_PATH ?= ..\..
|
||||||
|
|
||||||
|
# Define compiler path on Windows
|
||||||
|
COMPILER_PATH ?= C:/raylib/mingw/bin
|
||||||
|
|
||||||
|
# Define default options
|
||||||
|
# One of PLATFORM_DESKTOP, PLATFORM_RPI, PLATFORM_ANDROID, PLATFORM_WEB
|
||||||
|
PLATFORM ?= PLATFORM_DESKTOP
|
||||||
|
|
||||||
|
# Locations of your newly installed library and associated headers. See ../src/Makefile
|
||||||
|
# On Linux, if you have installed raylib but cannot compile the examples, check that
|
||||||
|
# the *_INSTALL_PATH values here are the same as those in src/Makefile or point to known locations.
|
||||||
|
# To enable system-wide compile-time and runtime linking to libraylib.so, run ../src/$ sudo make install RAYLIB_LIBTYPE_SHARED.
|
||||||
|
# To enable compile-time linking to a special version of libraylib.so, change these variables here.
|
||||||
|
# To enable runtime linking to a special version of libraylib.so, see EXAMPLE_RUNTIME_PATH below.
|
||||||
|
# If there is a libraylib in both EXAMPLE_RUNTIME_PATH and RAYLIB_INSTALL_PATH, at runtime,
|
||||||
|
# the library at EXAMPLE_RUNTIME_PATH, if present, will take precedence over the one at RAYLIB_INSTALL_PATH.
|
||||||
|
# RAYLIB_INSTALL_PATH should be the desired full path to libraylib. No relative paths.
|
||||||
|
DESTDIR ?= /usr/local
|
||||||
|
RAYLIB_INSTALL_PATH ?= $(DESTDIR)/lib
|
||||||
|
# RAYLIB_H_INSTALL_PATH locates the installed raylib header and associated source files.
|
||||||
|
RAYLIB_H_INSTALL_PATH ?= $(DESTDIR)/include
|
||||||
|
|
||||||
|
# Library type used for raylib: STATIC (.a) or SHARED (.so/.dll)
|
||||||
|
RAYLIB_LIBTYPE ?= STATIC
|
||||||
|
|
||||||
|
# Build mode for project: DEBUG or RELEASE
|
||||||
|
BUILD_MODE ?= RELEASE
|
||||||
|
|
||||||
|
# Use external GLFW library instead of rglfw module
|
||||||
|
# TODO: Review usage on Linux. Target version of choice. Switch on -lglfw or -lglfw3
|
||||||
|
USE_EXTERNAL_GLFW ?= FALSE
|
||||||
|
|
||||||
|
# Use Wayland display server protocol on Linux desktop
|
||||||
|
# by default it uses X11 windowing system
|
||||||
|
USE_WAYLAND_DISPLAY ?= FALSE
|
||||||
|
|
||||||
|
# Determine PLATFORM_OS in case PLATFORM_DESKTOP selected
|
||||||
|
ifeq ($(PLATFORM),PLATFORM_DESKTOP)
|
||||||
|
# No uname.exe on MinGW!, but OS=Windows_NT on Windows!
|
||||||
|
# ifeq ($(UNAME),Msys) -> Windows
|
||||||
|
ifeq ($(OS),Windows_NT)
|
||||||
|
PLATFORM_OS=WINDOWS
|
||||||
|
export PATH := $(COMPILER_PATH):$(PATH)
|
||||||
|
else
|
||||||
|
UNAMEOS=$(shell uname)
|
||||||
|
ifeq ($(UNAMEOS),Linux)
|
||||||
|
PLATFORM_OS=LINUX
|
||||||
|
endif
|
||||||
|
ifeq ($(UNAMEOS),FreeBSD)
|
||||||
|
PLATFORM_OS=BSD
|
||||||
|
endif
|
||||||
|
ifeq ($(UNAMEOS),OpenBSD)
|
||||||
|
PLATFORM_OS=BSD
|
||||||
|
endif
|
||||||
|
ifeq ($(UNAMEOS),NetBSD)
|
||||||
|
PLATFORM_OS=BSD
|
||||||
|
endif
|
||||||
|
ifeq ($(UNAMEOS),DragonFly)
|
||||||
|
PLATFORM_OS=BSD
|
||||||
|
endif
|
||||||
|
ifeq ($(UNAMEOS),Darwin)
|
||||||
|
PLATFORM_OS=OSX
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
ifeq ($(PLATFORM),PLATFORM_RPI)
|
||||||
|
UNAMEOS=$(shell uname)
|
||||||
|
ifeq ($(UNAMEOS),Linux)
|
||||||
|
PLATFORM_OS=LINUX
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
# RAYLIB_PATH adjustment for different platforms.
|
||||||
|
# If using GNU make, we can get the full path to the top of the tree. Windows? BSD?
|
||||||
|
# Required for ldconfig or other tools that do not perform path expansion.
|
||||||
|
ifeq ($(PLATFORM),PLATFORM_DESKTOP)
|
||||||
|
ifeq ($(PLATFORM_OS),LINUX)
|
||||||
|
RAYLIB_PREFIX ?= ..
|
||||||
|
RAYLIB_PATH = $(realpath $(RAYLIB_PREFIX))
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
# Default path for raylib on Raspberry Pi, if installed in different path, update it!
|
||||||
|
# This is not currently used by src/Makefile. Not sure of its origin or usage. Refer to wiki.
|
||||||
|
# TODO: update install: target in src/Makefile for RPI, consider relation to LINUX.
|
||||||
|
ifeq ($(PLATFORM),PLATFORM_RPI)
|
||||||
|
RAYLIB_PATH ?= /home/pi/raylib
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(PLATFORM),PLATFORM_WEB)
|
||||||
|
# Emscripten required variables
|
||||||
|
EMSDK_PATH ?= C:/emsdk
|
||||||
|
EMSCRIPTEN_VERSION ?= 1.38.31
|
||||||
|
CLANG_VERSION = e$(EMSCRIPTEN_VERSION)_64bit
|
||||||
|
PYTHON_VERSION = 2.7.13.1_64bit\python-2.7.13.amd64
|
||||||
|
NODE_VERSION = 8.9.1_64bit
|
||||||
|
export PATH = $(EMSDK_PATH);$(EMSDK_PATH)\clang\$(CLANG_VERSION);$(EMSDK_PATH)\node\$(NODE_VERSION)\bin;$(EMSDK_PATH)\python\$(PYTHON_VERSION);$(EMSDK_PATH)\emscripten\$(EMSCRIPTEN_VERSION);C:\raylib\MinGW\bin:$$(PATH)
|
||||||
|
EMSCRIPTEN = $(EMSDK_PATH)\emscripten\$(EMSCRIPTEN_VERSION)
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Define raylib release directory for compiled library.
|
||||||
|
# RAYLIB_RELEASE_PATH points to provided binaries or your freshly built version
|
||||||
|
RAYLIB_RELEASE_PATH ?= $(RAYLIB_PATH)/src
|
||||||
|
|
||||||
|
# EXAMPLE_RUNTIME_PATH embeds a custom runtime location of libraylib.so or other desired libraries
|
||||||
|
# into each example binary compiled with RAYLIB_LIBTYPE=SHARED. It defaults to RAYLIB_RELEASE_PATH
|
||||||
|
# so that these examples link at runtime with your version of libraylib.so in ../release/libs/linux
|
||||||
|
# without formal installation from ../src/Makefile. It aids portability and is useful if you have
|
||||||
|
# multiple versions of raylib, have raylib installed to a non-standard location, or want to
|
||||||
|
# bundle libraylib.so with your game. Change it to your liking.
|
||||||
|
# NOTE: If, at runtime, there is a libraylib.so at both EXAMPLE_RUNTIME_PATH and RAYLIB_INSTALL_PATH,
|
||||||
|
# The library at EXAMPLE_RUNTIME_PATH, if present, will take precedence over RAYLIB_INSTALL_PATH,
|
||||||
|
# Implemented for LINUX below with CFLAGS += -Wl,-rpath,$(EXAMPLE_RUNTIME_PATH)
|
||||||
|
# To see the result, run readelf -d core/core_basic_window; looking at the RPATH or RUNPATH attribute.
|
||||||
|
# To see which libraries a built example is linking to, ldd core/core_basic_window;
|
||||||
|
# Look for libraylib.so.1 => $(RAYLIB_INSTALL_PATH)/libraylib.so.1 or similar listing.
|
||||||
|
EXAMPLE_RUNTIME_PATH ?= $(RAYLIB_RELEASE_PATH)
|
||||||
|
|
||||||
|
# Define default C compiler: gcc
|
||||||
|
# NOTE: define g++ compiler if using C++
|
||||||
|
CC = g++
|
||||||
|
|
||||||
|
ifeq ($(PLATFORM),PLATFORM_DESKTOP)
|
||||||
|
ifeq ($(PLATFORM_OS),OSX)
|
||||||
|
# OSX default compiler
|
||||||
|
CC = clang
|
||||||
|
endif
|
||||||
|
ifeq ($(PLATFORM_OS),BSD)
|
||||||
|
# FreeBSD, OpenBSD, NetBSD, DragonFly default compiler
|
||||||
|
CC = clang
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
ifeq ($(PLATFORM),PLATFORM_RPI)
|
||||||
|
ifeq ($(USE_RPI_CROSS_COMPILER),TRUE)
|
||||||
|
# Define RPI cross-compiler
|
||||||
|
#CC = armv6j-hardfloat-linux-gnueabi-gcc
|
||||||
|
CC = $(RPI_TOOLCHAIN)/bin/arm-linux-gnueabihf-gcc
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
ifeq ($(PLATFORM),PLATFORM_WEB)
|
||||||
|
# HTML5 emscripten compiler
|
||||||
|
# WARNING: To compile to HTML5, code must be redesigned
|
||||||
|
# to use emscripten.h and emscripten_set_main_loop()
|
||||||
|
CC = emcc
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Define default make program: Mingw32-make
|
||||||
|
MAKE = mingw32-make
|
||||||
|
|
||||||
|
ifeq ($(PLATFORM),PLATFORM_DESKTOP)
|
||||||
|
ifeq ($(PLATFORM_OS),LINUX)
|
||||||
|
MAKE = make
|
||||||
|
endif
|
||||||
|
ifeq ($(PLATFORM_OS),OSX)
|
||||||
|
MAKE = make
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Define compiler flags:
|
||||||
|
# -O0 defines optimization level (no optimization, better for debugging)
|
||||||
|
# -O1 defines optimization level
|
||||||
|
# -g include debug information on compilation
|
||||||
|
# -s strip unnecessary data from build -> do not use in debug builds
|
||||||
|
# -Wall turns on most, but not all, compiler warnings
|
||||||
|
# -std=c99 defines C language mode (standard C from 1999 revision)
|
||||||
|
# -std=gnu99 defines C language mode (GNU C from 1999 revision)
|
||||||
|
# -Wno-missing-braces ignore invalid warning (GCC bug 53119)
|
||||||
|
# -D_DEFAULT_SOURCE use with -std=c99 on Linux and PLATFORM_WEB, required for timespec
|
||||||
|
CFLAGS += -Wall -std=c++14 -D_DEFAULT_SOURCE -Wno-missing-braces
|
||||||
|
|
||||||
|
ifeq ($(BUILD_MODE),DEBUG)
|
||||||
|
CFLAGS += -g -O0
|
||||||
|
else
|
||||||
|
CFLAGS += -s -O1
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Additional flags for compiler (if desired)
|
||||||
|
#CFLAGS += -Wextra -Wmissing-prototypes -Wstrict-prototypes
|
||||||
|
ifeq ($(PLATFORM),PLATFORM_DESKTOP)
|
||||||
|
ifeq ($(PLATFORM_OS),WINDOWS)
|
||||||
|
# resource file contains windows executable icon and properties
|
||||||
|
# -Wl,--subsystem,windows hides the console window
|
||||||
|
CFLAGS += $(RAYLIB_PATH)/src/raylib.rc.data -Wl,--subsystem,windows
|
||||||
|
endif
|
||||||
|
ifeq ($(PLATFORM_OS),LINUX)
|
||||||
|
ifeq ($(RAYLIB_LIBTYPE),STATIC)
|
||||||
|
CFLAGS += -D_DEFAULT_SOURCE
|
||||||
|
endif
|
||||||
|
ifeq ($(RAYLIB_LIBTYPE),SHARED)
|
||||||
|
# Explicitly enable runtime link to libraylib.so
|
||||||
|
CFLAGS += -Wl,-rpath,$(EXAMPLE_RUNTIME_PATH)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
ifeq ($(PLATFORM),PLATFORM_RPI)
|
||||||
|
CFLAGS += -std=gnu99
|
||||||
|
endif
|
||||||
|
ifeq ($(PLATFORM),PLATFORM_WEB)
|
||||||
|
# -Os # size optimization
|
||||||
|
# -O2 # optimization level 2, if used, also set --memory-init-file 0
|
||||||
|
# -s USE_GLFW=3 # Use glfw3 library (context/input management)
|
||||||
|
# -s ALLOW_MEMORY_GROWTH=1 # to allow memory resizing -> WARNING: Audio buffers could FAIL!
|
||||||
|
# -s TOTAL_MEMORY=16777216 # to specify heap memory size (default = 16MB)
|
||||||
|
# -s USE_PTHREADS=1 # multithreading support
|
||||||
|
# -s WASM=0 # disable Web Assembly, emitted by default
|
||||||
|
# -s EMTERPRETIFY=1 # enable emscripten code interpreter (very slow)
|
||||||
|
# -s EMTERPRETIFY_ASYNC=1 # support synchronous loops by emterpreter
|
||||||
|
# -s FORCE_FILESYSTEM=1 # force filesystem to load/save files data
|
||||||
|
# -s ASSERTIONS=1 # enable runtime checks for common memory allocation errors (-O1 and above turn it off)
|
||||||
|
# --profiling # include information for code profiling
|
||||||
|
# --memory-init-file 0 # to avoid an external memory initialization code file (.mem)
|
||||||
|
# --preload-file resources # specify a resources folder for data compilation
|
||||||
|
CFLAGS += -Os -s USE_GLFW=3 -s TOTAL_MEMORY=16777216 --preload-file resources
|
||||||
|
ifeq ($(BUILD_MODE), DEBUG)
|
||||||
|
CFLAGS += -s ASSERTIONS=1 --profiling
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Define a custom shell .html and output extension
|
||||||
|
CFLAGS += --shell-file $(RAYLIB_PATH)/src/shell.html
|
||||||
|
EXT = .html
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Define include paths for required headers
|
||||||
|
# NOTE: Several external required libraries (stb and others)
|
||||||
|
INCLUDE_PATHS = -I. -I$(RAYLIB_PATH)/src -I$(RAYLIB_PATH)/src/external
|
||||||
|
|
||||||
|
# Define additional directories containing required header files
|
||||||
|
ifeq ($(PLATFORM),PLATFORM_RPI)
|
||||||
|
# RPI required libraries
|
||||||
|
INCLUDE_PATHS += -I/opt/vc/include
|
||||||
|
INCLUDE_PATHS += -I/opt/vc/include/interface/vmcs_host/linux
|
||||||
|
INCLUDE_PATHS += -I/opt/vc/include/interface/vcos/pthreads
|
||||||
|
endif
|
||||||
|
ifeq ($(PLATFORM),PLATFORM_DESKTOP)
|
||||||
|
ifeq ($(PLATFORM_OS),BSD)
|
||||||
|
# Consider -L$(RAYLIB_H_INSTALL_PATH)
|
||||||
|
INCLUDE_PATHS += -I/usr/local/include
|
||||||
|
endif
|
||||||
|
ifeq ($(PLATFORM_OS),LINUX)
|
||||||
|
# Reset everything.
|
||||||
|
# Precedence: immediately local, installed version, raysan5 provided libs -I$(RAYLIB_H_INSTALL_PATH) -I$(RAYLIB_PATH)/release/include
|
||||||
|
INCLUDE_PATHS = -I$(RAYLIB_H_INSTALL_PATH) -isystem. -isystem$(RAYLIB_PATH)/src -isystem$(RAYLIB_PATH)/release/include -isystem$(RAYLIB_PATH)/src/external
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Define library paths containing required libs.
|
||||||
|
LDFLAGS = -L. -L$(RAYLIB_RELEASE_PATH) -L$(RAYLIB_PATH)/src
|
||||||
|
|
||||||
|
ifeq ($(PLATFORM),PLATFORM_DESKTOP)
|
||||||
|
ifeq ($(PLATFORM_OS),BSD)
|
||||||
|
# Consider -L$(RAYLIB_INSTALL_PATH)
|
||||||
|
LDFLAGS += -L. -Lsrc -L/usr/local/lib
|
||||||
|
endif
|
||||||
|
ifeq ($(PLATFORM_OS),LINUX)
|
||||||
|
# Reset everything.
|
||||||
|
# Precedence: immediately local, installed version, raysan5 provided libs
|
||||||
|
LDFLAGS = -L. -L$(RAYLIB_INSTALL_PATH) -L$(RAYLIB_RELEASE_PATH)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(PLATFORM),PLATFORM_RPI)
|
||||||
|
LDFLAGS += -L/opt/vc/lib
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Define any libraries required on linking
|
||||||
|
# if you want to link libraries (libname.so or libname.a), use the -lname
|
||||||
|
ifeq ($(PLATFORM),PLATFORM_DESKTOP)
|
||||||
|
ifeq ($(PLATFORM_OS),WINDOWS)
|
||||||
|
# Libraries for Windows desktop compilation
|
||||||
|
# NOTE: WinMM library required to set high-res timer resolution
|
||||||
|
LDLIBS = -lraylib -lopengl32 -lgdi32 -lwinmm
|
||||||
|
# Required for physac examples
|
||||||
|
#LDLIBS += -static -lpthread
|
||||||
|
endif
|
||||||
|
ifeq ($(PLATFORM_OS),LINUX)
|
||||||
|
# Libraries for Debian GNU/Linux desktop compiling
|
||||||
|
# NOTE: Required packages: libegl1-mesa-dev
|
||||||
|
LDLIBS = -lraylib -lGL -lm -lpthread -ldl -lrt
|
||||||
|
|
||||||
|
# On X11 requires also below libraries
|
||||||
|
LDLIBS += -lX11
|
||||||
|
# NOTE: It seems additional libraries are not required any more, latest GLFW just dlopen them
|
||||||
|
#LDLIBS += -lXrandr -lXinerama -lXi -lXxf86vm -lXcursor
|
||||||
|
|
||||||
|
# On Wayland windowing system, additional libraries requires
|
||||||
|
ifeq ($(USE_WAYLAND_DISPLAY),TRUE)
|
||||||
|
LDLIBS += -lwayland-client -lwayland-cursor -lwayland-egl -lxkbcommon
|
||||||
|
endif
|
||||||
|
# Explicit link to libc
|
||||||
|
ifeq ($(RAYLIB_LIBTYPE),SHARED)
|
||||||
|
LDLIBS += -lc
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
ifeq ($(PLATFORM_OS),OSX)
|
||||||
|
# Libraries for OSX 10.9 desktop compiling
|
||||||
|
# NOTE: Required packages: libopenal-dev libegl1-mesa-dev
|
||||||
|
LDLIBS = -lraylib -framework OpenGL -framework OpenAL -framework Cocoa
|
||||||
|
endif
|
||||||
|
ifeq ($(PLATFORM_OS),BSD)
|
||||||
|
# Libraries for FreeBSD, OpenBSD, NetBSD, DragonFly desktop compiling
|
||||||
|
# NOTE: Required packages: mesa-libs
|
||||||
|
LDLIBS = -lraylib -lGL -lpthread -lm
|
||||||
|
|
||||||
|
# On XWindow requires also below libraries
|
||||||
|
LDLIBS += -lX11 -lXrandr -lXinerama -lXi -lXxf86vm -lXcursor
|
||||||
|
endif
|
||||||
|
ifeq ($(USE_EXTERNAL_GLFW),TRUE)
|
||||||
|
# NOTE: It could require additional packages installed: libglfw3-dev
|
||||||
|
LDLIBS += -lglfw
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
ifeq ($(PLATFORM),PLATFORM_RPI)
|
||||||
|
# Libraries for Raspberry Pi compiling
|
||||||
|
# NOTE: Required packages: libasound2-dev (ALSA)
|
||||||
|
LDLIBS = -lraylib -lbrcmGLESv2 -lbrcmEGL -lpthread -lrt -lm -lbcm_host -ldl
|
||||||
|
endif
|
||||||
|
ifeq ($(PLATFORM),PLATFORM_WEB)
|
||||||
|
# Libraries for web (HTML5) compiling
|
||||||
|
LDLIBS = $(RAYLIB_RELEASE_PATH)/libraylib.bc
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Define a recursive wildcard function
|
||||||
|
rwildcard=$(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2) $(filter $(subst *,%,$2),$d))
|
||||||
|
|
||||||
|
# Define all source files required
|
||||||
|
SRC_DIR = src
|
||||||
|
OBJ_DIR = obj
|
||||||
|
|
||||||
|
# Define all object files from source files
|
||||||
|
SRC = $(call rwildcard, *.c, *.h)
|
||||||
|
#OBJS = $(SRC:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)
|
||||||
|
OBJS ?= main.cpp helpers.cpp
|
||||||
|
|
||||||
|
# For Android platform we call a custom Makefile.Android
|
||||||
|
ifeq ($(PLATFORM),PLATFORM_ANDROID)
|
||||||
|
MAKEFILE_PARAMS = -f Makefile.Android
|
||||||
|
export PROJECT_NAME
|
||||||
|
export SRC_DIR
|
||||||
|
else
|
||||||
|
MAKEFILE_PARAMS = $(PROJECT_NAME)
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Default target entry
|
||||||
|
# NOTE: We call this Makefile target or Makefile.Android target
|
||||||
|
all:
|
||||||
|
$(MAKE) $(MAKEFILE_PARAMS)
|
||||||
|
|
||||||
|
# Project target defined by PROJECT_NAME
|
||||||
|
$(PROJECT_NAME): $(OBJS)
|
||||||
|
$(CC) -o $(PROJECT_NAME)$(EXT) $(OBJS) $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)
|
||||||
|
|
||||||
|
# Compile source files
|
||||||
|
# NOTE: This pattern will compile every module defined on $(OBJS)
|
||||||
|
#%.o: %.c
|
||||||
|
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
|
||||||
|
$(CC) -c $< -o $@ $(CFLAGS) $(INCLUDE_PATHS) -D$(PLATFORM)
|
||||||
|
|
||||||
|
# Clean everything
|
||||||
|
clean:
|
||||||
|
ifeq ($(PLATFORM),PLATFORM_DESKTOP)
|
||||||
|
ifeq ($(PLATFORM_OS),WINDOWS)
|
||||||
|
del *.o *.exe /s
|
||||||
|
endif
|
||||||
|
ifeq ($(PLATFORM_OS),LINUX)
|
||||||
|
find -type f -executable | xargs file -i | grep -E 'x-object|x-archive|x-sharedlib|x-executable' | rev | cut -d ':' -f 2- | rev | xargs rm -fv
|
||||||
|
endif
|
||||||
|
ifeq ($(PLATFORM_OS),OSX)
|
||||||
|
find . -type f -perm +ugo+x -delete
|
||||||
|
rm -f *.o
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
ifeq ($(PLATFORM),PLATFORM_RPI)
|
||||||
|
find . -type f -executable -delete
|
||||||
|
rm -fv *.o
|
||||||
|
endif
|
||||||
|
ifeq ($(PLATFORM),PLATFORM_WEB)
|
||||||
|
del *.o *.html *.js
|
||||||
|
endif
|
||||||
|
@echo Cleaning done
|
||||||
|
|
172
helpers.cpp
Normal file
172
helpers.cpp
Normal file
|
@ -0,0 +1,172 @@
|
||||||
|
|
||||||
|
#include "helpers.h"
|
||||||
|
|
||||||
|
bool operator==(const Vector2 &v, const Vector2 &w)
|
||||||
|
{
|
||||||
|
return v.x == w.x and v.y == w.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector2 operator-(const Vector2 &v, const Vector2 &w)
|
||||||
|
{
|
||||||
|
return Vector2{v.x - w.x, v.y - w.y};
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector2 operator+(const Vector2 &v, const Vector2 &w)
|
||||||
|
{
|
||||||
|
return Vector2{v.x + w.x, v.y + w.y};
|
||||||
|
}
|
||||||
|
|
||||||
|
Color darkenBy(const Color &c, int amount)
|
||||||
|
{
|
||||||
|
return Color{std::max(c.r - amount, 0), std::max(c.g - amount, 0), std::max(c.b - amount, 0)};
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This fucntion tells us wether a loop pqr is clockwise, counterclockwise,
|
||||||
|
* or if they're colinear */
|
||||||
|
Orientation orientation(const Point &p, const Point &q, const Point &r)
|
||||||
|
{
|
||||||
|
Vector2 pq = p - q;
|
||||||
|
Vector2 pr = p - r;
|
||||||
|
|
||||||
|
float o = pq.x * pr.y - pr.x * pq.y;
|
||||||
|
|
||||||
|
if (o > 0)
|
||||||
|
return CW;
|
||||||
|
else if (o < 0)
|
||||||
|
return CCW;
|
||||||
|
return CL;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool sharedEndpoint(const LineSegment &s, const LineSegment &t)
|
||||||
|
{
|
||||||
|
return s.first == t.first or s.second == t.second or s.first == t.second or s.second == t.second;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This function checks if a point p is inside a rectangle of diagonal t
|
||||||
|
*/
|
||||||
|
bool insideRectangle(const LineSegment &t, const Point &p)
|
||||||
|
{
|
||||||
|
float x_min = std::min(t.first.x, t.second.x);
|
||||||
|
float y_min = std::min(t.first.y, t.second.y);
|
||||||
|
float x_max = std::max(t.first.x, t.second.x);
|
||||||
|
float y_max = std::max(t.first.y, t.second.y);
|
||||||
|
|
||||||
|
return ((p.x >= x_min and p.x <= x_max) and
|
||||||
|
(p.y >= y_min and p.y <= y_max));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool insideRectangle(const LineSegment &t, const LineSegment &s)
|
||||||
|
{
|
||||||
|
return insideRectangle(t, s.first) and insideRectangle(t, s.second);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool intersect(const LineSegment &s, const LineSegment &t)
|
||||||
|
{
|
||||||
|
int t1 = orientation(s.first, s.second, t.first);
|
||||||
|
int t2 = orientation(s.first, s.second, t.second);
|
||||||
|
int s1 = orientation(t.first, t.second, s.first);
|
||||||
|
int s2 = orientation(t.first, t.second, s.second);
|
||||||
|
|
||||||
|
// They cross at a middle point
|
||||||
|
if (t1 != t2 and s1 != s2)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
// s.first lies inside t
|
||||||
|
if (t1 == 0 and insideRectangle(t, s.first))
|
||||||
|
return true;
|
||||||
|
// s.second lies inside t
|
||||||
|
if (t2 == 0 and insideRectangle(t, s.second))
|
||||||
|
return true;
|
||||||
|
// t.first lies inside s
|
||||||
|
if (s1 == 0 and insideRectangle(s, t.first))
|
||||||
|
return true;
|
||||||
|
// t.second lies inside s
|
||||||
|
if (s2 == 0 and insideRectangle(s, t.second))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void classifyIntersection(const LineSegment &s, const LineSegment &t, Color &colour, std::string &desc)
|
||||||
|
{
|
||||||
|
colour = GRAY;
|
||||||
|
desc = "No intersection";
|
||||||
|
|
||||||
|
int t1 = orientation(s.first, s.second, t.first);
|
||||||
|
int t2 = orientation(s.first, s.second, t.second);
|
||||||
|
int s1 = orientation(t.first, t.second, s.first);
|
||||||
|
int s2 = orientation(t.first, t.second, s.second);
|
||||||
|
|
||||||
|
//Segment t has endpoints on either side of s
|
||||||
|
if ((t1 < 0) != (t2 < 0))
|
||||||
|
{
|
||||||
|
//Segment s has endpoints on either side of t
|
||||||
|
if ((s1 < 0) != (s2 < 0))
|
||||||
|
{
|
||||||
|
desc = "Intersection in a middle point (red)";
|
||||||
|
colour = RED;
|
||||||
|
}
|
||||||
|
//Segment s has just one endpoint on the line over segment t
|
||||||
|
else if ((s1 > 0) != (s2 > 0))
|
||||||
|
{
|
||||||
|
desc = "Endpoint on the intersection (green)";
|
||||||
|
colour = GREEN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//Segment t has just one endpoint on the line over segment s
|
||||||
|
else if ((t1 > 0) != (t2 > 0))
|
||||||
|
{
|
||||||
|
//Segment t and segment s share an endpoint
|
||||||
|
if (sharedEndpoint(s, t))
|
||||||
|
{
|
||||||
|
desc = "Intersection at a shared endpoint (dark green)";
|
||||||
|
colour = DARKGREEN;
|
||||||
|
}
|
||||||
|
//Segment s has endpoints on either side of t
|
||||||
|
else if ((s1 < 0) != (s2 < 0))
|
||||||
|
{
|
||||||
|
desc = "Endpoint on the intersection (green)";
|
||||||
|
colour = GREEN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//Segment t has both endpoints on the line over segment s
|
||||||
|
else if ((t1 == 0) and (t2 == 0))
|
||||||
|
{
|
||||||
|
desc = " on a shared line";
|
||||||
|
|
||||||
|
//Segment s and segment t share one endpoint
|
||||||
|
if (sharedEndpoint(s, t))
|
||||||
|
{
|
||||||
|
//Segment s and t share both endpoints
|
||||||
|
if (sharedEndpoint(s, t))
|
||||||
|
{
|
||||||
|
desc = "Full overlap (purple)";
|
||||||
|
colour = PURPLE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
desc = "Intersection at a shared endpoint (pink)";
|
||||||
|
colour = PINK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//Segment t has one endpoint inside the rectangle covering both endpoints of s
|
||||||
|
//Since t's endpoints are already on the line over s, this means having it on s
|
||||||
|
else if (insideRectangle(s, t))
|
||||||
|
{
|
||||||
|
desc = "Overlap (intersection)" + desc + " (dark blue)";
|
||||||
|
colour = DARKBLUE;
|
||||||
|
}
|
||||||
|
//Segment t has both endpoints on the line over s, but none inside s
|
||||||
|
else
|
||||||
|
{
|
||||||
|
desc = "No intersection, but" + desc + " (blue)";
|
||||||
|
colour = BLUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void classifyIntersection(const LineSegment &s, const LineSegment &t, Color &colour)
|
||||||
|
{
|
||||||
|
std::string unused;
|
||||||
|
classifyIntersection(s, t, colour, unused);
|
||||||
|
}
|
33
helpers.h
Normal file
33
helpers.h
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
|
||||||
|
#ifndef HELPERS_H
|
||||||
|
|
||||||
|
#include <utility>
|
||||||
|
#include <string>
|
||||||
|
#include <random>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
#include "raymath.h"
|
||||||
|
|
||||||
|
typedef Vector2 Point;
|
||||||
|
typedef std::pair<Point, Point> LineSegment;
|
||||||
|
|
||||||
|
enum Orientation
|
||||||
|
{
|
||||||
|
CW = 1,
|
||||||
|
CCW = -1,
|
||||||
|
CL = 0
|
||||||
|
};
|
||||||
|
|
||||||
|
bool operator==(const Vector2 &v, const Vector2 &w);
|
||||||
|
Vector2 operator-(const Vector2 &v, const Vector2 &w);
|
||||||
|
Vector2 operator+(const Vector2 &v, const Vector2 &w);
|
||||||
|
Color darkenBy(const Color &c, int amount);
|
||||||
|
Orientation orientation(const Point &p, const Point &q, const Point &r);
|
||||||
|
bool sharedEndpoint(const LineSegment &s, const LineSegment &t);
|
||||||
|
bool insideRectangle(const LineSegment &t, const Point &p);
|
||||||
|
bool insideRectangle(const LineSegment &t, const LineSegment &s);
|
||||||
|
bool intersect(const LineSegment &s, const LineSegment &t);
|
||||||
|
void classifyIntersection(const LineSegment &s, const LineSegment &t, Color &colour, std::string &desc);
|
||||||
|
void classifyIntersection(const LineSegment &s, const LineSegment &t, Color &colour);
|
||||||
|
|
||||||
|
#endif // !HELPERS_H
|
16
main.code-workspace
Normal file
16
main.code-workspace
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
{
|
||||||
|
"folders": [
|
||||||
|
{
|
||||||
|
"path": "."
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"settings": {
|
||||||
|
"files.associations": {
|
||||||
|
"raylib.h": "c",
|
||||||
|
"math.h": "c",
|
||||||
|
"blocks.h": "c",
|
||||||
|
"stdio.h": "c",
|
||||||
|
"*.m": "c"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
208
main.cpp
Normal file
208
main.cpp
Normal file
|
@ -0,0 +1,208 @@
|
||||||
|
/*******************************************************************************************
|
||||||
|
*
|
||||||
|
* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013-2020 Ramon Santamaria (@raysan5)
|
||||||
|
*
|
||||||
|
********************************************************************************************/
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <vector>
|
||||||
|
#include <set>
|
||||||
|
#include <chrono>
|
||||||
|
|
||||||
|
#include "raylib.h"
|
||||||
|
#include "helpers.h"
|
||||||
|
|
||||||
|
using time_point = std::chrono::steady_clock::time_point;
|
||||||
|
|
||||||
|
struct ColorSegment
|
||||||
|
{
|
||||||
|
LineSegment l;
|
||||||
|
Color c;
|
||||||
|
uint id;
|
||||||
|
std::set<uint> crossed_by;
|
||||||
|
};
|
||||||
|
|
||||||
|
void DrawColorSegment(const ColorSegment &cl)
|
||||||
|
{
|
||||||
|
DrawLine(cl.l.first.x, cl.l.first.y, cl.l.second.x, cl.l.second.y, cl.c);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DrawLines(const std::vector<ColorSegment> &lines)
|
||||||
|
{
|
||||||
|
for (uint i = 0; i < lines.size(); ++i)
|
||||||
|
{
|
||||||
|
DrawColorSegment(lines[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void crossLines(ColorSegment &s, ColorSegment &t)
|
||||||
|
{
|
||||||
|
Color c;
|
||||||
|
classifyIntersection(s.l, t.l, c);
|
||||||
|
|
||||||
|
s.c = c;
|
||||||
|
t.c = darkenBy(c, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
void crossingNaive(std::vector<ColorSegment> &lines)
|
||||||
|
{
|
||||||
|
bool crossed = false;
|
||||||
|
|
||||||
|
for (uint i = 0; i < lines.size(); ++i)
|
||||||
|
{
|
||||||
|
for (uint j = i + 1; j < lines.size() && !crossed; ++j)
|
||||||
|
{
|
||||||
|
bool crossed = intersect(lines[i].l, lines[j].l);
|
||||||
|
if (crossed)
|
||||||
|
{
|
||||||
|
lines[i].crossed_by.insert(j);
|
||||||
|
lines[j].crossed_by.insert(i);
|
||||||
|
lines[i].c = RED;
|
||||||
|
lines[j].c = RED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool sort_by_x(const ColorSegment &s, const ColorSegment &t)
|
||||||
|
{
|
||||||
|
return s.l.first.x < t.l.first.x;
|
||||||
|
}
|
||||||
|
|
||||||
|
void crossingSweep(std::vector<ColorSegment> &lines)
|
||||||
|
{
|
||||||
|
std::sort(lines.begin(), lines.end(), sort_by_x);
|
||||||
|
}
|
||||||
|
|
||||||
|
enum States
|
||||||
|
{
|
||||||
|
INIT = 0,
|
||||||
|
NAIVE,
|
||||||
|
SWEEP
|
||||||
|
};
|
||||||
|
|
||||||
|
States operator++(States &s)
|
||||||
|
{
|
||||||
|
if (s == SWEEP)
|
||||||
|
return s;
|
||||||
|
|
||||||
|
int si = static_cast<int>(s);
|
||||||
|
return s = static_cast<States>(++si);
|
||||||
|
}
|
||||||
|
|
||||||
|
States operator--(States &s)
|
||||||
|
{
|
||||||
|
if (s == INIT)
|
||||||
|
return s;
|
||||||
|
|
||||||
|
int si = static_cast<int>(s);
|
||||||
|
return s = static_cast<States>(--si);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
// Initialization
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
const int screenWidth = 1280;
|
||||||
|
const int screenHeight = 900;
|
||||||
|
bool close = false;
|
||||||
|
|
||||||
|
const int nols = 80; // Number of lines
|
||||||
|
|
||||||
|
// Initialize random engine
|
||||||
|
std::random_device rd;
|
||||||
|
std::mt19937_64 gen(rd()); // Delete "_64" in a 32 bit system
|
||||||
|
std::uniform_int_distribution<> distrx(0, screenWidth);
|
||||||
|
std::uniform_int_distribution<> distry(0, screenHeight);
|
||||||
|
|
||||||
|
std::vector<ColorSegment> lines, naive_lines, sweep_lines;
|
||||||
|
|
||||||
|
// Generate random lines
|
||||||
|
for (uint i = 0; i < nols; ++i)
|
||||||
|
{
|
||||||
|
LineSegment l = LineSegment{Point{distrx(gen), distry(gen)}, Point{distrx(gen), distry(gen)}};
|
||||||
|
//std::cout << "(" << l.first.x << "," << l.first.y << ") (" << l.second.x << "," << l.second.y << std::endl;
|
||||||
|
ColorSegment cl = ColorSegment{l, BLACK};
|
||||||
|
|
||||||
|
lines.push_back(cl);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy initial lines vector for each algorithm
|
||||||
|
naive_lines = lines;
|
||||||
|
sweep_lines = lines;
|
||||||
|
|
||||||
|
// Test naive algorithm
|
||||||
|
time_point begin_naive = std::chrono::steady_clock::now();
|
||||||
|
|
||||||
|
crossingNaive(naive_lines);
|
||||||
|
|
||||||
|
time_point end_naive = std::chrono::steady_clock::now();
|
||||||
|
|
||||||
|
// Test sweep algorithm
|
||||||
|
time_point begin_sweep = std::chrono::steady_clock::now();
|
||||||
|
|
||||||
|
crossingSweep(sweep_lines);
|
||||||
|
|
||||||
|
time_point end_sweep = std::chrono::steady_clock::now();
|
||||||
|
|
||||||
|
std::cout << "Naive elapsed time: " << std::chrono::duration_cast<std::chrono::nanoseconds>(end_naive - begin_naive).count() << " ns" << std::endl;
|
||||||
|
std::cout << "Sweep elapsed time: " << std::chrono::duration_cast<std::chrono::nanoseconds>(end_sweep - begin_sweep).count() << " ns" << std::endl;
|
||||||
|
|
||||||
|
States state = INIT;
|
||||||
|
|
||||||
|
InitWindow(screenWidth, screenHeight, "raylib");
|
||||||
|
|
||||||
|
SetTargetFPS(30); // Set our game to run at 60 frames-per-second
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Main game loop
|
||||||
|
while (!WindowShouldClose() and !close) // Detect window close button or ESC key
|
||||||
|
{
|
||||||
|
// Update
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
if (IsKeyPressed(KEY_RIGHT))
|
||||||
|
++state;
|
||||||
|
else if (IsKeyPressed(KEY_LEFT))
|
||||||
|
--state;
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Draw
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
BeginDrawing();
|
||||||
|
|
||||||
|
ClearBackground(RAYWHITE);
|
||||||
|
|
||||||
|
switch (state)
|
||||||
|
{
|
||||||
|
case INIT:
|
||||||
|
DrawLines(lines);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NAIVE:
|
||||||
|
DrawLines(naive_lines);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SWEEP:
|
||||||
|
DrawLines(sweep_lines);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
DrawFPS(10, 10);
|
||||||
|
|
||||||
|
EndDrawing();
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
}
|
||||||
|
|
||||||
|
// De-Initialization
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
CloseWindow(); // Close window and OpenGL context
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in a new issue