Compare commits

...

104 Commits
0.0.2 ... 0.0.6

Author SHA1 Message Date
clusterfack
1bb0227ff0 Makes Coordinates more Structy (#417)
More readonly-ish and less write-ish
2017-09-14 17:38:46 -05:00
Pieter-Jan Briers
4c2632710c Fix solution file. (#416)
I n S t A m E r G e
2017-09-14 15:13:59 -06:00
Pieter-Jan Briers
518a366c7e Attempt to fix Python on Travis being too old. (#415)
* Attempt to fix Python on Travis being too old.

* Fix RUN_THIS.py too.

* Fix CI builds blocking.

* Fix BuildChecker.csproj Python versioning in Travis.
2017-09-14 14:47:00 -06:00
clusterfack
07878ad7a7 Multiple Map System (#414)
* The million error march

This commit replaces many of the vector2's with their appropriate version of either LocalCoordinates, WorldCoordinates, or ScreenCoordinates

* Change transforms to send back worldcoordinates for position instead

* Adds coordinate class file

* What the fuck is going onnnnnn

* What the fuck is goign onnnnnnnnnnnn

* Changes some shit to use multiple maps instead
Fixes the compile errors in shared first

* Compile errors mostly fixed, about to rebase

* Merge branch 'master-wizfederation' into multiplemaps

# Conflicts:
#	SS14.Client.Graphics/CluwneLib.cs
#	SS14.Client/GameObjects/ClientEntityManager.cs
#	SS14.Client/GameObjects/Components/Renderable/AnimatedSpriteComponent.cs
#	SS14.Client/GameObjects/Components/Renderable/ItemSpriteComponent.cs
#	SS14.Client/GameObjects/Components/Renderable/ParticleSystemComponent.cs
#	SS14.Client/GameObjects/Components/Renderable/SpriteComponent.cs
#	SS14.Client/GameObjects/Components/Transform/TransformComponent.cs
#	SS14.Client/Interfaces/GameObjects/IClickTargetComponent.cs
#	SS14.Client/Placement/Modes/AlignSimilar.cs
#	SS14.Client/Placement/Modes/AlignSnapgridBorder.cs
#	SS14.Client/Placement/Modes/AlignSnapgridCenter.cs
#	SS14.Client/Placement/Modes/AlignTileAny.cs
#	SS14.Client/Placement/Modes/AlignTileEmpty.cs
#	SS14.Client/Placement/Modes/AlignTileNonSolid.cs
#	SS14.Client/Placement/Modes/AlignTileSolid.cs
#	SS14.Client/Placement/Modes/AlignWall.cs
#	SS14.Client/Placement/PlacementManager.cs
#	SS14.Server/GameObjects/ServerEntityManager.cs
#	SS14.Server/Interfaces/Player/IPlayerManager.cs
#	SS14.Server/Player/PlayerManager.cs

* Whops

* Compiles, loads somewhat, lights nonfunctional, many TODOs left

* serializes states, fixes incorrect spawn

* Fix map sending to the client

* Makes things only render on the correct zlevel

* Makes entity manager wait to intiialize shit after the maps arrive

* Fixes placement net messages

* Improves some of the placement managers, others need a bit of testing and tidying up again

* Transform fix

* Polishing, make coordinates into structs

* Remove resolved comments

* Last commit before master merge

* Fix the rest of the conflicts

* Fixes super spooky bug

* Fixes cross zlevel collisions

* Fix the rendering system to render the tile system regardless of grid location
2017-09-14 07:37:31 -06:00
Acruid
a483c8c88a Sprite Clicking Rework (#413)
* Fixed AnimatedSpriteComponent clicking, SpriteComponent is still bugged.

* Added Box2.Scale helper function.
Cleaned up the WasClicked function in AnimatedSpriteComponent.

* Renamed AABB to LocalAABB in ISpriteComponent and IRenderableComponent, so it is clearer what the property contains.
Fixed more bugs in AnimatedSpriteComponent.WasClicked(), and added exceptions.

* Fixed SpriteComponent.WasClicked().
Fixed unrelated bug in EntityManager, so entities can be properly deleted again.

* Fixed issue with sprite sorting using TextRect instead of LocalAABB.
2017-09-13 07:18:35 -06:00
Dumplin
cd74d12812 Fixed Movement; Edited OSX error message; Fixed some Sonar complaints (#410)
* * CluwneLib.cs: Make _window a local variable

* BaseCollection.cs: Formatting issue

* BaseServer.cs: Removed unused parameter

* ChatManager.cs: Made public encapsulated fields

* BoundKeyEventArgs.cs: Public encapsulated parameters

* CVarFlags.cs: Explicit variable setting

* ComponentFactory.cs: unused variable

* * CluwneLib.cs: Make _window a local variable

* BaseCollection.cs: Formatting issue

* BaseServer.cs: Removed unused parameter

* ChatManager.cs: Made public encapsulated fields

* BoundKeyEventArgs.cs: Public encapsulated parameters

* CVarFlags.cs: Explicit variable setting

* ComponentFactory.cs: unused variable

* CVar fixes

* Edited the OSX error message to be a little more helpful. (You have to edit the .dylibs because they come broken).

* Fixing the sprite movement problem

* Reverted error message

* Revert Again
2017-09-11 09:43:21 -06:00
Pieter-Jan Briers
eda5ad606b Make Sonar only run on master. (#409) 2017-09-06 22:59:30 -06:00
Pieter-Jan Briers
ddefef65ae Add our own Vector2 type. (#407)
* Add our own Vector2 type.

* Fix Clamp() typo.

* I shouldn't code when tired.

* Some unit tests.
2017-09-05 17:12:14 -06:00
Pieter-Jan Briers
062db741bd Update Mac Natives error message. (#406)
Now looks for 2.4 instead of 2.2 and suggests simply copying files instead of doing complicated InstallNameGuiTool stuff.
2017-09-05 17:11:21 -06:00
Pieter-Jan Briers
d46c2da175 Adds x64 platform targets. (#405)
Note that these won't work on Windows as that's still x86 SFML natives.
2017-09-02 21:51:08 -06:00
Acruid
1c6200666f Texture Loading Performance (#404)
* ~20% speed increase for loading textures.

* clickmap was useless, it is completely removed.
2017-09-01 14:39:40 -06:00
Acruid
c9666413b2 CluwneLib Static Variables Removal (#403)
* Changed Cluwnelib.TileSize name to CluwneLib.PixelsPerMeter. I think its more descriptive of what the name is.
Removed the splash screen debug #ifdef's, and replaced with proper ConditionalAttributes.

* Window encapsulated.

* Add the RELEASE compilation symbol to Release builds of all SS14 projects.

* More CluwneLib cleanup.
2017-09-01 14:39:27 -06:00
Pieter-Jan Briers
2575786a6e Allow deletion of entities and components during iteration. (#401)
* Allow deletion of entities and components during iteration.

* Remove some cases of _entities.Values
2017-09-01 14:07:00 -06:00
Acruid
149a6280b0 Move Lighting to SS14.Client.Graphics (#400)
* Interface to Interfaces.

* Lighting moved to SS14.Client.Graphics.

* Remove more dead code.
2017-08-31 08:21:14 -06:00
clusterfack
340d75c350 Fixes Bounding/Clicking Bugs (#396)
* Fixes Bounding/Clicking Bugs

This fixes a number of bugs with the clicking system.

- Wearable animated components were fixed so that they properly report their AABB
- Wearable animated components were fixed so that they properly use their nonwornsprite or wornsprite for checkclicking
- Fixes the clicking system only choosing the player character
- Fixes the eraser only working within a 1.5 tile range

* Uses FloatMath.CloseTo()
2017-08-29 12:03:09 -06:00
clusterfack
8d9a0e5142 Creates a Snap Checking System (#389)
* Creates a Snap Checking System

Creates a system that attempts to sanitize placement of objects when attempting to spawn them on snapping grids. This checks whether an object is trying to spawn specifically on a snap grid, and if it is checks against a snapflag of the type to see if other exclusive snappable objects are on that snap grid point.

Separates the spawnentityat into tryspawnentityat which checks for snappables, and forcespawnentityat which completely ignores that.

* Fixes the yaml placement
Fixes exemption from tryspawnentityat which didn't use the bool
Snap placement managers show when canspawnat is preventing them from spawning

* Improve snap placement managers again
Fix using prototype.name instead of prototype.ID

* Nope nope

* I need to unify these two types after the next refactor

* Move to strings for snap flags.

* Check

* 「s h i t c o d e」

* Gracias appveyor now I have seen the light

* Uses FloatMath.CloseTo() to check float equality
2017-08-29 12:01:44 -06:00
clusterfack
22f0cbd8f7 Changes CloseTo again slightly (#399) 2017-08-29 07:33:17 -06:00
clusterfack
5d443b6452 Adds closeto function for checking floating point equality (#398) 2017-08-28 18:28:33 -06:00
Acruid
83f8f37dc1 Prototypes now use ResourceManager. (#394)
* "./Resources/" folder is now mounted instead of "./" in the ResourceManager.
Prototypes now use the ResourceManager.
Added FindFiles(string path) to recursively find files in the ResourceManager.
General FileHelper bug fixing and cleanup.

* Ran SS14.Shared/ContentPack* through the code cleanup again.

* Put PJB's comma back in.
2017-08-28 17:10:15 -06:00
UristMcDorf
cc886ab614 Add required registrations in whitelist for temperature, damageable, destructible. (#393) 2017-08-28 14:21:30 +02:00
clusterfack
4273266950 Adds rendering color parameter to sprite components (#388)
* Adds rendering color parameter to sprite components

* Forgot to remove this

* Sets default value to white

* Like this you mean?
2017-08-27 10:02:11 -06:00
Acruid
658a0aee7f Entity Component Shutdown Fix. (#387)
Moved various component cleanup code from OnRemove to Shutdown.
2017-08-27 09:58:04 -06:00
Acruid
9898c2cf49 Turns INetSerializableType into NetSerializableAttribute (#386)
Turns INetSerializableType into NetSerializableAttribute.
2017-08-26 22:16:27 -06:00
Acruid
ddb5d9f3a8 NetGrapher Cleanup (#385)
Fixed bug in NetManager.
2017-08-26 22:15:36 -06:00
clusterfack
f227b3abc0 Adds grid to snap grid placement manager (#384)
* Adds grid to snap grid placement manager
Fixes drawline

* Done
2017-08-26 19:21:02 +02:00
Acruid
3920da2d9f Fixes moonwalk bug and inverted up/down controls. (#380) 2017-08-26 19:20:56 +02:00
clusterfack
bfbb31aa58 Snapgrid placement (#377)
* Snapgrid placement

* REEEEEEEEEEEE world space
2017-08-26 09:33:41 +02:00
clusterfack
799be40018 Fixes scrollable containers (#381) 2017-08-26 09:33:33 +02:00
wixoaGit
152eb8dd19 Ignore outdated state update messages (#383) 2017-08-26 09:33:23 +02:00
wixoaGit
c168c0fde1 Move client GameState management (#375)
* Move client GameState management

* Remove unnecessary sequence sending

* Move resolves to dependencies, set CurrentState instead of finding it
2017-08-25 21:21:14 +02:00
clusterfack
af3c90e2a8 Removes bad shutdown (#376)
* Undoes this

* Move it to the entity manager shutdown
2017-08-25 21:20:32 +02:00
clusterfack
12e6ef88c3 Makes Walls Entities, removes tile walls (#373)
* Makes walls into entities

* Fix the align tile empty placement mode, holy shit collision bounds is fucked

* Make shadowcasting from walls work again

* Fix lights on tiles
2017-08-24 09:38:28 -06:00
clusterfack
28d74cec56 Shifts down the mobs bounding box by 0.6 tiles. (#374) 2017-08-24 14:40:28 +02:00
Pieter-Jan Briers
02efd0b41a Made the git hooks history tolerant. (#372)
If its python file doesn't exist the hooks don't run.
2017-08-23 17:13:43 -05:00
Pieter-Jan Briers
5bf337479f Fix UnknowPrototypeException typo. (#371) 2017-08-23 16:02:36 -05:00
clusterfack
3816cdb3e4 Tiles Helper Functions (#370)
* Creates a helper function for making tile indices into tile refs, and a function to get a tileref one step in any particular direction of another tileref.

* Gottem

* k
2017-08-23 11:08:42 +02:00
Pieter-Jan Briers
e54339bb5c Make null data nodes on prototypes not call LoadData() on spawned entities. (#368) 2017-08-23 07:53:31 +02:00
Pieter-Jan Briers
98d867393c Update NUnit package version. (#367)
* Update NUnit package version.

* Let's not have Travis blow up.

* And I still messed the HintPath up.
2017-08-23 07:53:16 +02:00
Pieter-Jan Briers
8dd9a3c097 Content prefixes for the reflection manager. (#369)
Allows doing class: Prototypes.DiscoBall instead of Content.Client.Prototypes.DiscoBall
2017-08-23 07:53:04 +02:00
Pieter-Jan Briers
61d30be6b3 Lighting API cleanup. (#366) 2017-08-22 07:59:13 -06:00
Pieter-Jan Briers
7aa85c0b0c ColorUtils extensions, fixes and tests. (#365)
* Color4 extensions for byte color parts, fix WithAlpha with byte.

* Unit tests and bug fix for FromHex.
2017-08-22 07:38:29 -06:00
Pieter-Jan Briers
3574395843 Fix the entity spawn panel throwing NotImplementedException, Color -> Color4 (#364)
* Fix the entity spawn panel throwing NotImplementedException.

* More rabbit hole Color conversions.
2017-08-22 07:37:04 -06:00
Pieter-Jan Briers
13b333dcf6 Fix entity initialization. (#363) 2017-08-21 15:37:04 -06:00
Pieter-Jan Briers
bead08fc7c Fix prototype class inheritance. (#362) 2017-08-21 15:36:34 -06:00
Pieter-Jan Briers
073fb20b66 Adds a per-frame virtual entity update method. (#361) 2017-08-20 19:39:42 -06:00
Pieter-Jan Briers
7adca8280c Remove some IComponent type bounds, component shutdown event. (#360)
* Remove some IComponent type bounds, component shutdown event.

Methods like GetComponent<T> don't require T to implement IComponent anymore.

Added an event to IComponent that is invoked whenever the component is shut down.

* Always at least compile your stuff kids.
2017-08-20 19:38:20 -06:00
Gilles Coremans
61183eaba3 Fixes a sonar bug. (#359) 2017-08-20 19:37:08 -06:00
wixoaGit
477b0460e8 Implement MsgEntity (#358)
* Implement MsgEntity

* Move MsgEntity registration to GameController

* Fix serializer usage
2017-08-20 19:36:33 -06:00
Pieter-Jan Briers
dd18105c92 Remove SFML from shared and server. (#355)
* Remove SFML from shared and server.

* Fix unit tests.
2017-08-20 11:07:35 -06:00
Silver
585f2467c2 Update Linux Readme (#357) 2017-08-19 23:13:12 -06:00
Pieter-Jan Briers
0c3e4ea495 Allows inputting the server port on the client. (#354) 2017-08-19 20:19:00 -06:00
Pieter-Jan Briers
afe0c95cea Fix a race condition in collidablecomponent.OnAdd (#353) 2017-08-19 20:17:11 -06:00
PJB3005
e84f072278 Update submodule to hopefully disable SFML Sonar. 2017-08-19 13:55:31 +02:00
PJB3005
ca0bbab8c0 Attempt two. 2017-08-19 13:43:46 +02:00
PJB3005
6530b8806c Attempt to ignore SFML on Sonar 2017-08-19 13:35:57 +02:00
Pieter-Jan Briers
294057e3a1 Fix resource copying on the client. (#352) 2017-08-19 11:10:55 +02:00
Pieter-Jan Briers
a57abb2ca7 Move to our own SFML.NET fork with a submodule. (#351)
* Remove SFML binaries in repo.

* Add SFML.NET submodule from our fork.

* Get build checker for submodule handling.

* Fix project references. Remove SFML from non-client.

* Make it work!

* Automatically fetch Windows CSFML natives.

* Fix project file now I'm done debugging.

* Fix project references.

* Fix CI

* Now if only I didn't typo...

* Fix Travis too

* Fix lighting.

* Move shaders over to new API.

* Fix some obsoletions.

* Improve SetUniformArray casts
2017-08-19 10:28:39 +02:00
Pieter-Jan Briers
f0d6680977 Fix accidental integer division. (#349)
AnimatedSpriteComponent.AABB used integer division, fixed now.
2017-08-19 10:23:19 +02:00
Pieter-Jan Briers
49f7b987f5 Refactor entity initialization and fix doc comments. (#346)
Entities now initialize in a few stages. First all their components are added, then entity.PreInitialize() is called, then all components are initialized, then entity.Initialize() is called.

This multi-level initialization system should hopefully be more powerful and make things like prefetching components easier.

Also what the crap WAS the old init system even?
2017-08-19 10:19:22 +02:00
clusterfack
444d0847b6 Fixing the current placement system (#347)
* WIP: Fixing the current placement system

* Placement system sprites come back pls

* HE TURNED THE FREAKING SPRITES GAY

* TECHNICALLY THIS MAKES THE SPRITES NOT GAY

* Mostly Shows sprites correctly

* Finished this bulllllshit

* Rename some things
2017-08-19 08:59:57 +02:00
clusterfack
005bd9e95c Containers (#339)
* #Part 1

Created basic container dictionary and framework for transform parenting

##Work Left until completion

1. Registering containers through a container manager
2. Registering onmove events onto the parents event handler on insertion
3. Removing onmove events from the parent event handler on removal
4. An event called upon insertion and removal from storage objects
5. Redirecting transform getters to use the uppermost parents transform

* Part 2

Creates some basic code for removing entities generally from other entities
Creates code for creating containers
Adds some basic logic for parents overriding transform getters
Adds logic to prevent circular references
Makes Container an abstract class for things to create their own versions from

* Moves container classes to shared so they can be registered on server and client
Registers container classes on server and client
Makes ContainerManager get created properly by the component factory

* Adds missing } and finalizes csproj changes

* Add exception for double containers on one component

* Makes sure parents are attached and detached at the correct time

* Address some issues, cause others perhaps

* Rename Files
Changes Container Class Inheritance
Vague stuff

* Move Icontainer and Icontainermanagercomponent to ss14 server
Make servertransform interface for parents to be serverside only
Deregister containermanager from the client IOC

* Remove Icontainer And Icontainermanager from shared csproj

* Fix

* To get git to recognize this I have to delete them

* And then readd the files, fuck you git

* Be specific you daft cunt
2017-08-18 11:18:42 -06:00
Pieter-Jan Briers
dfcf0349ca Fix F2 on Unix, collision bug and join crash. (#348)
* Make F2 not crash on Unix, fix join crash.

* Fix collision when moving to the bottom or right.

The bug was caused by 1d5ca223de. Collision adds to the AABB's Left and Top properties to do offsets, but when moving to OpenTK, this stopped working, as Right and Bottom now had to be offset too. I missed this, and as such, your hitbox is smaller when moving to the bottom or right. This allows you to clip into walls, but when you're in you can't move the other direction, as your hitbox is also *larger* when moving to the top or left.
2017-08-18 13:07:51 +02:00
Matt Smith
45a7a809db Reduce code complexity (#345) 2017-08-18 10:54:35 +02:00
Acruid
48852c5ee8 Grid Placement Fix (#344)
* Physics works again.

* forgot some SFML stuff.

* Cluwnelib does not depend on 1.0m = 1 tile anymore.

* Fixed bug with tile placement in wrong spot.
Fixed blue box issue.
2017-08-17 15:42:44 -06:00
Acruid
60ac4a9e26 Collision Fix (#340)
* Physics works again.

* forgot some SFML stuff.
2017-08-17 23:20:12 +02:00
h3half
5351f581f1 Removes commented-out code (#343)
Removes most of the commented-out code from sonarqube. There's
definitely more hiding throughout the codebase, but this should be most
of it.
2017-08-17 11:58:37 +02:00
Pieter-Jan Briers
e719dd1440 Make the lighting toggle properly disable all lighting rendering. (#342) 2017-08-16 12:38:55 -06:00
Pieter-Jan Briers
1d5ca223de Replace SFML math types with OpenTK and custom ones. (#341)
* Attempt to messily convert the codebase to use OpenTK math.

* Vector2f is gone. It compiles!

* Fix unit tests.

* Goodbye FloatRect

* Goodbye IntRect, say hello to Box2i.
2017-08-16 11:22:48 -06:00
Silver
3170552b3d Rename LICENSE.TXT to LICENSE-CODE.TXT 2017-08-15 14:44:40 -06:00
dylanstrategie
18692e21a4 Fix issues with Menu Window (#336)
* Fix issues with Menu Window

* Requested changes
2017-08-15 14:17:57 -06:00
Acruid
ae0ccc72b4 Map Manager Refactor (#338)
* Merged Client and Server Map interfaces into a Shared version.
Merged Client and Server MapManager system into a shared version.

* Added some encapsulation to the map system.
Added doc comments to client and server classes.
It compiles, but it DOES NOT WORK.

* Now with 89% more encapsulation.
Added a MapGrid object to the MapManager.

STILL A BUGGY MESS!

* Rendering bugs were fixed.

* Fixed alignment bug with GetTilesIntersecting.

* Cleanup the interfaces a bit.

* Code update.

* Merged client/server MapNetworkManager into shared version.

* Nightly work. Compiles, does not run.

* Shared networking looks like it works.

* Cleanup and remove SFML.
2017-08-14 17:30:57 -06:00
Pieter-Jan Briers
f5eb8cd55b MSBuild MacOS handling. (#337)
* Makes MSBuild distinguish Linux and MacOS.

* Fix TargetOS

* Copy mac natives during build.

* Fix travis

* Fix typo.
2017-08-14 18:54:46 +02:00
Pieter-Jan Briers
db1c71994b Give content access to OpenTK Math and Color types. (#335) 2017-08-14 18:23:46 +02:00
Silver
96df096303 Revert "Gives content access to OpenTK math and color types. (#332)" (#334)
This reverts commit 9669221d37.
2017-08-13 21:34:56 +02:00
Pieter-Jan Briers
9669221d37 Gives content access to OpenTK math and color types. (#332) 2017-08-13 13:33:32 -06:00
Pieter-Jan Briers
480ed6d74c Fixing some compile warnings. (#331)
All the obsoletions from netmessages will be for another PR.
2017-08-13 11:30:23 -06:00
Dan
1d2614d75f Refactor align modes (#330)
* Refactor align modes

* Remove some unnessecary lines
2017-08-13 14:30:55 +02:00
Pieter-Jan Briers
1c5f540751 Remove component instantiation messages. (#324) 2017-08-13 00:46:00 +02:00
Pieter-Jan Briers
f4fe79346e Inverse entity queries. (#322)
* Inverse entity queries.

They now effectively behave like Func<IEntity, bool>.
The actual matching logic is now done on entity queries.

They've also been abstracted, as such there are now multiple entity
query types to pick from.

Also generic clean up.

* Fix doc comment on the exclude list.

* Use Predicate<> instead of Func<>

* Fix compile, Predictae<> doesn't work
2017-08-13 00:31:58 +02:00
Acruid
cb5bfbb3da Component Rework (#325)
* Cleans up base Component.

* Clean up PhysicsComponent.
Merge VelocityComponent with PhysicsComponent.

* Renamed HitBoxComponent to BoundingBoxComponent.
Cleaned up BoundingBoxComponent.
Added Box2 to the serializer and SfmlCompatibility.

* Serverside movement works.

* Removed DirectionComponent.
Everything is broke, time to sleep.

* Removed BasicMoverComponent and SlaveMoverComponent.
Added Parenting skeleton to TransformComponent.

* Move ClickAbleComponent to Input.
Fixed lights.

* More general cleanup.

* Move Physics system into Shared.

* Removed ColliderComponent.

* Fixed AnimatedSprite Rotation.

* Added Vector2i as a type.

* Fixes StackOverflow bug by just not using SFML.Vector2f.

* Should fix Build issues.

* Removed pointless server console resizing.
Fixed Unit tests working in VS.
Updated PrototypeManager_Test.cs tests.

* Adds SS14.Shared/Maths/VecMath.cs helper functions.

* Switched to Angle type.
2017-08-13 00:10:06 +02:00
Pieter-Jan Briers
f41050583e Bit of unit test stuff. (#326)
* Unit test for #294

* Remove empty warning tests.
2017-08-13 00:09:42 +02:00
clusterfack
85fa167e17 Fixes Exceptions on Rejoining (#327)
* Fix server crash on rejoin

* Makes it possible to rejoin without exception

* Proper fix by culling ALL the component lists when the entity manager shuts down
2017-08-12 10:25:33 +02:00
Pieter-Jan Briers
b9723b6504 Content repo can now define console commands. (#321) 2017-08-11 15:44:47 -06:00
Pieter-Jan Briers
2e64de57c6 Makes the main menu pretty. (#320)
>duct tape logo

INSTAMERGE
2017-08-11 14:37:31 -06:00
Pieter-Jan Briers
feaf4160e8 Load unatlassed images from disk as sprites (#319)
This'll allow content to add sprites.
2017-08-11 08:23:23 +02:00
Pieter-Jan Briers
93fd0014b4 Fix content entry invocations, whitelist types. (#317) 2017-08-09 21:50:45 -06:00
Pieter-Jan Briers
22f07e3649 Adds OS targeting to the build setup (#316)
* Adds OS targeting to the build setup

Will make cross platform builds (Linux -> Windows) easier.

* Rename Windows_NT to Windows and explicitly do Linux.
2017-08-10 00:04:31 +02:00
clusterfack
398a3917dc Returns runclient and runserver 2017-08-09 08:26:08 -05:00
Pieter-Jan Briers
04fa16902f Fix SFML memory leak. (#315) 2017-08-09 07:39:19 +02:00
Jordan Brown
b0e42ef650 Removes support for resource pack passwords (#314) 2017-08-08 21:36:53 +02:00
Pieter-Jan Briers
b0d7ee16c1 Deprecate resource pack temporarily. (#312)
* Deprecate resource pack temporarily.

Temporarily being until we actually need content downloading from server.
Resources now get copied to the output directories directly.

* Move prototypes around.
2017-08-08 14:48:15 +02:00
Pieter-Jan Briers
b9ece2888b Repo cleanup (#310)
* Reduce build size by removing redundant files.

22 MB of the build output was OpenTK.xml, the doc file for it.
This commit removes a lot of files like PDB files from the build output
on Release, cutting build size down to 13 MB.

Also deleted a ton of dead third party files in Third-Party, and the two
spare copies of CSFML...

* Remove more dead files.

* Even more!

* Generic repo cleanup. Removing dead files all over.

What the hell was filesystemeditor.exe supposed to be?
2017-08-08 12:47:31 +02:00
Pieter-Jan Briers
d1b29a6f94 Update NetSerializer, move to NuGet with it. (#311)
NetSerializer has been updated and moved to the latest version. This
means that the static nonsense it previously had is fixed and we can
properly use ISS14Serializer.
2017-08-08 12:47:18 +02:00
clusterfack
a43da12f9b Fixes a rare out of bounds exception (#313)
* Fixes a rare crash

Fixes a crash that occurs from the following
>return AngleDirections[(int)Math.Floor(angle/45f)];

System.IndexOutOfRangeException: 'Index was outside the bounds of the array.'

That occurs most likely due to a float rounding error

* Apparently this works fine
2017-08-08 11:51:38 +02:00
Pieter-Jan Briers
4607a106d0 Of course it works a lot different on the client. 2017-08-06 14:47:20 +02:00
Pieter-Jan Briers
de9fd0cbaf Fix resource pack on client, regression in #306 2017-08-06 12:56:12 +02:00
Acruid
2e3315cd39 CompState Cleanup (#308)
* Changed GameObjects.Component namespace back to GameObjects.Components namespace to prevent colliding with GameObjects.Component class.

* Changed IComponent.HandleComponentState to use polymorphism instead of dynamic keyword.
Cleaned up nesting in each implementation of IComponent.HandleComponentState.

* Moved all shared ComponentStates to the SS14.Shared.GameObjects namespace to be more in line with client & server components.
Made all ComponentStates immutable, as they should be.
2017-08-06 12:16:47 +02:00
Acruid
f7b1b9c4b6 Client Timing (#309)
* Appease lord Sonar.

* Client timing *should* work.
2017-08-05 17:15:33 -06:00
Pieter-Jan Briers
2572bc94c7 Increase default logging verbosity to DEBUG. (#307) 2017-08-05 23:32:57 +02:00
Pieter-Jan Briers
47f1aa6565 Unhardcode content pack locations. (#306)
* Unhardcode content pack locations.

The previous hardcoded path was causing problems for the content repo.
Now the content packs are loaded from the executable directory.
The build system copies the pack from the Resources/ folder now.

* Fix CI
2017-08-05 23:32:44 +02:00
Pieter-Jan Briers
fdde14b93e Makes client and server load shared assembly too. (#304)
Also fixes #303
2017-08-05 23:32:28 +02:00
Pieter-Jan Briers
975eea832d Clean up build targets and output dirs. (#302)
* Clean up build targets and output dirs.

All old Any CPU targets and mixed ones have been removed. They wouldn't have worked anyways due to SFML.

Cleaned up all the build output directories to be neat and clean.

* Fix Travis
2017-08-04 07:11:28 -06:00
Pieter-Jan Briers
09ecdade70 Fix sonar E rating by removing dead Lidgren code.
Specifically, dead encryption systems like DES which are useless in 2017.
2017-08-03 20:32:16 +02:00
Pieter-Jan Briers
e8b40f6091 Make references in projects solution-relative, fixing content#3. (#300)
* Make package references in project files solution-relative.

Fixes https://github.com/space-wizards/space-station-14-content/issues/3 with the SolutionDir msbuild property.

* Fix openTK post-merge
2017-08-03 08:49:57 -06:00
494 changed files with 12031 additions and 18834 deletions

View File

@@ -15,8 +15,10 @@ install:
- ps: if (-Not $env:APPVEYOR_PULL_REQUEST_NUMBER) { cinst msbuild-sonarqube-runner }
before_build:
- cmd: py -3.5 RUN_THIS.py --no-prompt
- cmd: py -3.5 Resources\buildResourcePack.py --resources-dir .\Resources --out .\Resources\ResourcePack.zip --atlas-tool .\Tools\AtlasTool.exe --no-animations --to-stderr
- cmd: nuget restore SpaceStation14.sln
- ps: if (-Not $env:APPVEYOR_PULL_REQUEST_NUMBER) { MSBuild.SonarQube.Runner.exe begin /k:"ss14" /d:"sonar.host.url=https://sonarqube.com" /d:"sonar.login=$env:sonarqubekey" /d:"sonar.organization=space-wizards" }
- ps: if (-Not $env:APPVEYOR_PULL_REQUEST_NUMBER -And $env:APPVEYOR_REPO_BRANCH -Eq "master") { MSBuild.SonarQube.Runner.exe begin /k:"ss14" /d:"sonar.host.url=https://sonarqube.com" /d:"sonar.login=$env:sonarqubekey" /d:"sonar.organization=space-wizards" /d:"sonar.exclusions=SFML/**"}
build:
project: SpaceStation14.sln
@@ -24,5 +26,4 @@ build:
verbosity: minimal
after_build:
- ps: if (-Not $env:APPVEYOR_PULL_REQUEST_NUMBER) { MSBuild.SonarQube.Runner.exe end /d:"sonar.login=$env:sonarqubekey" }
- cmd: py -3.5 Resources\buildResourcePack.py --resources-dir .\Resources --out .\Resources\ResourcePack.zip --atlas-tool .\Tools\AtlasTool.exe --no-animations --to-stderr
- ps: if (-Not $env:APPVEYOR_PULL_REQUEST_NUMBER -And $env:APPVEYOR_REPO_BRANCH -Eq "master") { MSBuild.SonarQube.Runner.exe end /d:"sonar.login=$env:sonarqubekey" }

View File

@@ -1,4 +0,0 @@
{
"phabricator.uri": "http://phab.nexisonline.net",
"project.name": "Space Station 14"
}

View File

@@ -7,5 +7,5 @@ indent_size = 4
trim_trailing_whitespace = true
charset = utf-8-bom
[*.{csproj,xml,yml,dll.config}]
[*.{csproj,xml,yml,dll.config,targets}]
indent_size = 2

11
.gitignore vendored
View File

@@ -75,4 +75,13 @@ project.lock.json
# Created by NUnit.
TestResult.xml
NetSerializerDebug.dll
NetSerializerDebug.dll
# We're not gonna ship Mac extlibs with the repo due to size. (11 MB)
Third-Party/extlibs/Mac/
# Or the automatically-fetched Windows natives, for that matter.
Third-Party/extlibs/Windows/
# Python stuff
__pycache__
.mypy_cache

3
.gitmodules vendored Normal file
View File

@@ -0,0 +1,3 @@
[submodule "SFML"]
path = SFML
url = https://github.com/space-wizards/SFML.Net.git

View File

@@ -7,15 +7,24 @@ os:
- linux
- osx
addons:
apt:
sources:
- deadsnakes
packages:
- python3.6
before_install:
- if [ $TRAVIS_OS_NAME = osx ]; then brew update && brew install python3; fi
before_script:
- "python3 ./Resources/buildResourcePack.py --resources-dir ./Resources --out ./Resources/ResourcePack.zip --no-atlas --no-animations --to-stderr"
- "nuget restore SpaceStation14.sln"
- "python3.6 RUN_THIS.py --no-prompt"
script:
- "msbuild /p:Configuration=Release /p:HEADLESS=1 SpaceStation14.sln"
- "cd packages/NUnit.ConsoleRunner.3.6.1/tools"
- "mono --debug nunit3-console.exe ../../../SS14.UnitTesting/bin/Release/SS14.UnitTesting.dll"
- "python3.6 ./Resources/buildResourcePack.py --resources-dir ./Resources --out ./Resources/ResourcePack.zip --no-atlas --no-animations --to-stderr"
- "msbuild /p:Configuration=Release /p:Platform=x86 /p:HEADLESS=1 /nologo /m /p:AllowMissingMacNatives=yes SpaceStation14.sln /p:Python=python3.6"
- "cd packages/NUnit.ConsoleRunner.3.7.0/tools"
- "mono --debug nunit3-console.exe ../../../bin/UnitTesting/SS14.UnitTesting.dll"

1
BuildChecker/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
INSTALLED_HOOKS_VERSION

View File

@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
This is a dummy .csproj file to check things like submodules.
Better this than other errors.
If you want to create this kind of file yourself, you have to create an empty .NET application,
Then strip it of everything until you have the <Project> tags.
VS refuses to load the project if you make a bare project file and use Add -> Existing Project... for some reason.
You want to handle the Build, Clean and Rebuild tasks to prevent missing task errors on build.
If you want to learn more about these kinds of things, check out Microsoft's official documentation about MSBuild:
https://docs.microsoft.com/en-us/visualstudio/msbuild/msbuild
-->
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Choose>
<When Condition="'$(Python)' == ''">
<PropertyGroup>
<Python>python3</Python>
<Python Condition="'$(OS)'=='Windows_NT' Or '$(OS)'=='Windows'">py -3</Python>
</PropertyGroup>
</When>
</Choose>
<PropertyGroup>
<ProjectGuid>{D0DA124B-5580-4345-A02B-9F051F78915F}</ProjectGuid>
<OutputType>Exe</OutputType>
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
</PropertyGroup>
<Target Name="Build">
<Exec Command="$(Python) git_helper.py" CustomErrorRegularExpression="^Error" />
</Target>
<Target Name="Rebuild" DependsOnTargets="Build" />
<Target Name="Clean">
<Message Importance="low" Text="Ignoring 'Clean' target." />
</Target>
</Project>

103
BuildChecker/git_helper.py Executable file
View File

@@ -0,0 +1,103 @@
#!/usr/bin/env python3
# Installs git hooks, updates them, updates submodules, that kind of thing.
import subprocess
import sys
import os
import shutil
from pathlib import Path
from typing import List
BUILD_CHECKER_PATH = Path(Path(__file__).resolve(strict=True).parent)
SS14_ROOT_PATH = Path(BUILD_CHECKER_PATH.parent)
SOLUTION_PATH = Path(SS14_ROOT_PATH/"SpaceStation14Content.sln")
CURRENT_HOOKS_VERSION = "2" # If this doesn't match the saved version we overwrite them all.
QUIET = "--quiet" in sys.argv
NO_HOOKS = "--nohooks" in sys.argv
def run_command(command: List[str], capture: bool = False) -> subprocess.CompletedProcess:
"""
Runs a command with pretty output.
"""
text = ' '.join(command)
if not QUIET:
print("$ {}".format(text))
sys.stdout.flush()
completed = None
if capture:
completed = subprocess.run(command, cwd=str(SS14_ROOT_PATH), stdout=subprocess.PIPE)
else:
completed = subprocess.run(command, cwd=str(SS14_ROOT_PATH))
if completed.returncode != 0:
raise RuntimeError("Error: command exited with code {}!".format(completed.returncode))
return completed
def update_submodules():
"""
Updates all submodules.
"""
status = run_command(["git", "submodule", "update", "--init", "--recursive"], capture=True)
if status.stdout.decode().strip():
print("Git submodules changed. Reloading solution.")
reset_solution()
def install_hooks():
"""
Installs the necessary git hooks into .git/hooks.
"""
# Read version file.
if os.path.isfile(BUILD_CHECKER_PATH/"INSTALLED_HOOKS_VERSION"):
with open(BUILD_CHECKER_PATH/"INSTALLED_HOOKS_VERSION", "r") as f:
if f.read() == CURRENT_HOOKS_VERSION:
if not QUIET:
print("No hooks change detected.")
return
with open(BUILD_CHECKER_PATH/"INSTALLED_HOOKS_VERSION", "w") as f:
f.write(CURRENT_HOOKS_VERSION)
print("Hooks need updating.")
hooks_target_dir = SS14_ROOT_PATH/".git"/"hooks"
hooks_source_dir = BUILD_CHECKER_PATH/"hooks"
if not os.path.exists(str(hooks_target_dir)):
os.makedirs(str(hooks_target_dir))
# Clear entire tree since we need to kill deleted files too.
for filename in os.listdir(str(hooks_target_dir)):
os.remove(str(hooks_target_dir/filename))
for filename in os.listdir(str(hooks_source_dir)):
print("Copying hook {}".format(filename))
shutil.copyfile(str(hooks_source_dir/filename), str(hooks_target_dir/filename))
def reset_solution():
"""
Force VS to think the solution has been changed to prompt the user to reload it,
thus fixing any load errors.
"""
with SOLUTION_PATH.open("r") as f:
content = f.read()
with SOLUTION_PATH.open("w") as f:
f.write(content)
def main():
if not NO_HOOKS:
install_hooks()
update_submodules()
if __name__ == '__main__':
main()

View File

@@ -0,0 +1,19 @@
#!/bin/bash
gitroot=`git rev-parse --show-toplevel`
cd "$gitroot/BuildChecker"
if [ -f "git_helper.py" ]
then
if [[ `uname` == MINGW* || `uname` == CYGWIN* ]]; then
# Windows
# Can't update hooks from here because we are a hook,
# and the file is read only while it's used.
# Thanks Windows.
py -3 git_helper.py --quiet --nohooks
else
# Not Windows, so probably some other Unix thing.
python3 git_helper.py --quiet
fi
fi

View File

@@ -0,0 +1,5 @@
#!/bin/bash
# Just call post-checkout since it does the same thing.
gitroot=`git rev-parse --show-toplevel`
bash "$gitroot/.git/hooks/post-checkout"

View File

@@ -1,4 +0,0 @@
call "c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86
@echo on
call prebuild-2010.cmd
call msbuild SpaceStation14.sln /t:Build /p:Configuration=Release;Platform=x86

View File

@@ -1,10 +0,0 @@
#!/bin/bash
prebuild-nant.sh
nant
#nunit-console Bin/SS14.Test.dll -nodots -xml=NUnit.Results.xml
echo NUnit disabled.
#7za a SS14.7z Bin/*
echo Packaging disabled.

View File

@@ -1,2 +0,0 @@
cd bin\client
start SpaceStation14.exe

View File

@@ -1,2 +0,0 @@
cd bin\server
start SpaceStation14_Server.exe

View File

@@ -1,164 +0,0 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Security.Cryptography;
using System.Text;
namespace Lidgren.Network
{
/// <summary>
/// DES encryption
/// </summary>
public class NetDESEncryption : INetEncryption
{
private readonly byte[] m_key;
private readonly byte[] m_iv;
private readonly int m_bitSize;
private static readonly List<int> m_keysizes;
private static readonly List<int> m_blocksizes;
static NetDESEncryption()
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
List<int> temp = new List<int>();
foreach (KeySizes keysize in des.LegalKeySizes)
{
for (int i = keysize.MinSize; i <= keysize.MaxSize; i += keysize.SkipSize)
{
if (!temp.Contains(i))
temp.Add(i);
if (i == keysize.MaxSize)
break;
}
}
m_keysizes = temp;
temp = new List<int>();
foreach (KeySizes keysize in des.LegalBlockSizes)
{
for (int i = keysize.MinSize; i <= keysize.MaxSize; i += keysize.SkipSize)
{
if (!temp.Contains(i))
temp.Add(i);
if (i == keysize.MaxSize)
break;
}
}
m_blocksizes = temp;
}
/// <summary>
/// NetDESEncryption constructor
/// </summary>
public NetDESEncryption(byte[] key, byte[] iv)
{
if (!m_keysizes.Contains(key.Length * 8))
throw new NetException(string.Format("Not a valid key size. (Valid values are: {0})", NetUtility.MakeCommaDelimitedList(m_keysizes)));
if (!m_blocksizes.Contains(iv.Length * 8))
throw new NetException(string.Format("Not a valid iv size. (Valid values are: {0})", NetUtility.MakeCommaDelimitedList(m_blocksizes)));
m_key = key;
m_iv = iv;
m_bitSize = m_key.Length * 8;
}
/// <summary>
/// NetDESEncryption constructor
/// </summary>
public NetDESEncryption(string key, int bitsize)
{
if (!m_keysizes.Contains(bitsize))
throw new NetException(string.Format("Not a valid key size. (Valid values are: {0})", NetUtility.MakeCommaDelimitedList(m_keysizes)));
byte[] entropy = Encoding.UTF32.GetBytes(key);
// I know hardcoding salts is bad, but in this case I think it is acceptable.
HMACSHA512 hmacsha512 = new HMACSHA512(Convert.FromBase64String("i88NEiez3c50bHqr3YGasDc4p8jRrxJAaiRiqixpvp4XNAStP5YNoC2fXnWkURtkha6M8yY901Gj07IRVIRyGL=="));
hmacsha512.Initialize();
for (int i = 0; i < 1000; i++)
{
entropy = hmacsha512.ComputeHash(entropy);
}
int keylen = bitsize / 8;
m_key = new byte[keylen];
Buffer.BlockCopy(entropy, 0, m_key, 0, keylen);
m_iv = new byte[m_blocksizes[0] / 8];
Buffer.BlockCopy(entropy, entropy.Length - m_iv.Length - 1, m_iv, 0, m_iv.Length);
m_bitSize = bitsize;
}
/// <summary>
/// NetDESEncryption constructor
/// </summary>
public NetDESEncryption(string key)
: this(key, m_keysizes[0])
{
}
/// <summary>
/// Encrypt outgoing message
/// </summary>
public bool Encrypt(NetOutgoingMessage msg)
{
try
{
// nested usings are fun!
using (DESCryptoServiceProvider desCryptoServiceProvider = new DESCryptoServiceProvider { KeySize = m_bitSize, Mode = CipherMode.CBC })
{
using (ICryptoTransform cryptoTransform = desCryptoServiceProvider.CreateEncryptor(m_key, m_iv))
{
using (MemoryStream memoryStream = new MemoryStream())
{
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, cryptoTransform,
CryptoStreamMode.Write))
{
cryptoStream.Write(msg.m_data, 0, msg.m_data.Length);
}
msg.m_data = memoryStream.ToArray();
}
}
}
}
catch
{
return false;
}
return true;
}
/// <summary>
/// Decrypt incoming message
/// </summary>
public bool Decrypt(NetIncomingMessage msg)
{
try
{
// nested usings are fun!
using (DESCryptoServiceProvider desCryptoServiceProvider = new DESCryptoServiceProvider { KeySize = m_bitSize, Mode = CipherMode.CBC })
{
using (ICryptoTransform cryptoTransform = desCryptoServiceProvider.CreateDecryptor(m_key, m_iv))
{
using (MemoryStream memoryStream = new MemoryStream())
{
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, cryptoTransform,
CryptoStreamMode.Write))
{
cryptoStream.Write(msg.m_data, 0, msg.m_data.Length);
}
msg.m_data = memoryStream.ToArray();
}
}
}
}
catch
{
return false;
}
return true;
}
}
}

View File

@@ -1,165 +0,0 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Security.Cryptography;
using System.Text;
namespace Lidgren.Network
{
/// <summary>
/// RC2 encryption
/// </summary>
public class NetRC2Encryption : INetEncryption
{
private readonly byte[] m_key;
private readonly byte[] m_iv;
private readonly int m_bitSize;
private static readonly List<int> m_keysizes;
private static readonly List<int> m_blocksizes;
static NetRC2Encryption()
{
RC2CryptoServiceProvider rc2 = new RC2CryptoServiceProvider();
List<int> temp = new List<int>();
foreach (KeySizes keysize in rc2.LegalKeySizes)
{
for (int i = keysize.MinSize; i <= keysize.MaxSize; i += keysize.SkipSize)
{
if (!temp.Contains(i))
temp.Add(i);
if (i == keysize.MaxSize)
break;
}
}
m_keysizes = temp;
temp = new List<int>();
foreach (KeySizes keysize in rc2.LegalBlockSizes)
{
for (int i = keysize.MinSize; i <= keysize.MaxSize; i += keysize.SkipSize)
{
if (!temp.Contains(i))
temp.Add(i);
if (i == keysize.MaxSize)
break;
}
}
m_blocksizes = temp;
}
/// <summary>
/// NetRC2Encryption constructor
/// </summary>
public NetRC2Encryption(byte[] key, byte[] iv)
{
if (!m_keysizes.Contains(key.Length * 8))
throw new NetException(string.Format("Not a valid key size. (Valid values are: {0})", NetUtility.MakeCommaDelimitedList(m_keysizes)));
if (!m_blocksizes.Contains(iv.Length * 8))
throw new NetException(string.Format("Not a valid iv size. (Valid values are: {0})", NetUtility.MakeCommaDelimitedList(m_blocksizes)));
m_key = key;
m_iv = iv;
m_bitSize = m_key.Length * 8;
}
/// <summary>
/// NetRC2Encryption constructor
/// </summary>
public NetRC2Encryption(string key, int bitsize)
{
if (!m_keysizes.Contains(bitsize))
throw new NetException(string.Format("Not a valid key size. (Valid values are: {0})", NetUtility.MakeCommaDelimitedList(m_keysizes)));
byte[] entropy = Encoding.UTF32.GetBytes(key);
// I know hardcoding salts is bad, but in this case I think it is acceptable.
HMACSHA512 hmacsha512 = new HMACSHA512(Convert.FromBase64String("i88NEiez3c50bHqr3YGasDc4p8jRrxJAaiRiqixpvp4XNAStP5YNoC2fXnWkURtkha6M8yY901Gj07IRVIRyGL=="));
hmacsha512.Initialize();
for (int i = 0; i < 1000; i++)
{
entropy = hmacsha512.ComputeHash(entropy);
}
int keylen = bitsize / 8;
m_key = new byte[keylen];
Buffer.BlockCopy(entropy, 0, m_key, 0, keylen);
m_iv = new byte[m_blocksizes[0] / 8];
Buffer.BlockCopy(entropy, entropy.Length - m_iv.Length - 1, m_iv, 0, m_iv.Length);
m_bitSize = bitsize;
}
/// <summary>
/// NetRC2Encryption constructor
/// </summary>
/// <param name="key"></param>
public NetRC2Encryption(string key)
: this(key, m_keysizes[0])
{
}
/// <summary>
/// Encrypt outgoing message
/// </summary>
public bool Encrypt(NetOutgoingMessage msg)
{
try
{
// nested usings are fun!
using (RC2CryptoServiceProvider rc2CryptoServiceProvider = new RC2CryptoServiceProvider { KeySize = m_bitSize, Mode = CipherMode.CBC })
{
using (ICryptoTransform cryptoTransform = rc2CryptoServiceProvider.CreateEncryptor(m_key, m_iv))
{
using (MemoryStream memoryStream = new MemoryStream())
{
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, cryptoTransform,
CryptoStreamMode.Write))
{
cryptoStream.Write(msg.m_data, 0, msg.m_data.Length);
}
msg.m_data = memoryStream.ToArray();
}
}
}
}
catch
{
return false;
}
return true;
}
/// <summary>
/// Decrypt incoming message
/// </summary>
public bool Decrypt(NetIncomingMessage msg)
{
try
{
// nested usings are fun!
using (RC2CryptoServiceProvider rc2CryptoServiceProvider = new RC2CryptoServiceProvider { KeySize = m_bitSize, Mode = CipherMode.CBC })
{
using (ICryptoTransform cryptoTransform = rc2CryptoServiceProvider.CreateDecryptor(m_key, m_iv))
{
using (MemoryStream memoryStream = new MemoryStream())
{
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, cryptoTransform,
CryptoStreamMode.Write))
{
cryptoStream.Write(msg.m_data, 0, msg.m_data.Length);
}
msg.m_data = memoryStream.ToArray();
}
}
}
}
catch
{
return false;
}
return true;
}
}
}

View File

@@ -1,164 +0,0 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Security.Cryptography;
using System.Text;
namespace Lidgren.Network
{
/// <summary>
/// Triple DES encryption
/// </summary>
public class NetTripleDESEncryption : INetEncryption
{
private readonly byte[] m_key;
private readonly byte[] m_iv;
private readonly int m_bitSize;
private static readonly List<int> m_keysizes;
private static readonly List<int> m_blocksizes;
static NetTripleDESEncryption()
{
TripleDESCryptoServiceProvider tripleDES = new TripleDESCryptoServiceProvider();
List<int> temp = new List<int>();
foreach (KeySizes keysize in tripleDES.LegalKeySizes)
{
for (int i = keysize.MinSize; i <= keysize.MaxSize; i += keysize.SkipSize)
{
if (!temp.Contains(i))
temp.Add(i);
if (i == keysize.MaxSize)
break;
}
}
m_keysizes = temp;
temp = new List<int>();
foreach (KeySizes keysize in tripleDES.LegalBlockSizes)
{
for (int i = keysize.MinSize; i <= keysize.MaxSize; i += keysize.SkipSize)
{
if (!temp.Contains(i))
temp.Add(i);
if (i == keysize.MaxSize)
break;
}
}
m_blocksizes = temp;
}
/// <summary>
/// NetTriplsDESEncryption constructor
/// </summary>
public NetTripleDESEncryption(byte[] key, byte[] iv)
{
if (!m_keysizes.Contains(key.Length * 8))
throw new NetException(string.Format("Not a valid key size. (Valid values are: {0})", NetUtility.MakeCommaDelimitedList(m_keysizes)));
if (!m_blocksizes.Contains(iv.Length * 8))
throw new NetException(string.Format("Not a valid iv size. (Valid values are: {0})", NetUtility.MakeCommaDelimitedList(m_blocksizes)));
m_key = key;
m_iv = iv;
m_bitSize = m_key.Length * 8;
}
/// <summary>
/// NetTriplsDESEncryption constructor
/// </summary>
public NetTripleDESEncryption(string key, int bitsize)
{
if (!m_keysizes.Contains(bitsize))
throw new NetException(string.Format("Not a valid key size. (Valid values are: {0})", NetUtility.MakeCommaDelimitedList(m_keysizes)));
byte[] entropy = Encoding.UTF32.GetBytes(key);
// I know hardcoding salts is bad, but in this case I think it is acceptable.
HMACSHA512 hmacsha512 = new HMACSHA512(Convert.FromBase64String("i88NEiez3c50bHqr3YGasDc4p8jRrxJAaiRiqixpvp4XNAStP5YNoC2fXnWkURtkha6M8yY901Gj07IRVIRyGL=="));
hmacsha512.Initialize();
for (int i = 0; i < 1000; i++)
{
entropy = hmacsha512.ComputeHash(entropy);
}
int keylen = bitsize / 8;
m_key = new byte[keylen];
Buffer.BlockCopy(entropy, 0, m_key, 0, keylen);
m_iv = new byte[m_blocksizes[0] / 8];
Buffer.BlockCopy(entropy, entropy.Length - m_iv.Length - 1, m_iv, 0, m_iv.Length);
m_bitSize = bitsize;
}
/// <summary>
/// NetTriplsDESEncryption constructor
/// </summary>
public NetTripleDESEncryption(string key)
: this(key, m_keysizes[0])
{
}
/// <summary>
/// Encrypt outgoing message
/// </summary>
public bool Encrypt(NetOutgoingMessage msg)
{
try
{
// nested usings are fun!
using (TripleDESCryptoServiceProvider tripleDESCryptoServiceProvider = new TripleDESCryptoServiceProvider { KeySize = m_bitSize, Mode = CipherMode.CBC })
{
using (ICryptoTransform cryptoTransform = tripleDESCryptoServiceProvider.CreateEncryptor(m_key, m_iv))
{
using (MemoryStream memoryStream = new MemoryStream())
{
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, cryptoTransform,
CryptoStreamMode.Write))
{
cryptoStream.Write(msg.m_data, 0, msg.m_data.Length);
}
msg.m_data = memoryStream.ToArray();
}
}
}
}
catch
{
return false;
}
return true;
}
/// <summary>
/// Decrypt incoming message
/// </summary>
public bool Decrypt(NetIncomingMessage msg)
{
try
{
// nested usings are fun!
using (TripleDESCryptoServiceProvider tripleDESCryptoServiceProvider = new TripleDESCryptoServiceProvider { KeySize = m_bitSize, Mode = CipherMode.CBC })
{
using (ICryptoTransform cryptoTransform = tripleDESCryptoServiceProvider.CreateDecryptor(m_key, m_iv))
{
using (MemoryStream memoryStream = new MemoryStream())
{
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, cryptoTransform,
CryptoStreamMode.Write))
{
cryptoStream.Write(msg.m_data, 0, msg.m_data.Length);
}
msg.m_data = memoryStream.ToArray();
}
}
}
}
catch
{
return false;
}
return true;
}
}
}

View File

@@ -1,58 +0,0 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Lidgren.Network
{
/// <summary>
/// Example class; not very good encryption
/// </summary>
public class NetXorEncryption : INetEncryption
{
private byte[] m_key;
/// <summary>
/// NetXorEncryption constructor
/// </summary>
public NetXorEncryption(byte[] key)
{
m_key = key;
}
/// <summary>
/// NetXorEncryption constructor
/// </summary>
public NetXorEncryption(string key)
{
m_key = Encoding.UTF8.GetBytes(key);
}
/// <summary>
/// Encrypt an outgoing message
/// </summary>
public bool Encrypt(NetOutgoingMessage msg)
{
int numBytes = msg.LengthBytes;
for (int i = 0; i < numBytes; i++)
{
int offset = i % m_key.Length;
msg.m_data[i] = (byte)(msg.m_data[i] ^ m_key[offset]);
}
return true;
}
/// <summary>
/// Decrypt an incoming message
/// </summary>
public bool Decrypt(NetIncomingMessage msg)
{
int numBytes = msg.LengthBytes;
for (int i = 0; i < numBytes; i++)
{
int offset = i % m_key.Length;
msg.m_data[i] = (byte)(msg.m_data[i] ^ m_key[offset]);
}
return true;
}
}
}

View File

@@ -6,72 +6,54 @@
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{59250BAF-0000-0000-0000-000000000000}</ProjectGuid>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<ApplicationIcon>
</ApplicationIcon>
<AssemblyKeyContainerName>
</AssemblyKeyContainerName>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
<ApplicationIcon />
<AssemblyKeyContainerName />
<AssemblyName>Lidgren.Network</AssemblyName>
<DefaultClientScript>JScript</DefaultClientScript>
<DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
<DefaultTargetSchema>IE50</DefaultTargetSchema>
<TargetFrameworkVersion>v4.5.1</TargetFrameworkVersion>
<OutputType>Library</OutputType>
<AppDesignerFolder>
</AppDesignerFolder>
<AppDesignerFolder />
<RootNamespace>Lidgren.Network</RootNamespace>
<StartupObject>
</StartupObject>
<StartArguments>
</StartArguments>
<FileUpgradeFlags>
</FileUpgradeFlags>
<StartupObject />
<StartArguments />
<FileUpgradeFlags />
<ConfigurationOverrideFile />
<TargetFrameworkProfile />
<DocumentationFile />
<CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
<AllowUnsafeBlocks>False</AllowUnsafeBlocks>
<FileAlignment>4096</FileAlignment>
<OutputPath>$(SolutionDir)bin\Lidgren\</OutputPath>
<RegisterForComInterop>False</RegisterForComInterop>
<RemoveIntegerChecks>False</RemoveIntegerChecks>
<TreatWarningsAsErrors>False</TreatWarningsAsErrors>
<NoStdLib>False</NoStdLib>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<AllowUnsafeBlocks>False</AllowUnsafeBlocks>
<BaseAddress>285212672</BaseAddress>
<CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
<ConfigurationOverrideFile>
</ConfigurationOverrideFile>
<DefineConstants>TRACE;DEBUG</DefineConstants>
<DocumentationFile>
</DocumentationFile>
<DebugSymbols>True</DebugSymbols>
<FileAlignment>4096</FileAlignment>
<Optimize>False</Optimize>
<OutputPath>..\bin\</OutputPath>
<RegisterForComInterop>False</RegisterForComInterop>
<RemoveIntegerChecks>False</RemoveIntegerChecks>
<TreatWarningsAsErrors>False</TreatWarningsAsErrors>
<WarningLevel>4</WarningLevel>
<NoStdLib>False</NoStdLib>
<NoWarn>
</NoWarn>
<PlatformTarget>x86</PlatformTarget>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
<AllowUnsafeBlocks>False</AllowUnsafeBlocks>
<BaseAddress>285212672</BaseAddress>
<CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
<ConfigurationOverrideFile>
</ConfigurationOverrideFile>
<DefineConstants>TRACE</DefineConstants>
<DocumentationFile>
</DocumentationFile>
<DebugSymbols>False</DebugSymbols>
<FileAlignment>4096</FileAlignment>
<Optimize>True</Optimize>
<OutputPath>..\bin\</OutputPath>
<RegisterForComInterop>False</RegisterForComInterop>
<RemoveIntegerChecks>False</RemoveIntegerChecks>
<TreatWarningsAsErrors>False</TreatWarningsAsErrors>
<WarningLevel>4</WarningLevel>
<NoStdLib>False</NoStdLib>
<NoWarn>
</NoWarn>
<PlatformTarget>x86</PlatformTarget>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
<DefineConstants>TRACE;DEBUG</DefineConstants>
<DebugSymbols>True</DebugSymbols>
<Optimize>False</Optimize>
<PlatformTarget>x64</PlatformTarget>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
<DefineConstants>TRACE</DefineConstants>
<DebugSymbols>False</DebugSymbols>
<Optimize>True</Optimize>
<PlatformTarget>x64</PlatformTarget>
</PropertyGroup>
<ItemGroup>
<Reference Include="Microsoft.CSharp">
@@ -107,18 +89,6 @@
<Compile Include="Encryption\NetBlockEncryptionBase.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Encryption\NetDESEncryption.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Encryption\NetRC2Encryption.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Encryption\NetTripleDESEncryption.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Encryption\NetXorEncryption.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Encryption\NetXteaEncryption.cs">
<SubType>Code</SubType>
</Compile>

View File

@@ -1,4 +1,4 @@
using System;
using System;
using System.Text;
using System.Collections;
using System.Diagnostics;
@@ -70,7 +70,6 @@ namespace Lidgren.Network
if (i == mag.Length)
{
// sign = 0;
m_magnitude = ZeroMagnitude;
}
else
@@ -241,17 +240,6 @@ namespace Lidgren.Network
}
}
// Note: This is the previous (slower) algorithm
// while (index < value.Length)
// {
// char c = value[index];
// string s = c.ToString();
// int i = Int32.Parse(s, style);
//
// b = b.Multiply(r).Add(ValueOf(i));
// index++;
// }
m_magnitude = b.m_magnitude;
}
@@ -390,7 +378,6 @@ namespace Lidgren.Network
if (sign == 0)
{
//sign = 0;
m_magnitude = ZeroMagnitude;
}
else
@@ -727,7 +714,6 @@ namespace Lidgren.Network
int cBitLength = yBitLength;
if (shift > 0)
{
// iCount = ShiftLeft(One.magnitude, shift);
iCount = new int[(shift >> 5) + 1];
iCount[0] = 1 << (shift % 32);
@@ -758,8 +744,7 @@ namespace Lidgren.Network
if (++xStart == x.Length)
return count;
}
//xBitLength = calcBitLength(xStart, x);
xBitLength = 32 * (x.Length - xStart - 1) + BitLen(x[xStart]);
if (xBitLength <= yBitLength)
@@ -797,8 +782,7 @@ namespace Lidgren.Network
cBitLength -= shift;
iCount = ShiftRightInPlace(iCountStart, iCount, shift);
}
//cStart = c.Length - ((cBitLength + 31) / 32);
while (c[cStart] == 0)
{
++cStart;
@@ -1000,7 +984,6 @@ namespace Lidgren.Network
if (x.m_sign < 0)
{
x.m_sign = 1;
//x = m.Subtract(x);
x.m_magnitude = doSubBigLil(m.m_magnitude, x.m_magnitude);
}
@@ -1105,7 +1088,6 @@ namespace Lidgren.Network
{
if (m_magnitude.Length <= m.m_magnitude.Length)
{
//zAccum = new int[m.magnitude.Length * 2];
zVal = new int[m.m_magnitude.Length];
m_magnitude.CopyTo(zVal, zVal.Length - m_magnitude.Length);
}
@@ -1115,8 +1097,7 @@ namespace Lidgren.Network
// in normal practice we'll never see ..
//
NetBigInteger tmp = Remainder(m);
//zAccum = new int[m.magnitude.Length * 2];
zVal = new int[m.m_magnitude.Length];
tmp.m_magnitude.CopyTo(zVal, zVal.Length - tmp.m_magnitude.Length);
}
@@ -1225,10 +1206,6 @@ namespace Lidgren.Network
int[] w,
int[] x)
{
// Note: this method allows w to be only (2 * x.Length - 1) words if result will fit
// if (w.Length != 2 * x.Length)
// throw new ArgumentException("no I don't think so...");
ulong u1, u2, c;
int wBase = w.Length - 1;
@@ -1649,8 +1626,7 @@ namespace Lidgren.Network
if (++xStart == x.Length)
return x;
}
//xBitLength = calcBitLength(xStart, x);
xBitLength = 32 * (x.Length - xStart - 1) + BitLen(x[xStart]);
if (xBitLength <= yBitLength)
@@ -1686,8 +1662,7 @@ namespace Lidgren.Network
c = ShiftRightInPlace(cStart, c, shift);
cBitLength -= shift;
}
//cStart = c.Length - ((cBitLength + 31) / 32);
while (c[cStart] == 0)
{
++cStart;
@@ -1919,12 +1894,6 @@ namespace Lidgren.Network
if (n >= BitLength)
return (m_sign < 0 ? One.Negate() : Zero);
// int[] res = (int[]) magnitude.Clone();
//
// res = ShiftRightInPlace(0, res, n);
//
// return new BigInteger(sign, res, true);
int resultLength = (BitLength - n + 31) >> 5;
int[] res = new int[resultLength];
@@ -1980,8 +1949,7 @@ namespace Lidgren.Network
{
m = (x[--iT] & IMASK) - (y[--iV] & IMASK) + borrow;
x[iT] = (int)m;
// borrow = (m < 0) ? -1 : 0;
borrow = (int)(m >> 63);
}
while (iV > yStart);

View File

@@ -1,4 +1,4 @@
//#define UNSAFE
//#define UNSAFE
//#define BIGENDIAN
/* Copyright (c) 2010 Michael Lidgren
@@ -39,7 +39,7 @@ namespace Lidgren.Network
NetException.Assert(((numberOfBits > 0) && (numberOfBits < 9)), "Read() can only read between 1 and 8 bits");
int bytePtr = readBitOffset >> 3;
int startReadAtIndex = readBitOffset - (bytePtr * 8); // (readBitOffset % 8);
int startReadAtIndex = readBitOffset - (bytePtr * 8);
if (startReadAtIndex == 0 && numberOfBits == 8)
return fromBuffer[bytePtr];
@@ -70,7 +70,7 @@ namespace Lidgren.Network
public static void ReadBytes(byte[] fromBuffer, int numberOfBytes, int readBitOffset, byte[] destination, int destinationByteOffset)
{
int readPtr = readBitOffset >> 3;
int startReadAtIndex = readBitOffset - (readPtr * 8); // (readBitOffset % 8);
int startReadAtIndex = readBitOffset - (readPtr * 8);
if (startReadAtIndex == 0)
{

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2010 Michael Lidgren
/* Copyright (c) 2010 Michael Lidgren
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software without
@@ -181,7 +181,6 @@ namespace Lidgren.Network
public UInt32 PeekUInt32(int numberOfBits)
{
NetException.Assert((numberOfBits > 0 && numberOfBits <= 32), "ReadUInt() can only read between 1 and 32 bits");
//NetException.Assert(m_bitLength - m_readBitPtr >= numberOfBits, "tried to read past buffer size");
UInt32 retval = NetBitWriter.ReadUInt32(m_data, numberOfBits, m_readPosition);
return retval;

View File

@@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
@@ -255,7 +255,6 @@ namespace Lidgren.Network
public UInt32 ReadUInt32(int numberOfBits)
{
NetException.Assert(numberOfBits > 0 && numberOfBits <= 32, "ReadUInt32(bits) can only read between 1 and 32 bits");
//NetException.Assert(m_bitLength - m_readBitPtr >= numberOfBits, "tried to read past buffer size");
UInt32 retval = NetBitWriter.ReadUInt32(m_data, numberOfBits, m_readPosition);
m_readPosition += numberOfBits;
@@ -470,9 +469,6 @@ namespace Lidgren.Network
int num2 = 0;
while (true)
{
//if (num2 == 0x23)
// throw new FormatException("Bad 7-bit encoded integer");
byte num3 = this.ReadByte();
num1 |= ((UInt64)num3 & 0x7f) << num2;
num2 += 7;

View File

@@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic;
using System.Text;
@@ -94,8 +94,6 @@ namespace Lidgren.Network
{
m_peer.VerifyNetworkThread();
//m_peer.LogDebug("Executing disconnect");
// clear send queues
for (int i = 0; i < m_sendChannels.Length; i++)
{

View File

@@ -1,4 +1,4 @@
using System;
using System;
namespace Lidgren.Network
{
@@ -131,8 +131,6 @@ namespace Lidgren.Network
rchan.m_resendDelay = resendDelay;
}
// m_peer.LogVerbose("Timeout deadline pushed to " + m_timeoutDeadline);
// notify the application that average rtt changed
if (m_peer.m_configuration.IsMessageTypeEnabled(NetIncomingMessageType.ConnectionLatencyUpdated))
{

View File

@@ -1,4 +1,4 @@
using System;
using System;
namespace Lidgren.Network
{
@@ -74,13 +74,11 @@ namespace Lidgren.Network
{
// we've never encountered failure; expand by 25% each time
tryMTU = (int)((float)m_currentMTU * 1.25f);
//m_peer.LogDebug("Trying MTU " + tryMTU);
}
else
{
// we HAVE encountered failure; so try in between
tryMTU = (int)(((float)m_smallestFailedMTU + (float)m_largestSuccessfulMTU) / 2.0f);
//m_peer.LogDebug("Trying MTU " + m_smallestFailedMTU + " <-> " + m_largestSuccessfulMTU + " = " + tryMTU);
}
if (tryMTU > c_protocolMaxMTU)
@@ -88,7 +86,6 @@ namespace Lidgren.Network
if (tryMTU == m_largestSuccessfulMTU)
{
//m_peer.LogDebug("Found optimal MTU - exiting");
FinalizeMTU(m_largestSuccessfulMTU);
return;
}
@@ -107,8 +104,6 @@ namespace Lidgren.Network
bool ok = m_peer.SendMTUPacket(len, m_remoteEndPoint);
if (ok == false)
{
//m_peer.LogDebug("Send MTU failed for size " + size);
// failure
if (m_smallestFailedMTU == -1 || size < m_smallestFailedMTU)
{
@@ -149,9 +144,7 @@ namespace Lidgren.Network
int len = om.Encode(m_peer.m_sendBuffer, 0, 0);
bool connectionReset;
m_peer.SendPacket(len, m_remoteEndPoint, 1, out connectionReset);
// m_peer.LogDebug("Received MTU expand request for " + size + " bytes");
m_statistics.PacketSent(len, 1);
}
@@ -162,11 +155,9 @@ namespace Lidgren.Network
if (size < m_currentMTU)
{
//m_peer.LogDebug("Received low MTU expand success (size " + size + "); current mtu is " + m_currentMTU);
return;
}
//m_peer.LogDebug("Expanding MTU to " + size);
m_currentMTU = size;
ExpandMTU(now, true);

View File

@@ -1,4 +1,4 @@
using System;
using System;
using System.Net;
using System.Threading;
using System.Diagnostics;
@@ -204,8 +204,6 @@ namespace Lidgren.Network
NetTuple<NetMessageType, int> tuple;
m_queuedOutgoingAcks.TryDequeue(out tuple);
//m_peer.LogVerbose("Sending ack for " + tuple.Item1 + "#" + tuple.Item2);
sendBuffer[m_sendBufferWritePtr++] = (byte)tuple.Item1;
sendBuffer[m_sendBufferWritePtr++] = (byte)tuple.Item2;
sendBuffer[m_sendBufferWritePtr++] = (byte)(tuple.Item2 >> 8);
@@ -228,7 +226,6 @@ namespace Lidgren.Network
NetTuple<NetMessageType, int> incAck;
while (m_queuedIncomingAcks.TryDequeue(out incAck))
{
//m_peer.LogVerbose("Received ack for " + acktp + "#" + seqNr);
NetSenderChannelBase chan = m_sendChannels[(int)incAck.Item1 - 1];
if (chan == null)
chan = CreateSenderChannel(incAck.Item1);

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2010 Michael Lidgren
/* Copyright (c) 2010 Michael Lidgren
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software without
@@ -91,8 +91,6 @@ namespace Lidgren.Network
/// </summary>
public int ResentMessages { get { return m_resentMessagesDueToHole + m_resentMessagesDueToDelay; } }
// public double LastSendRespondedTo { get { return m_connection.m_lastSendRespondedTo; } }
#if USE_RELEASE_STATISTICS
internal void PacketSent(int numBytes, int numMessages)
{
@@ -156,7 +154,6 @@ namespace Lidgren.Network
public override string ToString()
{
StringBuilder bdr = new StringBuilder();
//bdr.AppendLine("Average roundtrip time: " + NetTime.ToReadable(m_connection.m_averageRoundtripTime));
bdr.AppendLine("Sent " + m_sentBytes + " bytes in " + m_sentMessages + " messages in " + m_sentPackets + " packets");
bdr.AppendLine("Received " + m_receivedBytes + " bytes in " + m_receivedMessages + " messages in " + m_receivedPackets + " packets");

View File

@@ -1,4 +1,4 @@
using System;
using System;
using System.Threading;
using System.Collections.Generic;
@@ -131,7 +131,6 @@ namespace Lidgren.Network
Buffer.BlockCopy(im.m_data, ptr, info.Data, offset, im.LengthBytes - ptr);
int cnt = info.ReceivedChunks.Count();
//LogVerbose("Found fragment #" + chunkNumber + " in group " + group + " offset " + offset + " of total bits " + totalBits + " (total chunks done " + cnt + ")");
LogVerbose("Received fragment " + chunkNumber + " of " + totalNumChunks + " (" + cnt + " chunks received)");

View File

@@ -1,4 +1,4 @@
#if !__ANDROID__ && !IOS
#if !__ANDROID__ && !IOS
#define IS_MAC_AVAILABLE
#endif
@@ -370,9 +370,6 @@ namespace Lidgren.Network
if (!m_socket.Poll(1000, SelectMode.SelectRead)) // wait up to 1 ms for data to arrive
return;
//if (m_socket == null || m_socket.Available < 1)
// return;
do
{
int bytesReceived = 0;
@@ -398,8 +395,6 @@ namespace Lidgren.Network
if (bytesReceived < NetConstants.HeaderByteSize)
return;
//LogVerbose("Received " + bytesReceived + " bytes");
IPEndPoint ipsender = (IPEndPoint)m_senderRemote;
if (ipsender.Port == 1900)
@@ -648,7 +643,6 @@ namespace Lidgren.Network
internal void AcceptConnection(NetConnection conn)
{
// LogDebug("Accepted connection " + conn);
conn.InitExpandMTU(NetTime.Now);
if (m_handshakes.Remove(conn.m_remoteEndPoint) == false)

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2010 Michael Lidgren
/* Copyright (c) 2010 Michael Lidgren
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software without
@@ -63,7 +63,6 @@ namespace Lidgren.Network
if (m == 0.0f && r == 0.0f)
{
// no latency simulation
// LogVerbose("Sending packet " + numBytes + " bytes");
bool wasSent = ActuallySendPacket(m_sendBuffer, numBytes, target, out connectionReset);
// TODO: handle wasSent == false?
return;
@@ -87,8 +86,6 @@ namespace Lidgren.Network
m_delayedPackets.Add(p);
}
// LogVerbose("Sending packet " + numBytes + " bytes - delayed " + NetTime.ToReadable(delay));
}
private void SendDelayedPackets()
@@ -142,8 +139,6 @@ namespace Lidgren.Network
int bytesSent = m_socket.SendTo(data, 0, numBytes, SocketFlags.None, target);
if (numBytes != bytesSent)
LogWarning("Failed to send the full " + numBytes + "; only " + bytesSent + " bytes sent in packet!");
// LogDebug("Sent " + numBytes + " bytes");
}
catch (SocketException sx)
{

View File

@@ -1,4 +1,4 @@
using System;
using System;
namespace Lidgren.Network
{
@@ -80,8 +80,6 @@ namespace Lidgren.Network
// mix some semi-random properties
int seed = (int)Environment.TickCount;
seed ^= forObject.GetHashCode();
//seed ^= (int)(Stopwatch.GetTimestamp());
//seed ^= (int)(Environment.WorkingSet); // will return 0 on mono
int extraSeed = System.Threading.Interlocked.Increment(ref s_extraSeed);
@@ -265,44 +263,6 @@ namespace Lidgren.Network
this.x = x; this.y = y; this.z = z; this.w = w;
}
// /// <summary>
// /// A version of NextBytes that uses a pointer to set 4 bytes of the byte buffer in one operation
// /// thus providing a nice speedup. The loop is also partially unrolled to allow out-of-order-execution,
// /// this results in about a x2 speedup on an AMD Athlon. Thus performance may vary wildly on different CPUs
// /// depending on the number of execution units available.
// ///
// /// Another significant speedup is obtained by setting the 4 bytes by indexing pDWord (e.g. pDWord[i++]=w)
// /// instead of adjusting it dereferencing it (e.g. *pDWord++=w).
// ///
// /// Note that this routine requires the unsafe compilation flag to be specified and so is commented out by default.
// /// </summary>
// /// <param name="buffer"></param>
// public unsafe void NextBytesUnsafe(byte[] buffer)
// {
// if(buffer.Length % 8 != 0)
// throw new ArgumentException("Buffer length must be divisible by 8", "buffer");
//
// uint x=this.x, y=this.y, z=this.z, w=this.w;
//
// fixed(byte* pByte0 = buffer)
// {
// uint* pDWord = (uint*)pByte0;
// for(int i=0, len=buffer.Length>>2; i < len; i+=2)
// {
// uint t=(x^(x<<11));
// x=y; y=z; z=w;
// pDWord[i] = w = (w^(w>>19))^(t^(t>>8));
//
// t=(x^(x<<11));
// x=y; y=z; z=w;
// pDWord[i+1] = w = (w^(w>>19))^(t^(t>>8));
// }
// }
//
// this.x=x; this.y=y; this.z=z; this.w=w;
// }
#endregion
#region Public Methods [Methods not present on System.Random]

View File

@@ -1,4 +1,4 @@
using System;
using System;
namespace Lidgren.Network
{
@@ -32,13 +32,6 @@ namespace Lidgren.Network
if (relate == 0)
{
// Log("Received message #" + message.SequenceNumber + " right on time");
//
// excellent, right on time
//
//m_peer.LogVerbose("Received RIGHT-ON-TIME " + message);
AdvanceWindow();
m_peer.ReleaseMessage(message);

View File

@@ -1,4 +1,4 @@
using System;
using System;
using System.Threading;
namespace Lidgren.Network
@@ -85,8 +85,7 @@ namespace Lidgren.Network
startSlot = m_windowSize - 1;
seqNr--;
}
//m_connection.m_peer.LogVerbose("Resending due to delay #" + seqNr + " " + om.ToString());
m_connection.m_statistics.MessageResent(MessageResendReason.Delay);
m_connection.QueueSendMessage(om, seqNr);
@@ -156,15 +155,10 @@ namespace Lidgren.Network
int relate = NetUtility.RelativeSequenceNumber(seqNr, m_windowStart);
if (relate < 0)
{
//m_connection.m_peer.LogDebug("Received late/dupe ack for #" + seqNr);
return; // late/duplicate ack
}
if (relate == 0)
{
//m_connection.m_peer.LogDebug("Received right-on-time ack for #" + seqNr);
// ack arrived right on time
NetException.Assert(seqNr == m_windowStart);
@@ -175,13 +169,11 @@ namespace Lidgren.Network
// advance window if we already have early acks
while (m_receivedAcks.Get(m_windowStart))
{
//m_connection.m_peer.LogDebug("Using early ack for #" + m_windowStart + "...");
m_receivedAcks[m_windowStart] = false;
DestoreMessage(m_windowStart % m_windowSize);
NetException.Assert(m_storedMessages[m_windowStart % m_windowSize].Message == null); // should already be destored
m_windowStart = (m_windowStart + 1) % NetConstants.NumSequenceNumbers;
//m_connection.m_peer.LogDebug("Advancing window to #" + m_windowStart);
}
return;
@@ -194,8 +186,6 @@ namespace Lidgren.Network
// ... or the ack for that message was lost
//
//m_connection.m_peer.LogDebug("Received early ack for #" + seqNr);
int sendRelate = NetUtility.RelativeSequenceNumber(seqNr, m_sendStart);
if (sendRelate <= 0)
{
@@ -223,12 +213,8 @@ namespace Lidgren.Network
rnr--;
if (rnr < 0)
rnr = NetConstants.NumSequenceNumbers - 1;
if (m_receivedAcks[rnr])
{
// m_connection.m_peer.LogDebug("Not resending #" + rnr + " (since we got ack)");
}
else
if (!m_receivedAcks[rnr])
{
int slot = rnr % m_windowSize;
NetException.Assert(m_storedMessages[slot].Message != null);
@@ -236,7 +222,6 @@ namespace Lidgren.Network
{
// just sent once; resend immediately since we found gap in ack sequence
NetOutgoingMessage rmsg = m_storedMessages[slot].Message;
//m_connection.m_peer.LogVerbose("Resending #" + rnr + " (" + rmsg + ")");
if (now - m_storedMessages[slot].LastSent < (m_resendDelay * 0.35f))
{

View File

@@ -1,4 +1,4 @@
using System;
using System;
namespace Lidgren.Network
{
@@ -29,12 +29,6 @@ namespace Lidgren.Network
if (relate == 0)
{
// Log("Received message #" + message.SequenceNumber + " right on time");
//
// excellent, right on time
//
AdvanceWindow();
m_peer.ReleaseMessage(message);
return;

View File

@@ -1,4 +1,4 @@
using System;
using System;
namespace Lidgren.Network
{
@@ -30,13 +30,6 @@ namespace Lidgren.Network
if (relate == 0)
{
// Log("Received message #" + message.SequenceNumber + " right on time");
//
// excellent, right on time
//
//m_peer.LogVerbose("Received RIGHT-ON-TIME " + message);
AdvanceWindow();
m_peer.ReleaseMessage(message);
@@ -45,16 +38,6 @@ namespace Lidgren.Network
while (m_earlyReceived[nextSeqNr % m_windowSize])
{
//message = m_withheldMessages[nextSeqNr % m_windowSize];
//NetException.Assert(message != null);
// remove it from withheld messages
//m_withheldMessages[nextSeqNr % m_windowSize] = null;
//m_peer.LogVerbose("Releasing withheld message #" + message);
//m_peer.ReleaseMessage(message);
AdvanceWindow();
nextSeqNr++;
}
@@ -78,8 +61,6 @@ namespace Lidgren.Network
}
m_earlyReceived.Set(message.m_sequenceNumber % m_windowSize, true);
//m_peer.LogVerbose("Received " + message + " WITHHOLDING, waiting for " + m_windowStart);
//m_withheldMessages[message.m_sequenceNumber % m_windowSize] = message;
m_peer.ReleaseMessage(message);
}

View File

@@ -1,4 +1,4 @@
#define USE_SHA256
#define USE_SHA256
using System;
using System.Security.Cryptography;
@@ -75,8 +75,7 @@ namespace Lidgren.Network
byte[] total = new byte[innerHash.Length + salt.Length];
Buffer.BlockCopy(salt, 0, total, 0, salt.Length);
Buffer.BlockCopy(innerHash, 0, total, salt.Length, innerHash.Length);
// x ie. H(salt || H(username || ":" || password))
return new NetBigInteger(NetUtility.ToHexString(sha.ComputeHash(total)), 16).ToByteArrayUnsigned();
}
@@ -139,7 +138,7 @@ namespace Lidgren.Network
string one = NetUtility.ToHexString(clientPublicEphemeral);
string two = NetUtility.ToHexString(serverPublicEphemeral);
int len = 66; // Math.Max(one.Length, two.Length);
int len = 66;
string ccstr = one.PadLeft(len, '0') + two.PadLeft(len, '0');
byte[] cc = NetUtility.ToByteArray(ccstr);

View File

@@ -1,4 +1,4 @@
using System;
using System;
using System.IO;
using System.Xml;
using System.Net;
@@ -40,9 +40,6 @@ namespace Lidgren.Network
peer.Socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, true);
peer.RawSend(arr, 0, arr.Length, new IPEndPoint(IPAddress.Broadcast, 1900));
peer.Socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, false);
// allow some extra time for router to respond
// System.Threading.Thread.Sleep(50);
}
internal void ExtractServiceUrl(string resp)

View File

@@ -1,4 +1,4 @@
using System;
using System;
using System.Threading;
namespace Lidgren.Network
@@ -94,15 +94,10 @@ namespace Lidgren.Network
int relate = NetUtility.RelativeSequenceNumber(seqNr, m_windowStart);
if (relate < 0)
{
//m_connection.m_peer.LogDebug("Received late/dupe ack for #" + seqNr);
return; // late/duplicate ack
}
if (relate == 0)
{
//m_connection.m_peer.LogDebug("Received right-on-time ack for #" + seqNr);
// ack arrived right on time
NetException.Assert(seqNr == m_windowStart);

View File

@@ -1,4 +1,4 @@
/* Copyright (c) 2010 Michael Lidgren
/* Copyright (c) 2010 Michael Lidgren
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software without
@@ -107,7 +107,6 @@ namespace Lidgren.Network
{
if (ex.SocketErrorCode == SocketError.HostNotFound)
{
//LogWrite(string.Format(CultureInfo.InvariantCulture, "Failed to resolve host '{0}'.", ipOrHost));
callback(null);
return;
}
@@ -140,7 +139,6 @@ namespace Lidgren.Network
{
if (ex.SocketErrorCode == SocketError.HostNotFound)
{
//LogWrite(string.Format(CultureInfo.InvariantCulture, "Failed to resolve host '{0}'.", ipOrHost));
callback(null);
}
else
@@ -189,7 +187,6 @@ namespace Lidgren.Network
{
if (ex.SocketErrorCode == SocketError.HostNotFound)
{
//LogWrite(string.Format(CultureInfo.InvariantCulture, "Failed to resolve host '{0}'.", ipOrHost));
return null;
}
else
@@ -266,7 +263,7 @@ namespace Lidgren.Network
}
return new string(c);
}
/// <summary>
/// Gets the local broadcast address
/// </summary>
@@ -278,7 +275,7 @@ namespace Lidgren.Network
if (wifi.IsWifiEnabled)
{
var dhcp = wifi.DhcpInfo;
int broadcast = (dhcp.IpAddress & dhcp.Netmask) | ~dhcp.Netmask;
byte[] quads = new byte[4];
for (int k = 0; k < 4; k++)
@@ -292,7 +289,7 @@ namespace Lidgren.Network
{
return IPAddress.Broadcast;
}
#endif
#endif
#if IS_FULL_NET_AVAILABLE
try
{
@@ -301,7 +298,7 @@ namespace Lidgren.Network
{
return null;
}
IPInterfaceProperties properties = ni.GetIPProperties();
foreach (UnicastIPAddressInformation unicastAddress in properties.UnicastAddresses)
{
@@ -310,24 +307,24 @@ namespace Lidgren.Network
var mask = unicastAddress.IPv4Mask;
byte[] ipAdressBytes = unicastAddress.Address.GetAddressBytes();
byte[] subnetMaskBytes = mask.GetAddressBytes();
if (ipAdressBytes.Length != subnetMaskBytes.Length)
throw new ArgumentException("Lengths of IP address and subnet mask do not match.");
byte[] broadcastAddress = new byte[ipAdressBytes.Length];
for (int i = 0; i < broadcastAddress.Length; i++)
{
broadcastAddress[i] = (byte)(ipAdressBytes[i] | (subnetMaskBytes[i] ^ 255));
}
return new IPAddress(broadcastAddress);
return new IPAddress(broadcastAddress);
}
}
}
catch // Catch any errors
catch // Catch any errors
{
return IPAddress.Broadcast;
}
#endif
#endif
return IPAddress.Broadcast;
}
@@ -343,21 +340,21 @@ namespace Lidgren.Network
Android.Net.Wifi.WifiManager wifi = (Android.Net.Wifi.WifiManager)Android.App.Application.Context.GetSystemService(Android.App.Activity.WifiService);
if (!wifi.IsWifiEnabled) return null;
var dhcp = wifi.DhcpInfo;
int addr = dhcp.IpAddress;
byte[] quads = new byte[4];
for (int k = 0; k < 4; k++)
{
quads[k] = (byte) ((addr >> k * 8) & 0xFF);
}
}
return new IPAddress(quads);
}
catch // Catch Access Denied errors
{
return null;
}
#endif
#endif
#if IS_FULL_NET_AVAILABLE
NetworkInterface ni = GetNetworkInterface();
if (ni == null)
@@ -486,12 +483,6 @@ namespace Lidgren.Network
internal static int RelativeSequenceNumber(int nr, int expected)
{
return (nr - expected + NetConstants.NumSequenceNumbers + (NetConstants.NumSequenceNumbers / 2)) % NetConstants.NumSequenceNumbers - (NetConstants.NumSequenceNumbers / 2);
// old impl:
//int retval = ((nr + NetConstants.NumSequenceNumbers) - expected) % NetConstants.NumSequenceNumbers;
//if (retval > (NetConstants.NumSequenceNumbers / 2))
// retval -= NetConstants.NumSequenceNumbers;
//return retval;
}
/// <summary>
@@ -586,4 +577,4 @@ namespace Lidgren.Network
return bdr.ToString();
}
}
}
}

View File

@@ -0,0 +1,9 @@
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="12.0">
<Target Name="CopyResourcesFromShared">
<ItemGroup>
<_ResourceFiles Include="$(SolutionDir)bin\Shared\Resources\**\*.*" />
</ItemGroup>
<RemoveDir Directories="$(OutputPath)Resources" />
<Copy SourceFiles="@(_ResourceFiles)" DestinationFolder="$(OutputPath)Resources\%(RecursiveDir)" />
</Target>
</Project>

View File

@@ -0,0 +1,29 @@
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="12.0">
<!-- MSBuild hurts and I can't find a foolproof way to detect platform. -->
<PropertyGroup>
<OS Condition="'$(OS)' == ''">Windows_NT</OS>
</PropertyGroup>
<Choose>
<When Condition="'$(OS)' != 'Unix'">
<PropertyGroup>
<ActualOS>Windows</ActualOS>
</PropertyGroup>
</When>
<!-- Folders that *probably* only exist on MacOS and not Linux. -->
<When Condition="Exists('/Volumes') And Exists('/System') And Exists('/Library')" >
<PropertyGroup>
<ActualOS>MacOS</ActualOS>
</PropertyGroup>
</When>
<Otherwise>
<PropertyGroup>
<ActualOS>Linux</ActualOS>
</PropertyGroup>
</Otherwise>
</Choose>
<PropertyGroup>
<TargetOS Condition="'$(TargetOS)' == ''">$(ActualOS)</TargetOS>
<Python>python3</Python>
<Python Condition="'$(ActualOS)' == 'Windows'">py -3</Python>
</PropertyGroup>
</Project>

View File

@@ -1,21 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<DirectedGraph GraphDirection="LeftToRight" Layout="Sugiyama" xmlns="http://schemas.microsoft.com/vs/2009/dgml">
<Nodes>
<Node Id="Client" Category="Project" Label="Client" />
</Nodes>
<Links />
<Categories>
<Category Id="Project" />
</Categories>
<Properties>
<Property Id="GraphDirection" DataType="Microsoft.VisualStudio.Progression.Layout.GraphDirection" />
<Property Id="Label" Label="Label" Description="Displayable label of an Annotatable object" DataType="System.String" />
<Property Id="Layout" DataType="System.String" />
</Properties>
<Styles>
<Style TargetType="Node" GroupLabel="Project" ValueLabel="True">
<Condition Expression="HasCategory('Project')" />
<Setter Property="Background" Value="Blue" />
</Style>
</Styles>
</DirectedGraph>

41
RUN_THIS.py Executable file
View File

@@ -0,0 +1,41 @@
#!/usr/bin/env python3
# Import future so people on py2 still get the clear error that they need to upgrade.
from __future__ import print_function
import os
import sys
import traceback
VERSION = sys.version_info
NO_PROMPT = "--no-prompt" in sys.argv
sane_input = raw_input if VERSION.major < 3 else input
def main():
if VERSION.major < 3 or (VERSION.major == 3 and VERSION.minor < 5):
print("ERROR: You need at least Python 3.5 to build SS14.")
# Need "press enter to exit" stuff because Windows just immediately closes conhost.
if not NO_PROMPT:
sane_input("Press enter to exit...")
exit(1)
# Import git_helper by modifying the path.
ss14_dir = os.path.dirname(os.path.abspath(__file__))
sys.path.append(os.path.join(ss14_dir, "BuildChecker"))
try:
import git_helper
git_helper.main()
except Exception as e:
print("ERROR:")
traceback.print_exc()
print("This was NOT intentional. If the error is not immediately obvious, ask on Discord or IRC for help.")
if not NO_PROMPT:
sane_input("Press enter to exit...")
exit(1)
if __name__ == "__main__":
main()
if not NO_PROMPT:
sane_input("Success! Press enter to exit...")

View File

@@ -3,8 +3,6 @@
name: Janitor Jumpsuit
components:
- type: Transform
- type: Velocity
- type: Direction
- type: Clickable
- type: WearableAnimatedSprite
sprite: player_jumpsuit_gray
@@ -13,7 +11,7 @@
- type: Icon
icon: janitorsuit
- type: BasicMover
- type: BoundingBox
- type: Physics
mass: 5
@@ -22,16 +20,14 @@
name: Shoes
components:
- type: Transform
- type: Velocity
- type: Direction
- type: Clickable
- type: WearableAnimatedSprite
sprite: player_toolbox
sprite: player_shoes
notWornSprite: shoes
- type: Icon
icon: shoes
- type: BasicMover
- type: BoundingBox
- type: Physics
mass: 5

View File

@@ -3,9 +3,7 @@
name: Toolbox
components:
- type: Transform
- type: Velocity
- type: Clickable
- type: Direction
- type: WearableAnimatedSprite
sprite: player_toolbox
notWornSprite: toolbox_r
@@ -13,6 +11,6 @@
- type: Icon
icon: toolbox_r
- type: BasicMover
- type: BoundingBox
- type: Physics
mass: 5

View File

@@ -3,8 +3,6 @@
name: Door
components:
- type: Transform
- type: Velocity
- type: Direction
- type: Clickable
- type: Sprite
drawdepth: FloorPlaceable
@@ -15,5 +13,9 @@
- type: Icon
icon: door_ew
- type: BasicMover
- type: BoundingBox
- type: Collidable
placement:
snap:
- Wall

View File

@@ -3,15 +3,14 @@
name: Mop
components:
- type: Transform
- type: Velocity
- type: Direction
- type: Clickable
- type: WearableAnimatedSprite
sprite: player_toolbox
sprite: player_mop
notWornSprite: mop
- type: Icon
icon: mop
- type: BoundingBox
- type: Physics
- type: Clickable

View File

@@ -0,0 +1,20 @@
- type: entity
id: WallLight
name: Wall Light
components:
- type: Transform
- type: Clickable
- type: Sprite
sprites:
- wall_light
- type: Icon
icon: wall_light
- type: PointLight
radius: 1024
color: "#DCDCC6"
placement:
snap:
- Wallmount

View File

@@ -1,10 +1,8 @@
- type: entity
- type: entity
id: HumanMob
name: Urist McHuman
components:
- type: Transform
- type: Velocity
- type: Direction
- type: Clickable
- type: AnimatedSprite
sprite: player
@@ -12,12 +10,15 @@
- type: Icon
icon: player
- type: BasicMover
- type: BoundingBox
sizeX: 0.9
sizeY: 0.9
offsetY: 0.6
- type: ParticleSystem
- type: Physics
mass: 5
- type: Hitbox
sizeX: 25
sizeY: 25
- type: Collidable
DebugColor: "#0000FF"

View File

@@ -1,10 +1,8 @@
- type: entity
- type: entity
id: Worktop
name: Worktop
components:
- type: Transform
- type: Velocity
- type: Direction
- type: Clickable
- type: Sprite
sprites:
@@ -14,11 +12,10 @@
- type: Icon
icon: worktop_single
- type: BasicMover
- type: Hitbox
sizeX: 64
sizeY: 47
offsetY: 8
- type: BoundingBox
sizeX: 2
sizeY: 1.4
offsetY: 0.25
- type: Collidable
DebugColor: "#0000FF"

View File

@@ -3,36 +3,31 @@
name: Extinguisher Cabinet
components:
- type: Transform
- type: Velocity
- type: Direction
- type: Clickable
- type: Sprite
sprites:
- fire_extinguisher
- type: BasicMover
placement:
mode: AlignWall
range: 200
modes:
nodes:
- 18
- 26
- 32
snap:
- Wallmount
- type: entity
id: FireAlarm
name: Fire Alarm
components:
- type: Transform
- type: Velocity
- type: Direction
- type: Clickable
- type: Sprite
sprites:
- fire_alarm_off
- type: BasicMover
- type: Icon
icon: fire_alarm_off
@@ -43,22 +38,23 @@
- 5
- 10
- 15
snap:
- Wallmount
- type: entity
id: MedCabinet
name: Medical Cabinet
components:
- type: Transform
- type: Velocity
- type: Direction
- type: Clickable
- type: Sprite
sprites:
- med_cabinet
- type: BasicMover
- type: Icon
icon: med_cabinet
placement:
mode: AlignWall
snap:
- Wallmount

View File

@@ -0,0 +1,21 @@
- type: entity
id: Wall
name: Wall
components:
- type: Transform
- type: Clickable
- type: Sprite
drawdepth: FloorPlaceable
sprites:
- wall_texture
- type: Icon
icon: wall_texture
- type: BoundingBox
- type: Collidable
placement:
snap:
- Wall

View File

@@ -3,75 +3,23 @@
#define KERNEL_SIZE (RADIUS * 2 + 1)
uniform vec2 weights_offsets[KERNEL_SIZE];
uniform vec2 weights_offsets0;
uniform vec2 weights_offsets1;
uniform vec2 weights_offsets2;
uniform vec2 weights_offsets3;
uniform vec2 weights_offsets4;
uniform vec2 weights_offsets5;
uniform vec2 weights_offsets6;
uniform vec2 weights_offsets7;
uniform vec2 weights_offsets8;
uniform vec2 weights_offsets9;
uniform vec2 weights_offsets10;
uniform vec2 weights_offsets11;
uniform vec2 weights_offsets12;
uniform vec2 weights_offsets13;
uniform vec2 weights_offsets14;
uniform vec2 weights_offsets15;
uniform vec2 weights_offsets16;
uniform vec2 weights_offsets17;
uniform vec2 weights_offsets18;
uniform vec2 weights_offsets19;
uniform vec2 weights_offsets20;
uniform vec2 weights_offsets21;
uniform vec2 weights_offsets22;
uniform sampler2D colorMapTexture;
vec4 GaussianBlurHorizontal()
{
vec4 color = vec4(0,0,0,0);
vec2 weights_offsets[KERNEL_SIZE] = vec2[KERNEL_SIZE]
(
weights_offsets0,
weights_offsets1,
weights_offsets2,
weights_offsets3,
weights_offsets4,
weights_offsets5,
weights_offsets6,
weights_offsets7,
weights_offsets8,
weights_offsets9,
weights_offsets10,
weights_offsets11,
weights_offsets12,
weights_offsets13,
weights_offsets14,
weights_offsets15,
weights_offsets16,
weights_offsets17,
weights_offsets18,
weights_offsets19,
weights_offsets20,
weights_offsets21,
weights_offsets22
);
vec4 color = vec4(0,0,0,0);
for (int i = 0; i < KERNEL_SIZE; ++i)
{
color += texture2D(colorMapTexture, vec2(gl_TexCoord[0].x + weights_offsets[i].y, gl_TexCoord[0].y))* weights_offsets[i].x;
{
color += texture2D(colorMapTexture, vec2(gl_TexCoord[0].x + weights_offsets[i].y, gl_TexCoord[0].y))* weights_offsets[i].x;
}
return color;
}
void main()
{
gl_FragColor = GaussianBlurHorizontal();
gl_FragColor = GaussianBlurHorizontal();
}

View File

@@ -1,73 +1,23 @@
#version 120
#define RADIUS 11
#define KERNEL_SIZE (RADIUS * 2 + 1)
uniform vec2 weights_offsets[KERNEL_SIZE];
uniform vec2 weights_offsets0;
uniform vec2 weights_offsets1;
uniform vec2 weights_offsets2;
uniform vec2 weights_offsets3;
uniform vec2 weights_offsets4;
uniform vec2 weights_offsets5;
uniform vec2 weights_offsets6;
uniform vec2 weights_offsets7;
uniform vec2 weights_offsets8;
uniform vec2 weights_offsets9;
uniform vec2 weights_offsets10;
uniform vec2 weights_offsets11;
uniform vec2 weights_offsets12;
uniform vec2 weights_offsets13;
uniform vec2 weights_offsets14;
uniform vec2 weights_offsets15;
uniform vec2 weights_offsets16;
uniform vec2 weights_offsets17;
uniform vec2 weights_offsets18;
uniform vec2 weights_offsets19;
uniform vec2 weights_offsets20;
uniform vec2 weights_offsets21;
uniform vec2 weights_offsets22;
uniform sampler2D colorMapTexture;
vec4 GaussianBlurVertical()
{
vec2 weights_offsets[KERNEL_SIZE] = vec2[KERNEL_SIZE]
(
weights_offsets0,
weights_offsets1,
weights_offsets2,
weights_offsets3,
weights_offsets4,
weights_offsets5,
weights_offsets6,
weights_offsets7,
weights_offsets8,
weights_offsets9,
weights_offsets10,
weights_offsets11,
weights_offsets12,
weights_offsets13,
weights_offsets14,
weights_offsets15,
weights_offsets16,
weights_offsets17,
weights_offsets18,
weights_offsets19,
weights_offsets20,
weights_offsets21,
weights_offsets22
);
vec4 color = vec4(0,0,0,0);
for (int i = 0; i < KERNEL_SIZE; ++i)
{
color += texture2D(colorMapTexture, vec2(gl_TexCoord[0].x, gl_TexCoord[0].y + weights_offsets[i].y)) * weights_offsets[i].x; // M A G I K
}
}
return color;
}
void main()
{
gl_FragColor = GaussianBlurVertical();
gl_FragColor = GaussianBlurVertical();
}

View File

@@ -3,38 +3,20 @@
#define KERNEL_SIZE (RADIUS * 2 + 1)
uniform vec2 weights_offsets[KERNEL_SIZE];
uniform vec2 weights_offsets0;
uniform vec2 weights_offsets1;
uniform vec2 weights_offsets2;
uniform vec2 weights_offsets3;
uniform vec2 weights_offsets4;
uniform vec2 weights_offsets5;
uniform vec2 weights_offsets6;
uniform sampler2D colorMapTexture;
vec4 GaussianBlurHorizontal()
{
vec4 color = vec4(0,0,0,0);
vec2 weights_offsets[KERNEL_SIZE] = vec2[KERNEL_SIZE]
(
weights_offsets0,
weights_offsets1,
weights_offsets2,
weights_offsets3,
weights_offsets4,
weights_offsets5,
weights_offsets6
);
vec4 color = vec4(0,0,0,0);
for (int i = 0; i < KERNEL_SIZE; ++i)
color += texture2D(colorMapTexture, vec2(gl_TexCoord[0].x + weights_offsets[i].y, gl_TexCoord[0].y)) * weights_offsets[i].x;
return color;
}
void main()
{
gl_FragColor = GaussianBlurHorizontal();
{
gl_FragColor = GaussianBlurHorizontal();
}

View File

@@ -1,40 +1,22 @@
#version 120
#define RADIUS 3
#define KERNEL_SIZE (RADIUS * 2 + 1)
uniform vec2 weights_offsets[KERNEL_SIZE];
uniform vec2 weights_offsets0;
uniform vec2 weights_offsets1;
uniform vec2 weights_offsets2;
uniform vec2 weights_offsets3;
uniform vec2 weights_offsets4;
uniform vec2 weights_offsets5;
uniform vec2 weights_offsets6;
uniform sampler2D colorMapTexture;
vec4 GaussianBlurVertical()
{
vec4 color = vec4(0,0,0,0);
vec2 weights_offsets[KERNEL_SIZE] = vec2[KERNEL_SIZE]
(
weights_offsets0,
weights_offsets1,
weights_offsets2,
weights_offsets3,
weights_offsets4,
weights_offsets5,
weights_offsets6
);
for (int i = 0; i < KERNEL_SIZE; ++i)
color += texture2D(colorMapTexture, vec2(gl_TexCoord[0].x, gl_TexCoord[0].y + weights_offsets[i].y)) * weights_offsets[i].x;
return color;
}
void main()
{
gl_FragColor = GaussianBlurVertical();
{
gl_FragColor = GaussianBlurVertical();
}

View File

@@ -3,47 +3,21 @@
#define KERNEL_SIZE (RADIUS * 2 + 1)
uniform vec2 weights_offsets[KERNEL_SIZE];
uniform vec2 weights_offsets0;
uniform vec2 weights_offsets1;
uniform vec2 weights_offsets2;
uniform vec2 weights_offsets3;
uniform vec2 weights_offsets4;
uniform vec2 weights_offsets5;
uniform vec2 weights_offsets6;
uniform vec2 weights_offsets7;
uniform vec2 weights_offsets8;
uniform vec2 weights_offsets9;
uniform vec2 weights_offsets10;
uniform sampler2D colorMapTexture;
vec4 GaussianBlurHorizontal()
{
vec4 color = vec4(0,0,0,0);
vec2 weights_offsets[KERNEL_SIZE] = vec2[KERNEL_SIZE]
(
weights_offsets0,
weights_offsets1,
weights_offsets2,
weights_offsets3,
weights_offsets4,
weights_offsets5,
weights_offsets6,
weights_offsets7,
weights_offsets8,
weights_offsets9,
weights_offsets10
);
vec4 color = vec4(0,0,0,0);
for (int i = 0; i < KERNEL_SIZE; ++i)
color += texture2D(colorMapTexture, vec2(gl_TexCoord[0].x + weights_offsets[i].y, gl_TexCoord[0].y)) * weights_offsets[i].x;
return color;
}
void main()
{
gl_FragColor = GaussianBlurHorizontal();
gl_FragColor = GaussianBlurHorizontal();
}

View File

@@ -1,50 +1,24 @@
#version 120
#define RADIUS 5
#define KERNEL_SIZE (RADIUS * 2 + 1)
uniform vec2 weights_offsets[KERNEL_SIZE];
uniform vec2 weights_offsets0;
uniform vec2 weights_offsets1;
uniform vec2 weights_offsets2;
uniform vec2 weights_offsets3;
uniform vec2 weights_offsets4;
uniform vec2 weights_offsets5;
uniform vec2 weights_offsets6;
uniform vec2 weights_offsets7;
uniform vec2 weights_offsets8;
uniform vec2 weights_offsets9;
uniform vec2 weights_offsets10;
uniform sampler2D colorMapTexture;
vec4 GaussianBlurVertical()
{
vec4 color = vec4(0,0,0,0);
vec2 weights_offsets[KERNEL_SIZE] = vec2[KERNEL_SIZE]
(
weights_offsets0,
weights_offsets1,
weights_offsets2,
weights_offsets3,
weights_offsets4,
weights_offsets5,
weights_offsets6,
weights_offsets7,
weights_offsets8,
weights_offsets9,
weights_offsets10
);
for (int i = 0; i < KERNEL_SIZE; ++i)
color += texture2D(colorMapTexture, vec2(gl_TexCoord[0].x, gl_TexCoord[0].y + weights_offsets[i].y)) * weights_offsets[i].x;
return color;
}
void main()
{
gl_FragColor = GaussianBlurVertical();
{
gl_FragColor = GaussianBlurVertical();
}

View File

@@ -3,54 +3,21 @@
#define KERNEL_SIZE (RADIUS * 2 + 1)
uniform vec2 weights_offsets[KERNEL_SIZE];
uniform vec2 weights_offsets0;
uniform vec2 weights_offsets1;
uniform vec2 weights_offsets2;
uniform vec2 weights_offsets3;
uniform vec2 weights_offsets4;
uniform vec2 weights_offsets5;
uniform vec2 weights_offsets6;
uniform vec2 weights_offsets7;
uniform vec2 weights_offsets8;
uniform vec2 weights_offsets9;
uniform vec2 weights_offsets10;
uniform vec2 weights_offsets11;
uniform vec2 weights_offsets12;
uniform vec2 weights_offsets13;
uniform vec2 weights_offsets14;
uniform sampler2D colorMapTexture;
vec4 GaussianBlurHorizontal()
{
vec4 color = vec4(0,0,0,0);
vec2 weights_offsets[KERNEL_SIZE] = vec2[KERNEL_SIZE]
(
weights_offsets0,
weights_offsets1,
weights_offsets2,
weights_offsets3,
weights_offsets4,
weights_offsets5,
weights_offsets6,
weights_offsets7,
weights_offsets8,
weights_offsets9,
weights_offsets10,
weights_offsets11,
weights_offsets12,
weights_offsets13,
weights_offsets14
);
vec4 color = vec4(0,0,0,0);
for (int i = 0; i < KERNEL_SIZE; ++i)
color += texture2D(colorMapTexture, vec2(gl_TexCoord[0].x + weights_offsets[i].y, gl_TexCoord[0].y)) * weights_offsets[i].x;
return color;
}
void main()
{
{
gl_FragColor = GaussianBlurHorizontal();
}

View File

@@ -1,57 +1,22 @@
#version 120
#define RADIUS 7
#define KERNEL_SIZE (RADIUS * 2 + 1)
uniform vec2 weights_offsets[KERNEL_SIZE];
uniform vec2 weights_offsets0;
uniform vec2 weights_offsets1;
uniform vec2 weights_offsets2;
uniform vec2 weights_offsets3;
uniform vec2 weights_offsets4;
uniform vec2 weights_offsets5;
uniform vec2 weights_offsets6;
uniform vec2 weights_offsets7;
uniform vec2 weights_offsets8;
uniform vec2 weights_offsets9;
uniform vec2 weights_offsets10;
uniform vec2 weights_offsets11;
uniform vec2 weights_offsets12;
uniform vec2 weights_offsets13;
uniform vec2 weights_offsets14;
uniform vec2 weights_offsets[KERNEL_SIZE];
uniform sampler2D colorMapTexture;
vec4 GaussianBlurVertical()
{
vec4 color = vec4(0,0,0,0);
vec2 weights_offsets[KERNEL_SIZE] = vec2[KERNEL_SIZE]
(
weights_offsets0,
weights_offsets1,
weights_offsets2,
weights_offsets3,
weights_offsets4,
weights_offsets5,
weights_offsets6,
weights_offsets7,
weights_offsets8,
weights_offsets9,
weights_offsets10,
weights_offsets11,
weights_offsets12,
weights_offsets13,
weights_offsets14
);
for (int i = 0; i < KERNEL_SIZE; ++i)
color += texture2D(colorMapTexture, vec2(gl_TexCoord[0].x, gl_TexCoord[0].y + weights_offsets[i].y)) * weights_offsets[i].x;
return color;
}
void main()
{
gl_FragColor = GaussianBlurVertical();
gl_FragColor = GaussianBlurVertical();
}

View File

@@ -3,63 +3,21 @@
#define KERNEL_SIZE (RADIUS * 2 + 1)
uniform vec2 weights_offsets[KERNEL_SIZE];
uniform vec2 weights_offsets0;
uniform vec2 weights_offsets1;
uniform vec2 weights_offsets2;
uniform vec2 weights_offsets3;
uniform vec2 weights_offsets4;
uniform vec2 weights_offsets5;
uniform vec2 weights_offsets6;
uniform vec2 weights_offsets7;
uniform vec2 weights_offsets8;
uniform vec2 weights_offsets9;
uniform vec2 weights_offsets10;
uniform vec2 weights_offsets11;
uniform vec2 weights_offsets12;
uniform vec2 weights_offsets13;
uniform vec2 weights_offsets14;
uniform vec2 weights_offsets15;
uniform vec2 weights_offsets16;
uniform vec2 weights_offsets17;
uniform vec2 weights_offsets18;
uniform sampler2D colorMapTexture;
vec4 GaussianBlurHorizontal()
{
vec4 color = vec4(0,0,0,0);
vec2 weights_offsets[KERNEL_SIZE] = vec2[KERNEL_SIZE]
(
weights_offsets0,
weights_offsets1,
weights_offsets2,
weights_offsets3,
weights_offsets4,
weights_offsets5,
weights_offsets6,
weights_offsets7,
weights_offsets8,
weights_offsets9,
weights_offsets10,
weights_offsets11,
weights_offsets12,
weights_offsets13,
weights_offsets14,
weights_offsets15,
weights_offsets16,
weights_offsets17,
weights_offsets18
);
for (int i = 0; i < KERNEL_SIZE; ++i)
vec4 color = vec4(0,0,0,0);
for (int i = 0; i < KERNEL_SIZE; ++i)
color += texture2D(colorMapTexture, vec2(gl_TexCoord[0].x + weights_offsets[i].y, gl_TexCoord[0].y)) * weights_offsets[i].x;
return color;
}
void main()
{
gl_FragColor = GaussianBlurHorizontal();
return color;
}
void main()
{
gl_FragColor = GaussianBlurHorizontal();
}

View File

@@ -1,66 +1,22 @@
#version 120
#define RADIUS 9
#define KERNEL_SIZE (RADIUS * 2 + 1)
uniform vec2 weights_offsets[KERNEL_SIZE];
uniform vec2 weights_offsets0;
uniform vec2 weights_offsets1;
uniform vec2 weights_offsets2;
uniform vec2 weights_offsets3;
uniform vec2 weights_offsets4;
uniform vec2 weights_offsets5;
uniform vec2 weights_offsets6;
uniform vec2 weights_offsets7;
uniform vec2 weights_offsets8;
uniform vec2 weights_offsets9;
uniform vec2 weights_offsets10;
uniform vec2 weights_offsets11;
uniform vec2 weights_offsets12;
uniform vec2 weights_offsets13;
uniform vec2 weights_offsets14;
uniform vec2 weights_offsets15;
uniform vec2 weights_offsets16;
uniform vec2 weights_offsets17;
uniform vec2 weights_offsets18;
uniform sampler2D colorMapTexture;
vec4 GaussianBlurVertical()
{
vec4 color = vec4(0,0,0,0);
vec2 weights_offsets[KERNEL_SIZE] = vec2[KERNEL_SIZE]
(
weights_offsets0,
weights_offsets1,
weights_offsets2,
weights_offsets3,
weights_offsets4,
weights_offsets5,
weights_offsets6,
weights_offsets7,
weights_offsets8,
weights_offsets9,
weights_offsets10,
weights_offsets11,
weights_offsets12,
weights_offsets13,
weights_offsets14,
weights_offsets15,
weights_offsets16,
weights_offsets17,
weights_offsets18
);
for (int i = 0; i < KERNEL_SIZE; ++i)
color += texture2D(colorMapTexture, vec2(gl_TexCoord[0].x, gl_TexCoord[0].y + weights_offsets[i].y)) * weights_offsets[i].x;
return color;
}
void main()
{
gl_FragColor = GaussianBlurVertical();
gl_FragColor = GaussianBlurVertical();
}

View File

@@ -1,20 +1,8 @@
#version 120
#define NUM_LIGHTS 6
uniform vec4 LightPosData0;
uniform vec4 LightPosData1;
uniform vec4 LightPosData2;
uniform vec4 LightPosData3;
uniform vec4 LightPosData4;
uniform vec4 LightPosData5;
uniform vec4 LightPosData[NUM_LIGHTS];
uniform vec4 LightPosData[NUM_LIGHTS];
uniform vec4 Colors[NUM_LIGHTS];
uniform vec4 Colors0;
uniform vec4 Colors1;
uniform vec4 Colors2;
uniform vec4 Colors3;
uniform vec4 Colors4;
uniform vec4 Colors5;
uniform sampler2D light0;
uniform sampler2D light1;
@@ -25,61 +13,41 @@ uniform sampler2D light5;
uniform sampler2D sceneTexture;
vec4 PreLightBlendPS()
vec4 PreLightBlendPS()
{
vec4 Colors[NUM_LIGHTS] = vec4[NUM_LIGHTS]
(
Colors0,
Colors1,
Colors2,
Colors3,
Colors4,
Colors5
);
vec4 LightPosData[NUM_LIGHTS] = vec4[NUM_LIGHTS]
(
LightPosData0,
LightPosData1,
LightPosData2,
LightPosData3,
LightPosData4,
LightPosData5
);
vec4 l[NUM_LIGHTS];
vec2 ltc[NUM_LIGHTS];
for(int i = 0;i<NUM_LIGHTS;i++)
{
ltc[i] = vec2((gl_TexCoord[0].x - LightPosData[i].x) * LightPosData[i].z, (gl_TexCoord[0].y - LightPosData[i].y) * LightPosData[i].w);
}
l[0] = texture2D(light0, ltc[0]);
l[1] = texture2D(light1, ltc[1]);
l[2] = texture2D(light2, ltc[2]);
l[3] = texture2D(light3, ltc[3]);
l[4] = texture2D(light4, ltc[4]);
l[5] = texture2D(light5, ltc[5]);
vec4 l[NUM_LIGHTS];
vec2 ltc[NUM_LIGHTS];
for(int i = 0;i<NUM_LIGHTS;i++)
{
ltc[i] = vec2((gl_TexCoord[0].x - LightPosData[i].x) * LightPosData[i].z, (gl_TexCoord[0].y - LightPosData[i].y) * LightPosData[i].w);
}
l[0] = texture2D(light0, ltc[0]);
l[1] = texture2D(light1, ltc[1]);
l[2] = texture2D(light2, ltc[2]);
l[3] = texture2D(light3, ltc[3]);
l[4] = texture2D(light4, ltc[4]);
l[5] = texture2D(light5, ltc[5]);
l[0].rgb = l[0].rgb * Colors[0].rgb;
l[1].rgb = l[1].rgb * Colors[1].rgb;
l[2].rgb = l[2].rgb * Colors[2].rgb;
l[3].rgb = l[3].rgb * Colors[3].rgb;
l[4].rgb = l[4].rgb * Colors[4].rgb;
l[5].rgb = l[5].rgb * Colors[5].rgb;
vec4 s = texture2D(sceneTexture, gl_TexCoord[0].xy); // sample existing lights
//Add the lights together
float r = sqrt(pow(l[0].r, 2) + pow(l[1].r, 2) + pow(l[2].r, 2) + pow(l[3].r, 2) + pow(l[4].r, 2) + pow(l[5].r, 2) + pow(s.r, 2));
float g = sqrt(pow(l[0].g, 2) + pow(l[1].g, 2) + pow(l[2].g, 2) + pow(l[3].g, 2) + pow(l[4].g, 2) + pow(l[5].g, 2) + pow(s.g, 2));
float b = sqrt(pow(l[0].b, 2) + pow(l[1].b, 2) + pow(l[2].b, 2) + pow(l[3].b, 2) + pow(l[4].b, 2) + pow(l[5].b, 2) + pow(s.b, 2));
vec4 c = vec4(r,g,b, 1);
return c;
//Return the light color
return vec4(c.rgb,min(1, 1/max(c.r, max(c.g,c.b))));
l[0].rgb = l[0].rgb * Colors[0].rgb;
l[1].rgb = l[1].rgb * Colors[1].rgb;
l[2].rgb = l[2].rgb * Colors[2].rgb;
l[3].rgb = l[3].rgb * Colors[3].rgb;
l[4].rgb = l[4].rgb * Colors[4].rgb;
l[5].rgb = l[5].rgb * Colors[5].rgb;
vec4 s = texture2D(sceneTexture, gl_TexCoord[0].xy); // sample existing lights
//Add the lights together
float r = sqrt(pow(l[0].r, 2) + pow(l[1].r, 2) + pow(l[2].r, 2) + pow(l[3].r, 2) + pow(l[4].r, 2) + pow(l[5].r, 2) + pow(s.r, 2));
float g = sqrt(pow(l[0].g, 2) + pow(l[1].g, 2) + pow(l[2].g, 2) + pow(l[3].g, 2) + pow(l[4].g, 2) + pow(l[5].g, 2) + pow(s.g, 2));
float b = sqrt(pow(l[0].b, 2) + pow(l[1].b, 2) + pow(l[2].b, 2) + pow(l[3].b, 2) + pow(l[4].b, 2) + pow(l[5].b, 2) + pow(s.b, 2));
vec4 c = vec4(r,g,b, 1);
return c;
//Return the light color
return vec4(c.rgb,min(1, 1/max(c.r, max(c.g,c.b))));
}
void main()
{
gl_FragColor = PreLightBlendPS();
}
gl_FragColor = PreLightBlendPS();
}

1
SFML Submodule

Submodule SFML added at 0f22866353

View File

@@ -1,17 +1,22 @@
using OpenTK.Graphics;
using OpenTK;
using OpenTK.Graphics;
using SFML.Graphics;
using SFML.System;
using SFML.Window;
using SS14.Client.Graphics.Event;
using SS14.Client.Graphics.Render;
using SS14.Client.Graphics.Settings;
using SS14.Client.Graphics.Shader;
using SS14.Client.Graphics.View;
using System;
using System.Reflection;
using SS14.Shared.Network;
using SS14.Client.Graphics.Utility;
using SS14.Shared.Maths;
using SS14.Shared.Timing;
using System;
using GraphicsContext = OpenTK.Graphics.GraphicsContext;
using Vector2i = SS14.Shared.Maths.Vector2i;
using Vector2u = SS14.Shared.Maths.Vector2u;
using Vector2 = SS14.Shared.Maths.Vector2;
using SS14.Shared.Map;
using SS14.Shared.Interfaces.Map;
using SS14.Shared.IoC;
namespace SS14.Client.Graphics
{
@@ -20,39 +25,21 @@ namespace SS14.Client.Graphics
private static RenderTarget[] renderTargetArray;
public static GameTiming Time { get; private set; }
public static event FrameEventHandler FrameEvent;
public static Viewport CurrentClippingViewport;
public static event EventHandler<FrameEventArgs> FrameEvent;
public delegate void EventHandler();
public static event EventHandler RefreshVideoSettings;
#region Accessors
public static Vector2f WorldCenter { get; set; }
public static Vector2u ScreenViewportSize { get; set; }
public static int TileSize { get; set; }
public static FloatRect WorldViewport
{
get
{
return ScreenToWorld(ScreenViewport);
}
}
public static IntRect ScreenViewport
{
get
{
return new IntRect(0, 0, (int)ScreenViewportSize.X, (int)ScreenViewportSize.Y);
}
}
public static Box2 WorldViewport => ScreenToWorld(Box2i.FromDimensions(0, 0, (int)Window.Viewport.Size.X, (int)Window.Viewport.Size.Y));
public static bool IsInitialized { get; set; }
public static bool IsRunning { get; set; }
private static bool IsInitialized { get; set; }
public static bool IsRunning { get; private set; }
public static bool FrameStatsVisible { get; set; }
public static CluwneWindow SplashScreen { get; set; }
public static CluwneWindow Screen { get; set; }
public static VideoSettings Video { get; private set; }
public static Debug Debug { get; private set; }
public static InputEvents Input { get; internal set; }
private static CluwneWindow SplashScreen { get; set; }
public static CluwneWindow Window { get; private set; }
public static VideoSettings Video { get; }
public static Debug Debug { get; }
public static GLSLShader CurrentShader { get; internal set; }
public static BlendingModes BlendingMode { get; set; }
@@ -61,21 +48,19 @@ namespace SS14.Client.Graphics
get
{
if (renderTargetArray[0] == null)
renderTargetArray[0] = Screen;
renderTargetArray[0] = Window.Screen;
return renderTargetArray[0];
}
internal set
{
if (value == null)
value = Screen;
value = Window.Screen;
setAdditionalRenderTarget(0, value);
}
}
#endregion
static CluwneLib()
{
Video = new VideoSettings();
@@ -89,13 +74,12 @@ namespace SS14.Client.Graphics
/// Shamelessly taken from Gorgon.
public static void Go()
{
if (!IsInitialized)
{
Initialize();
}
if ((Screen != null) && (renderTargetArray == null))
if ((Window != null) && (renderTargetArray == null))
throw new InvalidOperationException("Something has gone terribly wrong!");
if (IsRunning)
@@ -107,10 +91,9 @@ namespace SS14.Client.Graphics
{
if (renderTargetArray[0] == null)
{
renderTargetArray[0] = Screen;
renderTargetArray[0] = Window.Screen;
}
}
}
IsRunning = true;
@@ -118,12 +101,11 @@ namespace SS14.Client.Graphics
public static CluwneWindow ShowSplashScreen(VideoMode vMode)
{
if (SplashScreen == null)
{
SplashScreen = new CluwneWindow(vMode, "Space Station 14", Styles.None);
}
if (SplashScreen != null)
return SplashScreen;
return SplashScreen;
var video = new VideoSettings(vMode);
return SplashScreen = new CluwneWindow(new RenderWindow(vMode, "Space Station 14", Styles.None), video);
}
public static void CleanupSplashScreen()
@@ -132,11 +114,6 @@ namespace SS14.Client.Graphics
SplashScreen = null;
}
public static void drawRectangle(int x, int y, int width, int height, object p)
{
throw new NotImplementedException();
}
public static void Initialize()
{
if (IsInitialized)
@@ -144,65 +121,59 @@ namespace SS14.Client.Graphics
Time = new GameTiming();
Screen = new CluwneWindow(CluwneLib.Video.getVideoMode(), "Developer Station 14", CluwneLib.Video.getWindowStyle());
Screen.SetVerticalSyncEnabled(true);
Screen.SetFramerateLimit(300);
var video = Video;
var wind = new RenderWindow(video.GetVideoMode(), "Developer Station 14", video.GetWindowStyle());
Window = new CluwneWindow(wind, video);
Window.Graphics.SetVerticalSyncEnabled(true);
Window.Graphics.SetFramerateLimit(300);
renderTargetArray = new RenderTarget[5];
CurrentClippingViewport = new Viewport(0, 0, Screen.Size.X, Screen.Size.Y);
//Window.Viewport = new Viewport(0, 0, 800, 600);
IsInitialized = true;
//Hook OpenTK into SFMLs Opengl
OpenTK.Toolkit.Init(new OpenTK.ToolkitOptions{
OpenTK.Toolkit.Init(new OpenTK.ToolkitOptions
{
// Non-Native backend doesn't have a default GetAddress method
Backend = OpenTK.PlatformBackend.PreferNative
});
new GraphicsContext(OpenTK.ContextHandle.Zero, null);
}
public static void RequestGC(Action action)
public static void ClearCurrentRendertarget(Color4 color)
{
action.Invoke();
}
public static void ClearCurrentRendertarget(Color color)
{
CurrentRenderTarget.Clear(color);
CurrentRenderTarget.Clear(color.Convert());
}
public static void Terminate()
{
CurrentClippingViewport = null;
IsInitialized = false;
Screen.Close();
Window.Close();
}
public static void RunIdle(object sender, FrameEventArgs e)
{
FrameEvent(sender, e);
FrameEvent?.Invoke(sender, e);
}
public static void Stop()
{
Console.WriteLine("CluwneLib: Stop() requested");
IsRunning=false;
IsRunning = false;
}
public static void UpdateVideoSettings()
{
RefreshVideoSettings();
RefreshVideoSettings();
}
#endregion
#endregion CluwneEngine
#region RenderTarget Stuff
public static void setAdditionalRenderTarget(int index, RenderTarget _target)
{
renderTargetArray[index] = _target;
renderTargetArray[index] = _target;
}
public static RenderTarget getAdditionalRenderTarget(int index)
@@ -210,7 +181,6 @@ namespace SS14.Client.Graphics
return renderTargetArray[index];
}
/// <summary>
/// resets the Current Render Target back to the screen
/// </summary>
@@ -227,9 +197,7 @@ namespace SS14.Client.Graphics
CurrentShader = null;
}
#endregion
#endregion RenderTarget Stuff
#region Drawing Methods
@@ -243,12 +211,12 @@ namespace SS14.Client.Graphics
/// <param name="WidthX"> Width X of rectangle </param>
/// <param name="HeightY"> Height Y of rectangle </param>
/// <param name="Color"> Fill Color </param>
public static void drawRectangle(int posX, int posY, int WidthX, int HeightY, Color Color)
public static void drawRectangle(int posX, int posY, int WidthX, int HeightY, Color4 Color)
{
RectangleShape rectangle = new RectangleShape();
rectangle.Position = new SFML.System.Vector2f(posX, posY);
rectangle.Size = new SFML.System.Vector2f(WidthX, HeightY);
rectangle.FillColor = Color;
rectangle.FillColor = Color.Convert();
CurrentRenderTarget.Draw(rectangle);
}
@@ -261,17 +229,16 @@ namespace SS14.Client.Graphics
/// <param name="WidthX"> Width X of rectangle </param>
/// <param name="HeightY"> Height Y of rectangle </param>
/// <param name="Color"> Fill Color </param>
public static void drawRectangle(float posX, float posY, float WidthX, float HeightY, Color Color)
public static void drawRectangle(float posX, float posY, float WidthX, float HeightY, Color4 Color)
{
RectangleShape rectangle = new RectangleShape();
rectangle.Position = new SFML.System.Vector2f(posX, posY);
rectangle.Size = new SFML.System.Vector2f(WidthX, HeightY);
rectangle.FillColor = Color;
rectangle.FillColor = Color.Convert();
CurrentRenderTarget.Draw(rectangle);
}
/// <summary>
/// Draws a Hollow Rectangle to the Current RenderTarget
/// </summary>
@@ -281,18 +248,18 @@ namespace SS14.Client.Graphics
/// <param name="heightY"> Height Y of rectangle </param>
/// <param name="OutlineThickness"> Outline Thickness of rectangle </param>
/// <param name="OutlineColor"> Outline Color </param>
public static void drawHollowRectangle(int posX, int posY, int widthX, int heightY, float OutlineThickness, Color OutlineColor)
public static void drawHollowRectangle(int posX, int posY, int widthX, int heightY, float OutlineThickness, Color4 OutlineColor)
{
RectangleShape HollowRect = new RectangleShape();
HollowRect.FillColor = Color.Transparent;
HollowRect.Position = new SFML.System.Vector2f(posX, posY);
HollowRect.Size = new SFML.System.Vector2f(widthX, heightY);
HollowRect.OutlineThickness = OutlineThickness;
HollowRect.OutlineColor = OutlineColor;
HollowRect.OutlineColor = OutlineColor.Convert();
CurrentRenderTarget.Draw(HollowRect);
}
#endregion
#endregion Rectangle
#region Circle
/// <summary>
@@ -302,16 +269,14 @@ namespace SS14.Client.Graphics
/// <param name="posY"> Pos Y of Circle </param>
/// <param name="radius"> Radius of Circle </param>
/// <param name="color"> Fill Color </param>
public static void drawCircle(int posX, int posY, int radius, Color color)
public static void drawCircle(int posX, int posY, int radius, Color4 color)
{
CircleShape Circle = new CircleShape();
Circle.Position = new Vector2f(posX, posY);
Circle.Radius = radius;
Circle.FillColor = color;
Circle.FillColor = color.Convert();
CurrentRenderTarget.Draw(Circle);
}
/// <summary>
/// Draws a Hollow Circle to the CurrentRenderTarget
@@ -321,36 +286,19 @@ namespace SS14.Client.Graphics
/// <param name="radius"> Radius of Circle </param>
/// <param name="OutlineThickness"> Thickness of Circle Outline </param>
/// <param name="OutlineColor"> Circle outline Color </param>
public static void drawHollowCircle(int posX, int posY, int radius,float OutlineThickness, Color OutlineColor)
public static void drawHollowCircle(int posX, int posY, int radius, float OutlineThickness, Color4 OutlineColor)
{
CircleShape Circle = new CircleShape();
Circle.Position = new Vector2f(posX, posY);
Circle.Position = new Vector2f(posX - radius, posY - radius);
Circle.Radius = radius;
Circle.FillColor = Color.Transparent;
Circle.OutlineThickness = OutlineThickness;
Circle.OutlineColor = OutlineColor;
Circle.OutlineColor = OutlineColor.Convert();
CurrentRenderTarget.Draw(Circle);
}
/// <summary>
/// Draws a Filled Circle to the CurrentRenderTarget
/// </summary>
/// <param name="posX"> Pos X of Circle </param>
/// <param name="posY"> Pos Y of Circle </param>
/// <param name="radius"> Radius of Cirle </param>
/// <param name="color"> Fill Color </param>
/// <param name="vector2"></param>
public static void drawCircle(float posX, float posY, int radius, Color color, Vector2f vector2)
{
CircleShape Circle = new CircleShape();
Circle.Position = new Vector2f(posX, posY);
Circle.Radius = radius;
Circle.FillColor = Color.Transparent;
CurrentRenderTarget.Draw(Circle);
}
#endregion
#endregion Circle
#region Point
/// <summary>
@@ -359,12 +307,12 @@ namespace SS14.Client.Graphics
/// <param name="posX"> Pos X of Point </param>
/// <param name="posY"> Pos Y of Point </param>
/// <param name="color"> Fill Color </param>
public static void drawPoint(int posX, int posY, Color color)
public static void drawPoint(int posX, int posY, Color4 color)
{
RectangleShape Point = new RectangleShape();
Point.Position = new Vector2f(posX, posY);
Point.Size = new Vector2f(1, 1);
Point.FillColor = color;
Point.FillColor = color.Convert();
CurrentRenderTarget.Draw(Point);
}
@@ -375,19 +323,19 @@ namespace SS14.Client.Graphics
/// <param name="posX"> Pos X of Point </param>
/// <param name="posY"> Pos Y of Point </param>
/// <param name="OutlineColor"> Outline Color </param>
public static void drawHollowPoint(int posX, int posY, Color OutlineColor)
public static void drawHollowPoint(int posX, int posY, Color4 OutlineColor)
{
RectangleShape hollowPoint = new RectangleShape();
hollowPoint.Position = new Vector2f(posX, posY);
hollowPoint.Size = new Vector2f(1, 1);
hollowPoint.FillColor = Color.Transparent;
hollowPoint.OutlineThickness = .6f;
hollowPoint.OutlineColor = OutlineColor;
hollowPoint.OutlineColor = OutlineColor.Convert();
CurrentRenderTarget.Draw(hollowPoint);
}
#endregion
#endregion Point
#region Line
/// <summary>
@@ -398,18 +346,20 @@ namespace SS14.Client.Graphics
/// <param name="rotate"> Line Rotation </param>
/// <param name="thickness"> Line Thickness </param>
/// <param name="Color"> Line Color </param>
public static void drawLine(int posX, int posY, int rotate,float thickness, Color Color)
public static void drawLine(float posX, float posY, float length, float rotate, float thickness, Color4 Color)
{
RectangleShape line = new RectangleShape();
line.Position = new Vector2f(posX, posY);
line.Size = new Vector2f(length, thickness);
line.Rotation = rotate;
line.OutlineThickness = thickness;
line.FillColor = Color;
line.FillColor = Color.Convert();
line.OutlineColor = Color.Convert();
CurrentRenderTarget.Draw(line);
}
#endregion
#endregion Line
#region Text
/// <summary>
@@ -420,127 +370,141 @@ namespace SS14.Client.Graphics
/// <param name="text"> Text to render </param>
/// <param name="size"> Size of the font </param>
/// <param name="textColor"> Color of the text </param>
public static void drawText(float posX, float posY, string text, uint size, Color textColor)
public static void drawText(float posX, float posY, string text, uint size, Color4 textColor, Font font)
{
Text _text = new Text(text, new Font(@"..\..\Resources\Fonts\bluehigh.ttf"));
Text _text = new Text(text, font);
_text.Position = new SFML.System.Vector2f(posX, posY);
_text.Color = textColor;
_text.FillColor = textColor.Convert();
_text.CharacterSize = size;
CurrentRenderTarget.Draw(_text);
}
#endregion
#endregion Text
#endregion
#endregion Drawing Methods
#region Client Window Data
/// <summary>
/// Transforms a point from the world (tile) space, to screen (pixel) space.
/// </summary>
public static Vector2f WorldToScreen(Vector2f point)
public static ScreenCoordinates WorldToScreen(LocalCoordinates point)
{
var center = WorldCenter;
return new Vector2f(
(point.X - center.X) * TileSize + ScreenViewportSize.X / 2,
(point.Y - center.Y) * TileSize + ScreenViewportSize.Y / 2
);
return new ScreenCoordinates(((point.Position - Window.Camera.Position) * Window.Camera.PixelsPerMeter + Window.Viewport.Size / 2), point.MapID);
}
public static Vector2 WorldToScreen(Vector2 point)
{
var center = Window.Camera.Position;
return (point - center) * Window.Camera.PixelsPerMeter + Window.Viewport.Size / 2;
}
/// <summary>
/// Transforms a rectangle from the world (tile) space, to screen (pixel) space.
/// </summary>
public static FloatRect WorldToScreen(FloatRect rect)
public static Box2 WorldToScreen(Box2 rect)
{
var center = WorldCenter;
return new FloatRect(
(rect.Left - center.X) * TileSize + ScreenViewportSize.X / 2,
(rect.Top - center.Y) * TileSize + ScreenViewportSize.Y / 2,
rect.Width * TileSize,
rect.Height * TileSize
);
var topLeft = new Vector2(rect.Left, rect.Top);
var bottomRight = new Vector2(rect.Right, rect.Bottom);
return new Box2(
WorldToScreen(topLeft),
WorldToScreen(bottomRight)
);
}
public static Vector2f WorldToTile(Vector2f point)
public static Vector2 WorldToTile(Vector2 point)
{
return new Vector2f(
return new Vector2(
(float)Math.Floor(point.X),
(float)Math.Floor(point.Y)
);
);
}
public static Vector2f TileToWorld(Vector2f point)
public static Vector2 TileToWorld(Vector2 point)
{
return new Vector2f(
return new Vector2(
point.X + 0.5f,
point.Y + 0.5f
);
);
}
/// <summary>
/// Transforms a point from the screen (pixel) space, to world (tile) space.
/// </summary>
public static Vector2f ScreenToWorld(Vector2i point)
public static LocalCoordinates ScreenToCoordinates(ScreenCoordinates point)
{
return new Vector2f(
((float)point.X - ScreenViewportSize.X / 2 ) / TileSize + WorldCenter.X,
((float)point.Y - ScreenViewportSize.Y / 2 ) / TileSize + WorldCenter.Y
);
var pos = (point.Position - Window.Viewport.Size / 2) / Window.Camera.PixelsPerMeter + Window.Camera.Position;
var grid = IoCManager.Resolve<IMapManager>().GetMap(point.MapID).FindGridAt(pos);
return new LocalCoordinates(pos, grid);
}
/// <summary>
/// Transforms a rectangle from the screen (pixel) space, to world (tile) space.
/// </summary>
public static FloatRect ScreenToWorld(IntRect rect)
{
var center = WorldCenter;
return new FloatRect(
((float)rect.Left - ScreenViewportSize.X / 2) / TileSize + center.X,
((float)rect.Top - ScreenViewportSize.Y / 2) / TileSize + center.Y,
rect.Width / TileSize,
rect.Height / TileSize
);
}
public static Box2 ScreenToWorld(Box2i rect)
{
var center = Window.Camera.Position;
return new Box2(
((Vector2)rect.TopLeft - Window.Viewport.Size / 2) / Window.Camera.PixelsPerMeter + center,
((Vector2)rect.BottomRight - Window.Viewport.Size / 2) / Window.Camera.PixelsPerMeter + center
);
}
/// <summary>
/// Transforms a point from the screen (pixel) space, to world (tile) space.
/// </summary>
public static LocalCoordinates ScreenToWorld(Vector2i point, int argMap)
{
var pos = ((Vector2)point - Window.Viewport.Size / 2) / Window.Camera.PixelsPerMeter + Window.Camera.Position;
var grid = IoCManager.Resolve<IMapManager>().GetMap(argMap).FindGridAt(pos);
return new LocalCoordinates(pos, grid);
}
/// <summary>
/// Scales a vector from pixel coordinates to tile coordinates.
/// </summary>
/// <param name="size"></param>
/// <returns></returns>
public static Vector2f PixelToTile(Vector2f vec)
public static Vector2 PixelToTile(Vector2 vec)
{
return new Vector2f(
vec.X / TileSize,
vec.Y / TileSize
);
return vec / Window.Camera.PixelsPerMeter;
}
/// <summary>
/// Scales a rectangle from pixel coordinates to tile coordinates.
/// </summary>
/// <param name="size"></param>
/// <returns></returns>
public static FloatRect PixelToTile(FloatRect rect)
{
return new FloatRect(
rect.Left / TileSize,
rect.Top / TileSize,
rect.Width / TileSize,
rect.Height / TileSize
);
}
#endregion Client Window Data
/// <summary>
/// Takes a point in world (tile) coordinates, and rounds it to the nearest pixel.
/// </summary>
public static Vector2f GetNearestPixel(Vector2f worldPoint)
}
public class InputEvents
{
public InputEvents(RenderWindow window)
{
return new Vector2f(
(float)Math.Round(worldPoint.X * TileSize) / TileSize,
(float)Math.Round(worldPoint.Y * TileSize) / TileSize
);
// if dummy don't attach events
if (window == null)
return;
RenderWindow _window = window;
_window.KeyPressed += (sender, args) => KeyPressed?.Invoke(sender, args);
_window.KeyReleased += (sender, args) => KeyReleased?.Invoke(sender, args);
_window.MouseButtonPressed += (sender, args) => MouseButtonPressed?.Invoke(sender, args);
_window.MouseButtonReleased += (sender, args) => MouseButtonReleased?.Invoke(sender, args);
_window.MouseMoved += (sender, args) => MouseMoved?.Invoke(sender, args);
_window.MouseWheelMoved += (sender, args) => MouseWheelMoved?.Invoke(sender, args);
_window.MouseEntered += (sender, args) => MouseEntered?.Invoke(sender, args);
_window.MouseLeft += (sender, args) => MouseLeft?.Invoke(sender, args);
_window.TextEntered += (sender, args) => TextEntered?.Invoke(sender, args);
}
#endregion
public event EventHandler<KeyEventArgs> KeyPressed;
public event EventHandler<KeyEventArgs> KeyReleased;
public event EventHandler<MouseButtonEventArgs> MouseButtonPressed;
public event EventHandler<MouseButtonEventArgs> MouseButtonReleased;
public event EventHandler<MouseMoveEventArgs> MouseMoved;
public event EventHandler<MouseWheelEventArgs> MouseWheelMoved;
public event EventHandler<EventArgs> MouseEntered;
public event EventHandler<EventArgs> MouseLeft;
public event EventHandler<TextEventArgs> TextEntered;
}
}

View File

@@ -20,8 +20,7 @@ namespace SS14.Client.Graphics.Collection
/// </para>
/// </remarks>
/// <typeparam name="T">Type of data to store.</typeparam>
public abstract class BaseCollection<T>
: IEnumerable<T>
public abstract class BaseCollection<T> : IEnumerable<T>
{
#region Variables.
private SortedList<string, T> _items = null; // Container for the collection data.

View File

@@ -1,41 +1,9 @@
using System;
namespace SS14.Client.Graphics
{
/// <summary>
/// Enumeration for primitive drawing style.
/// </summary>
public enum PrimitiveStyle
{
/// <summary>A series of individual points.</summary>
PointList = 0,
/// <summary>A series of individual lines.</summary>
LineList = 1,
/// <summary>A series of lines connected in a strip.</summary>
LineStrip = 2,
/// <summary>A series of individual triangles.</summary>
TriangleList = 3,
/// <summary>A series of triangles connected in a strip.</summary>
TriangleStrip = 4,
/// <summary>A series of triangles connected in a fan.</summary>
TriangleFan = 5
}
/// <summary>
/// Enumeration for culling modes.
/// </summary>
public enum CullingMode
{
/// <summary>Cull counter clockwise.</summary>
CounterClockwise = 0,
/// <summary>Cull clockwise.</summary>
Clockwise = 1,
/// <summary>No culling.</summary>
None = 2,
}
/// <summary>
/// Enumerator for vertex field contexts.
/// Used to define in which context the field will be used.
/// </summary>
@@ -206,204 +174,10 @@ namespace SS14.Client.Graphics
BufferRGB565 = 46
}
/// <summary>
/// Enumeration containing image operation flags.
/// </summary>
public enum ImageOperations
{
/// <summary>Disable the image layer.</summary>
Disable = 0,
/// <summary>Select the previous first operation argument.</summary>
SelectArgument1 = 1,
/// <summary>Select the previous second operation argument.</summary>
SelectArgument2 = 2,
/// <summary>Modulate the layer.</summary>
Modulate = 3,
/// <summary>Modulate the layer times 2.</summary>
Modulatex2 = 4,
/// <summary>Modulate the layer times 4.</summary>
Modulatex4 = 5,
/// <summary>Additive blending.</summary>
Additive = 6,
/// <summary>Additive blending with sign.</summary>
AdditiveSigned = 7,
/// <summary>Additive blending with sign times 2.</summary>
AdditiveSignedx2 = 8,
/// <summary>Additive blending with interpolation.</summary>
AdditiveSmooth = 9,
/// <summary>Subtract blending.</summary>
Subtract = 10,
/// <summary>Blend diffuse and alpha.</summary>
BlendDiffuseAlpha = 11,
/// <summary>Blend texture alpha.</summary>
BlendTextureAlpha = 12,
/// <summary>Blend factor alpha.</summary>
BlendFactorAlpha = 13,
/// <summary>Blend pre-multipled alpha.</summary>
BlendPreMultipliedTextureAlpha = 14,
/// <summary>Blend current alpha.</summary>
BlendCurrentAlpha = 15,
/// <summary>Pre modulate.</summary>
PreModulate = 16,
/// <summary>Modulate alpha, additive blending.</summary>
ModulateAlphaAddColor = 17,
/// <summary>Modulate color, additive alpha.</summary>
ModulateColorAddAlpha = 18,
/// <summary>Modulate inverse alpha, additive color.</summary>
ModulateInverseAlphaAddColor = 19,
/// <summary>Modulate inverse color, additive alpha.</summary>
ModulateInverseColorAddAlpha = 20,
/// <summary>Bump mapping using an environment map.</summary>
BumpEnvironmentMap = 21,
/// <summary>Bump mapping using an environment map with luminance.</summary>
BumpEnvironmentMapLuminance = 22,
/// <summary>Bump mapping using Dot3 product.</summary>
BumpDotProduct = 23,
/// <summary>Multiply and Add.</summary>
MultiplyAdd = 24,
/// <summary>Linear interpolation.</summary>
Lerp = 25
}
/// <summary>
/// Enumeration containing arguments for image operations.
/// </summary>
public enum ImageOperationArguments
{
/// <summary>Get the current setting.</summary>
Current = 0,
/// <summary>Diffuse color from the vertex.</summary>
Diffuse = 1,
/// <summary>Texture color from the layer.</summary>
Texture = 2,
/// <summary>Texture factor.</summary>
TextureFactor = 3,
/// <summary>Temporary register.</summary>
Temp = 4,
/// <summary>Constant value.</summary>
Constant = 5,
/// <summary>Copy alpha values to color values.</summary>
AlphaReplicate = 6,
/// <summary>One's complement.</summary>
Complement = 7,
/// <summary>Specular value from the vertex.</summary>
Specular = 8
}
/// <summary>
/// Enumeration containing filter types for images.
/// </summary>
public enum ImageFilters
{
/// <summary>No filtering.</summary>
None = 0,
/// <summary>Point filtering.</summary>
Point = 1,
/// <summary>Bilinear filtering.</summary>
Bilinear = 2,
/// <summary>Anisotropic filtering.</summary>
Anisotropic = 3,
/// <summary>Pyramidal quadratic filtering.</summary>
PyramidalQuadratic = 4,
/// <summary>Gaussian quadratic filtering.</summary>
GaussianQuadratic = 5
}
/// <summary>
/// Enumeration containing the types of images we can create.
/// </summary>
/// <remarks>The RenderTarget value is used internally by Gorgon and should not be used when creating an image, however it can be used when validating an image format with
/// <see cref="M:GorgonLibrary.Driver.ValidImageFormat">Driver.ValidImageFormat</see> or <see cref="M:GorgonLibrary.Graphics.Image.ValidateFormat">Image.ValidateFormat</see>.
/// <para>The Dynamic value will ensure the image is dynamic whether the <see cref="P:GorgonLibrary.Driver.SupportDynamicTextures">Driver.SupportDynamicTextures</see> property is TRUE or FALSE.
/// If the hardware supports dynamic textures then Gorgon will make use of it, otherwise the image will be a normal image placed in the default pool.</para>
/// </remarks>
public enum ImageType
{
/// <summary>A normal static image.</summary>
Normal = 0,
/// <summary>Dynamic image.</summary>
Dynamic = 1,
/// <summary>
/// A render target image.
/// </summary>
RenderTarget = 0x7FFF
}
/// <summary>
/// Enumeration containing the types of image addressing modes.
/// </summary>
public enum ImageAddressing
{
/// <summary>Make image wrap around.</summary>
Wrapping = 0,
/// <summary>Make image mirror.</summary>
Mirror = 1,
/// <summary>Make image mirror only once.</summary>
MirrorOnce = 2,
/// <summary>Make image clamp to values..</summary>
Clamp = 3,
/// <summary>Display a border.</summary>
Border = 4
}
/// <summary>
/// Enumeration containing image file formats.
/// </summary>
public enum ImageFileFormat
{
/// <summary>
/// Windows bitmap format.
/// </summary>
BMP = 0,
/// <summary>
/// Joint photographers expert group.
/// </summary>
JPEG = 1,
/// <summary>
/// Portable network graphics.
/// </summary>
PNG = 2,
/// <summary>
/// Truevision Targa.
/// </summary>
TGA = 3,
/// <summary>
/// Direct X surface.
/// </summary>
DDS = 4,
/// <summary>
/// Device independant bitmap.
/// </summary>
DIB = 5,
/// <summary>
/// Portable pixmap.
/// </summary>
PPM = 6,
/// <summary>
/// Portable floating point.
/// </summary>
PFM = 7
}
/// <summary>
/// Enumeration containing locations of the vertices.
/// </summary>
public enum VertexLocations
{
/// <summary>Upper left corner.</summary>
UpperLeft = 0,
/// <summary>Lower left corner.</summary>
LowerLeft = 3,
/// <summary>Upper right corner.</summary>
UpperRight = 1,
/// <summary>Lower right corner.</summary>
LowerRight = 2
}
/// <summary>
/// Enumeration containing blending modes.
/// </summary>
[Flags()]
[Flags]
public enum BlendingModes
{
/// <summary>No blending.</summary>
@@ -423,103 +197,5 @@ namespace SS14.Client.Graphics
/// <summary>Invert.</summary>
Inverted = 64
}
/// <summary>
/// Enumeration for smoothing operations.
/// </summary>
public enum Smoothing
{
/// <summary>No smoothing.</summary>
None = 0,
/// <summary>Smooth both zoomed in and out.</summary>
Smooth = 1,
/// <summary>Smooth only zoomed in.</summary>
MagnificationSmooth = 2,
/// <summary>Smooth only zoomed out.</summary>
MinificationSmooth = 3
}
/// <summary>
/// Enumeration for aligment.
/// </summary>
public enum Alignment
{
/// <summary>Left aligned.</summary>
Left = 0,
/// <summary>Centered.</summary>
Center = 1,
/// <summary>Right aligned.</summary>
Right = 2,
/// <summary>Upper left corner.</summary>
UpperLeft = 3,
/// <summary>Upper centered.</summary>
UpperCenter = 4,
/// <summary>Upper right.</summary>
UpperRight = 5,
/// <summary>Lower left.</summary>
LowerLeft = 6,
/// <summary>Lower centered.</summary>
LowerCenter = 7,
/// <summary>Lower right.</summary>
LowerRight = 8
}
/// <summary>
/// Enumeration for stencil buffer operations.
/// </summary>
public enum StencilOperations
{
/// <summary>Write zero to the buffer.</summary>
Zero = 0,
/// <summary>Decrement buffer value.</summary>
Decrement = 1,
/// <summary>Increment buffer value.</summary>
Increment = 2,
/// <summary>Invert buffer value.</summary>
Invert = 3,
/// <summary>Decrement buffer value, clamp to minimum.</summary>
DecrementSaturate = 4,
/// <summary>Increment buffer value, clamp to maximum.</summary>
IncrementSaturate = 5,
/// <summary>Keep the current value.</summary>
Keep = 6,
/// <summary>Replace the value with the reference value.</summary>
Replace = 7
}
/// <summary>
/// Enumeration for alpha blending operations.
/// </summary>
public enum AlphaBlendOperation
{
/// <summary>Blend factor of 0,0,0.</summary>
Zero = 0,
/// <summary>Blend factor is 1,1,1.</summary>
One = 1,
/// <summary>Blend factor is Rs', Gs', Bs', As.</summary>
SourceColor = 2,
/// <summary>Blend factor is As', As', As', As.</summary>
SourceAlpha = 3,
/// <summary>Blend factor is 1-Rs', 1-Gs', 1-Bs', 1-As.</summary>
InverseSourceColor = 4,
/// <summary>Blend factor is 1-As', 1-As', 1-As', 1-As.</summary>
InverseSourceAlpha = 5,
/// <summary>Blend factor is Rd', Gd', Bd', Ad.</summary>
DestinationColor = 6,
/// <summary>Blend factor is Ad', Ad', Ad', Ad.</summary>
DestinationAlpha = 7,
/// <summary>Blend factor is 1-Rd', 1-Gd', 1-Bd', 1-Ad.</summary>
InverseDestinationColor = 8,
/// <summary>Blend factor is 1-Ad', 1-Ad', 1-Ad', 1-Ad.</summary>
InverseDestinationAlpha = 9,
/// <summary>Blend factor is f,f,f,1 where f = min(A, 1-Ad)</summary>
SourceAlphaSaturation = 10,
/// <summary>Source blend factor is 1-As', 1-As', 1-As', 1-As and destination is As', As', As', As. Overrides the blend destination, and is only valid if the SourceBlend state is true.</summary>
BothInverseSourceAlpha = 11,
/// <summary>Constant color blend factor. Only valid if the driver SupportBlendingFactor is true.</summary>
BlendFactor = 12,
/// <summary>Inverted constant color blend factor. Only valid if the driver SupportBlendingFactor capability is true.</summary>
InverseBlendFactor = 13
}
}

View File

@@ -1,22 +0,0 @@
using System;
namespace SS14.Client.Graphics.Event
{
public delegate void FrameEventHandler(object sender, FrameEventArgs e);
public class FrameEventArgs : EventArgs
{
private float _frameDeltaTime;
public FrameEventArgs(float frameDeltaTime)
{
_frameDeltaTime = frameDeltaTime;
}
public float FrameDeltaTime
{
get { return _frameDeltaTime; }
}
}
}

View File

@@ -1,7 +0,0 @@
namespace SS14.Client.Graphics.Interface
{
public interface ICluwneDrawable
{
void Draw();
}
}

View File

@@ -0,0 +1,21 @@
using OpenTK;
using OpenTK.Graphics;
using SS14.Shared;
using SS14.Shared.Map;
using Vector2 = SS14.Shared.Maths.Vector2;
namespace SS14.Client.Graphics.Lighting
{
public interface ILight
{
int Radius { get; set; }
Color4 Color { get; set; }
Vector4 ColorVec { get; }
LocalCoordinates Coordinates { get; set; }
LightState LightState { get; set; }
ILightArea LightArea { get; }
LightMode LightMode { get; set; }
void Update(float frametime);
void SetMask(SFML.Graphics.Sprite _mask);
}
}

View File

@@ -0,0 +1,16 @@
using SS14.Shared.Maths;
namespace SS14.Client.Graphics.Lighting
{
public interface ILightArea
{
Vector2 LightPosition { get; set; }
Vector2 LightAreaSize { get; }
bool Calculated { get; set; }
Vector2 ToRelativePosition(Vector2 worldPosition);
void BeginDrawingShadowCasters();
void EndDrawingShadowCasters();
void SetMask(SFML.Graphics.Sprite mask);
}
}

View File

@@ -0,0 +1,18 @@
using OpenTK;
using SS14.Shared;
namespace SS14.Client.Graphics.Lighting
{
public interface ILightManager
{
SFML.Graphics.Sprite LightMask { get; set; }
ILight CreateLight();
void AddLight(ILight light);
void RemoveLight(ILight light);
void RecalculateLights();
void RecalculateLightsInView(Box2 rect);
ILight[] LightsIntersectingRect(Box2 rect);
ILight[] GetLights();
void SetLightMode(LightModeClass? mode, ILight light);
}
}

View File

@@ -0,0 +1,97 @@
using OpenTK;
using OpenTK.Graphics;
using SS14.Shared;
using SS14.Shared.IoC;
using SS14.Shared.Map;
using Vector2 = SS14.Shared.Maths.Vector2;
namespace SS14.Client.Graphics.Lighting
{
public class Light : ILight
{
private LightState lightState = LightState.On;
private Vector2 position;
private int MapID;
private int GridID;
private int radius;
public Light()
{
Radius = 256;
}
public LocalCoordinates Coordinates
{
get => new LocalCoordinates(position, GridID, MapID);
set
{
if (position != value.Position || MapID != value.MapID || GridID != value.GridID)
{
position = value.Position;
MapID = value.MapID;
GridID = value.GridID;
LightArea.Calculated = false;
}
}
}
public Color4 Color { get; set; }
public Vector4 ColorVec => new Vector4(Color.R, Color.G, Color.B, Color.A);
public int Radius
{
get => radius;
set
{
if (radius != value)
{
radius = value;
LightArea = new LightArea(RadiusToShadowMapSize(radius), IoCManager.Resolve<ILightManager>().LightMask);
}
}
}
public ILightArea LightArea { get; private set; }
public LightState LightState
{
get => lightState;
set
{
if (lightState != value)
{
lightState = value;
LightArea.Calculated = false;
}
}
}
public LightMode LightMode { get; set; }
public void SetMask(SFML.Graphics.Sprite mask)
{
LightArea.SetMask(mask);
}
public void Update(float frametime)
{
LightMode?.Update(this);
}
public static ShadowmapSize RadiusToShadowMapSize(int Radius)
{
if (Radius <= 128)
return ShadowmapSize.Size128;
if (Radius <= 256)
return ShadowmapSize.Size256;
if (Radius <= 512)
return ShadowmapSize.Size512;
return ShadowmapSize.Size1024;
}
}
}

View File

@@ -0,0 +1,81 @@
using OpenTK;
using SFML.Graphics;
using SS14.Client.Graphics.Render;
using Vector2 = SS14.Shared.Maths.Vector2;
namespace SS14.Client.Graphics.Lighting
{
public class LightArea : ILightArea
{
public LightArea(ShadowmapSize shadowmapSize, SFML.Graphics.Sprite mask)
{
var baseSize = 2 << (int) shadowmapSize;
LightAreaSize = new Vector2(baseSize, baseSize);
RenderTarget = new RenderImage("LightArea" + shadowmapSize, (uint) baseSize, (uint) baseSize);
Mask = mask;
}
public RenderImage RenderTarget { get; }
public SFML.Graphics.Sprite Mask { get; set; }
public bool MaskFlipX { get; set; }
public bool MaskFlipY { get; set; }
public bool Rot90 { get; set; }
public Vector4 MaskProps
{
get
{
if (Rot90 && MaskFlipX && MaskFlipY)
return maskPropsVec(false, false, false);
if (Rot90 && MaskFlipX && !MaskFlipY)
return maskPropsVec(true, false, true);
if (Rot90 && !MaskFlipX && MaskFlipY)
return maskPropsVec(true, true, false);
if (Rot90 && !MaskFlipX && !MaskFlipY)
return maskPropsVec(true, false, false);
if (!Rot90 && MaskFlipX && MaskFlipY)
return maskPropsVec(false, true, true);
if (!Rot90 && MaskFlipX && !MaskFlipY)
return maskPropsVec(false, true, false);
if (!Rot90 && !MaskFlipX && MaskFlipY)
return maskPropsVec(false, false, true);
return maskPropsVec(false, false, false);
}
}
/// <summary>
/// World position coordinates of the light's center
/// </summary>
public Vector2 LightPosition { get; set; }
public Vector2 LightAreaSize { get; set; }
public bool Calculated { get; set; }
public Vector2 ToRelativePosition(Vector2 worldPosition)
{
return worldPosition - (CluwneLib.WorldToScreen(LightPosition) - LightAreaSize * 0.5f);
}
public void BeginDrawingShadowCasters()
{
RenderTarget.BeginDrawing();
RenderTarget.Clear(new Color(0, 0, 0, 0));
}
public void EndDrawingShadowCasters()
{
RenderTarget.EndDrawing();
}
public void SetMask(SFML.Graphics.Sprite mask)
{
Mask = mask;
}
private Vector4 maskPropsVec(bool rot, bool flipx, bool flipy)
{
return new Vector4(rot ? 1 : 0, flipx ? 1 : 0, flipy ? 1 : 0, 0);
}
}
}

View File

@@ -1,30 +1,27 @@
using SFML.Graphics;
using SFML.System;
using SS14.Client.Interfaces.Lighting;
using SS14.Shared;
using SS14.Shared.Maths;
using SS14.Shared.IoC;
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using OpenTK;
using SS14.Shared;
using SS14.Shared.Maths;
using Vector2 = SS14.Shared.Maths.Vector2;
namespace SS14.Client.Lighting
namespace SS14.Client.Graphics.Lighting
{
public class LightManager : ILightManager
{
private readonly List<Type> LightModes = new List<Type>();
private readonly List<ILight> _lights = new List<ILight>();
private readonly List<Type> LightModes = new List<Type>();
public LightManager()
{
List<Assembly> assemblies = AppDomain.CurrentDomain.GetAssemblies().ToList();
var assemblies = AppDomain.CurrentDomain.GetAssemblies().ToList();
LightModes =
assemblies.SelectMany(t => t.GetTypes()).Where(
p => typeof (LightMode).IsAssignableFrom(p) && !p.IsInterface).ToList();
p => typeof(LightMode).IsAssignableFrom(p) && !p.IsInterface).ToList();
}
#region ILightManager Members
public SFML.Graphics.Sprite LightMask { get; set; }
public void SetLightMode(LightModeClass? mode, ILight light)
{
@@ -37,8 +34,8 @@ namespace SS14.Client.Lighting
}
return;
}
foreach (Type t in LightModes)
foreach (var t in LightModes)
{
var temp = (LightMode) Activator.CreateInstance(t);
if (temp.LightModeClass == mode.Value)
@@ -72,22 +69,10 @@ namespace SS14.Client.Lighting
return _lights.ToArray();
}
public ILight[] lightsInRadius(Vector2f point, float radius)
{
return _lights.FindAll(l => Math.Abs((l.Position - point).LengthSquared()) <= radius * radius).ToArray();
}
public ILight[] LightsIntersectingRect(FloatRect rect)
public ILight[] LightsIntersectingRect(Box2 rect)
{
return _lights
.FindAll(l => new FloatRect(l.LightArea.LightPosition - l.LightArea.LightAreaSize / 2, l.LightArea.LightAreaSize).Intersects(rect))
.ToArray();
}
public ILight[] LightsIntersectingPoint(Vector2f point)
{
return _lights
.FindAll(l => new FloatRect(l.LightArea.LightPosition - l.LightArea.LightAreaSize / 2, l.LightArea.LightAreaSize).Contains(point.X, point.Y))
.FindAll(l => Box2.FromDimensions(l.LightArea.LightPosition - l.LightArea.LightAreaSize / 2, l.LightArea.LightAreaSize).Intersects(rect))
.ToArray();
}
@@ -98,30 +83,40 @@ namespace SS14.Client.Lighting
public void RecalculateLights()
{
foreach (ILight l in _lights)
foreach (var l in _lights)
{
l.LightArea.Calculated = false;
}
}
public void RecalculateLightsInView(Vector2f point)
public void RecalculateLightsInView(Box2 rect)
{
ILight[] lights = LightsIntersectingPoint(point);
foreach (ILight l in lights)
var lights = LightsIntersectingRect(rect);
foreach (var l in lights)
{
l.LightArea.Calculated = false;
}
}
public void RecalculateLightsInView(FloatRect rect)
public ILight[] lightsInRadius(Vector2 point, float radius)
{
ILight[] lights = LightsIntersectingRect(rect);
foreach (ILight l in lights)
return _lights.FindAll(l => Math.Abs((l.Coordinates.Position - point).LengthSquared) <= radius * radius).ToArray();
}
public ILight[] LightsIntersectingPoint(Vector2 point)
{
return _lights
.FindAll(l => Box2.FromDimensions(l.LightArea.LightPosition - l.LightArea.LightAreaSize / 2, l.LightArea.LightAreaSize).Contains(point))
.ToArray();
}
public void RecalculateLightsInView(Vector2 point)
{
var lights = LightsIntersectingPoint(point);
foreach (var l in lights)
{
l.LightArea.Calculated = false;
}
}
#endregion
}
}

View File

@@ -0,0 +1,12 @@
using SS14.Shared;
namespace SS14.Client.Graphics.Lighting
{
public interface LightMode
{
LightModeClass LightModeClass { get; }
void OnAdd(ILight owner);
void OnRemove(ILight owner);
void Update(ILight owner);
}
}

View File

@@ -1,19 +1,13 @@
using System;
using OpenTK;
using SFML.Graphics;
using SFML.System;
using SS14.Client.Graphics;
using SS14.Client.Graphics.Render;
using SS14.Client.Graphics.Shader;
using SS14.Client.Interfaces.Resource;
using SS14.Shared.Maths;
using System;
using Color = SFML.Graphics.Color;
namespace SS14.Client.Lighting
namespace SS14.Client.Graphics.Lighting
{
public class ShadowMapResolver : IDisposable
{
private readonly IResourceCache _resourceCache;
private readonly int baseSize;
private readonly int reductionChainCount;
@@ -23,29 +17,38 @@ namespace SS14.Client.Lighting
private RenderImage distancesRT;
private RenderImage distortRT;
private RenderImage processedShadowsRT;
private RenderImage shadowMap;
private RenderImage shadowsRT;
private TechniqueList reductionEffectTechnique;
private RenderImage[] reductionRT;
private TechniqueList resolveShadowsEffectTechnique;
private TechniqueList reductionEffectTechnique;
private RenderImage shadowMap;
private RenderImage shadowsRT;
public ShadowMapResolver(ShadowmapSize maxShadowmapSize, ShadowmapSize maxDepthBufferSize,
IResourceCache resourceCache)
public ShadowMapResolver(ShadowmapSize maxShadowmapSize, ShadowmapSize maxDepthBufferSize)
{
_resourceCache = resourceCache;
reductionChainCount = (int) maxShadowmapSize;
baseSize = 2 << reductionChainCount;
depthBufferSize = 2 << (int) maxDepthBufferSize;
}
public void LoadContent()
public void Dispose()
{
reductionEffectTechnique = _resourceCache.GetTechnique("reductionEffect");
resolveShadowsEffectTechnique = _resourceCache.GetTechnique("resolveShadowsEffect");
distancesRT.Dispose();
distortRT.Dispose();
processedShadowsRT.Dispose();
foreach (var rt in reductionRT)
{
rt.Dispose();
}
shadowMap.Dispose();
shadowsRT.Dispose();
}
public void LoadContent(TechniqueList reduction, TechniqueList resolve)
{
reductionEffectTechnique = reduction;
resolveShadowsEffectTechnique = resolve;
//// BUFFER TYPES ARE VERY IMPORTANT HERE AND IT WILL BREAK IF YOU CHANGE THEM!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! HONK HONK
//these work fine
@@ -55,42 +58,37 @@ namespace SS14.Client.Lighting
//these need the buffer format
shadowMap = new RenderImage("shadowMap" + baseSize, 2, baseSize, ImageBufferFormats.BufferGR1616F);
reductionRT = new RenderImage[reductionChainCount];
for (int i = 0; i < reductionChainCount; i++)
for (var i = 0; i < reductionChainCount; i++)
{
reductionRT[i] = new RenderImage("reductionRT" + i + baseSize, 2 << i, baseSize,
ImageBufferFormats.BufferGR1616F);
ImageBufferFormats.BufferGR1616F);
}
shadowsRT = new RenderImage("shadowsRT" + baseSize, baseSize, baseSize, ImageBufferFormats.BufferRGB888A8);
processedShadowsRT = new RenderImage("processedShadowsRT" + baseSize, baseSize, baseSize,
ImageBufferFormats.BufferRGB888A8);
ImageBufferFormats.BufferRGB888A8);
}
public void ResolveShadows(LightArea Area, bool attenuateShadows, Texture mask = null)
{
RenderImage Result = Area.RenderTarget;
Texture MaskTexture = mask == null ? Area.Mask.Texture : mask;
Vector4f MaskProps = Vector4f.Zero;
Vector4f diffuseColor = Vector4f.One;
var Result = Area.RenderTarget;
var MaskTexture = mask == null ? Area.Mask.Texture : mask;
var MaskProps = Vector4.Zero;
var diffuseColor = Vector4.One;
//Debug.DebugRendertarget(Area.RenderTarget);
ExecuteTechnique(Area.RenderTarget, distancesRT, "ComputeDistances");
//Debug.DebugRendertarget(distancesRT);
ExecuteTechnique(distancesRT, distortRT, "Distort");
//Debug.DebugRendertarget(distortRT);
// Working now
ApplyHorizontalReduction(distortRT, shadowMap);
//only DrawShadows needs these vars
resolveShadowsEffectTechnique["DrawShadows"].SetParameter("AttenuateShadows", attenuateShadows ? 0 : 1);
resolveShadowsEffectTechnique["DrawShadows"].SetParameter("MaskProps", MaskProps);
resolveShadowsEffectTechnique["DrawShadows"].SetParameter("DiffuseColor", diffuseColor);
resolveShadowsEffectTechnique["DrawShadows"].SetUniform("AttenuateShadows", attenuateShadows ? 0 : 1);
resolveShadowsEffectTechnique["DrawShadows"].SetUniform("MaskProps", MaskProps);
resolveShadowsEffectTechnique["DrawShadows"].SetUniform("DiffuseColor", diffuseColor);
var maskSize = MaskTexture.Size;
RenderImage MaskTarget = new RenderImage("MaskTarget", maskSize.X, maskSize.Y);
//Debug.DebugRendertarget(shadowMap, "ShadowMap");
var MaskTarget = new RenderImage("MaskTarget", maskSize.X, maskSize.Y);
ExecuteTechnique(MaskTarget, Result, "DrawShadows", shadowMap);
//Debug.DebugRendertarget(Result, "DrawShadowsResult");
resolveShadowsEffectTechnique["DrawShadows"].ResetCurrentShader();
}
@@ -110,19 +108,18 @@ namespace SS14.Client.Lighting
private void ExecuteTechnique(RenderImage source, RenderImage destinationTarget, string techniqueName, RenderImage shadowMap)
{
Vector2f renderTargetSize;
renderTargetSize = new Vector2f(baseSize, baseSize);
Vector2 renderTargetSize;
renderTargetSize = new Vector2(baseSize, baseSize);
destinationTarget.BeginDrawing();
destinationTarget.Clear(Color.White);
resolveShadowsEffectTechnique[techniqueName].setAsCurrentShader() ;
resolveShadowsEffectTechnique[techniqueName].setAsCurrentShader();
resolveShadowsEffectTechnique[techniqueName].SetParameter("renderTargetSize", renderTargetSize);
if (source != null)
resolveShadowsEffectTechnique[techniqueName].SetParameter("inputSampler", source);
resolveShadowsEffectTechnique[techniqueName].SetUniform("renderTargetSize", renderTargetSize);
resolveShadowsEffectTechnique[techniqueName].SetUniform("inputSampler", source);
if (shadowMap != null)
resolveShadowsEffectTechnique[techniqueName].SetParameter("shadowMapSampler", shadowMap);
resolveShadowsEffectTechnique[techniqueName].SetUniform("shadowMapSampler", shadowMap);
// Blit and use normal sampler instead of doing that weird InputTexture bullshit
// Use destination width/height otherwise you can see some cropping result erroneously.
@@ -131,19 +128,15 @@ namespace SS14.Client.Lighting
destinationTarget.EndDrawing();
}
private void ApplyHorizontalReduction(RenderImage source, RenderImage destination)
{
int step = reductionChainCount - 1;
RenderImage src = source;
RenderImage HorizontalReduction= reductionRT[step];
var step = reductionChainCount - 1;
var src = source;
var HorizontalReduction = reductionRT[step];
reductionEffectTechnique["HorizontalReduction"].setAsCurrentShader();
// Disabled GLTexture stuff for now just to get the pipeline working.
// The only side effect is that floating point precision will be low,
// making light borders and shit have jaggy edges.
//GLTexture GLHorizontalReduction = new GLTexture("desto", (int)source.Width, (int)source.Height, ImageBufferFormats.BufferGR1616F);
//Debug.DebugRendertarget(source);
while (step >= 0)
{
HorizontalReduction = reductionRT[step]; // next step
@@ -151,47 +144,25 @@ namespace SS14.Client.Lighting
HorizontalReduction.BeginDrawing();
HorizontalReduction.Clear(Color.White);
//reductionEffectTechnique["HorizontalReduction"].SetParameter("secondTexture", src);
reductionEffectTechnique["HorizontalReduction"].SetParameter("TextureDimensions",1.0f/src.Width);
reductionEffectTechnique["HorizontalReduction"].SetUniform("TextureDimensions", 1.0f / src.Width);
// Sourcetexture not needed... just blit!
src.Blit(0, 0, HorizontalReduction.Width, HorizontalReduction.Height, BlitterSizeMode.Scale); // draw SRC to HR
//fix
//GLHorizontalReduction.Blit(src.Texture, CluwneLib.CurrentShader);
//fix
HorizontalReduction.EndDrawing();
src = HorizontalReduction; // hr becomes new src
//Debug.DebugRendertarget(HorizontalReduction);
step--;
}
CluwneLib.ResetShader();
//copy to destination
destination.BeginDrawing();
destination.Clear(Color.White);
HorizontalReduction.Blit(0, 0, destination.Height, destination.Width);
//GLHorizontalReduction.Blit(HorizontalReduction.Texture, CluwneLib.CurrentShader);
destination.EndDrawing();
//Debug.DebugRendertarget(destination);
CluwneLib.ResetRenderTarget();
}
public void Dispose()
{
distancesRT.Dispose();
distortRT.Dispose();
processedShadowsRT.Dispose();
foreach(var rt in reductionRT)
{
rt.Dispose();
}
shadowMap.Dispose();
shadowsRT.Dispose();
}
}
}

View File

@@ -1,4 +1,4 @@
namespace SS14.Client.Lighting
namespace SS14.Client.Graphics.Lighting
{
public enum ShadowmapSize
{

View File

@@ -1,25 +0,0 @@
<configuration>
<dllmap os="linux" dll="opengl32.dll" target="libGL.so.1"/>
<dllmap os="linux" dll="glu32.dll" target="libGLU.so.1"/>
<dllmap os="linux" dll="openal32.dll" target="libopenal.so.1"/>
<dllmap os="linux" dll="alut.dll" target="libalut.so.0"/>
<dllmap os="linux" dll="opencl.dll" target="libOpenCL.so"/>
<dllmap os="linux" dll="libX11" target="libX11.so.6"/>
<dllmap os="linux" dll="libXi" target="libXi.so.6"/>
<dllmap os="linux" dll="SDL2.dll" target="libSDL2-2.0.so.0"/>
<dllmap os="osx" dll="opengl32.dll" target="/System/Library/Frameworks/OpenGL.framework/OpenGL"/>
<dllmap os="osx" dll="openal32.dll" target="/System/Library/Frameworks/OpenAL.framework/OpenAL" />
<dllmap os="osx" dll="alut.dll" target="/System/Library/Frameworks/OpenAL.framework/OpenAL" />
<dllmap os="osx" dll="libGLES.dll" target="/System/Library/Frameworks/OpenGLES.framework/OpenGLES" />
<dllmap os="osx" dll="libGLESv1_CM.dll" target="/System/Library/Frameworks/OpenGLES.framework/OpenGLES" />
<dllmap os="osx" dll="libGLESv2.dll" target="/System/Library/Frameworks/OpenGLES.framework/OpenGLES" />
<dllmap os="osx" dll="opencl.dll" target="/System/Library/Frameworks/OpenCL.framework/OpenCL"/>
<dllmap os="osx" dll="SDL2.dll" target="libSDL2.dylib"/>
<!-- XQuartz compatibility (X11 on Mac) -->
<dllmap os="osx" dll="libGL.so.1" target="/usr/X11/lib/libGL.dylib"/>
<dllmap os="osx" dll="libX11" target="/usr/X11/lib/libX11.dylib"/>
<dllmap os="osx" dll="libXcursor.so.1" target="/usr/X11/lib/libXcursor.dylib"/>
<dllmap os="osx" dll="libXi" target="/usr/X11/lib/libXi.dylib"/>
<dllmap os="osx" dll="libXinerama" target="/usr/X11/lib/libXinerama.dylib"/>
<dllmap os="osx" dll="libXrandr.so.2" target="/usr/X11/lib/libXrandr.dylib"/>
</configuration>

View File

@@ -1,36 +1,73 @@
using SFML.Graphics;
using SFML.Window;
using SFML.Graphics;
using System;
using SFML.Window;
using SS14.Client.Graphics.Settings;
using SS14.Client.Graphics.View;
namespace SS14.Client.Graphics.Render
{
public class CluwneWindow : RenderWindow
public class CluwneWindow
{
public CluwneWindow(VideoMode mode, string title) : base(mode, title)
private readonly RenderWindow _window;
private readonly VideoSettings _settings;
internal CluwneWindow(RenderWindow window, VideoSettings settings)
{
_window = window;
_settings = settings;
Graphics = new GraphicsContext(_window);
Camera = new Camera(_window);
Viewport = new Viewport(0,0,_window.Size.X, _window.Size.Y);
CluwneLib.Input = new InputEvents(_window);
_window.Closed += (sender, args) => Closed?.Invoke(sender, args);
_window.Resized += (sender, args) =>
{
Viewport.Width = _window.Size.X;
Viewport.Height = _window.Size.Y;
Resized?.Invoke(sender, args);
};
}
public CluwneWindow(VideoMode mode, string title, Styles style) : base(mode, title, style)
public Viewport Viewport { get; set; }
public RenderTarget Screen => _window;
/// <summary>
/// Graphics context of the window.
/// </summary>
public GraphicsContext Graphics { get; }
public Camera Camera { get; }
public void SetMouseCursorVisible(bool visible)
{
_window.SetMouseCursorVisible(visible);
}
public CluwneWindow(VideoMode mode, string title, Styles style, ContextSettings settings) : base(mode, title, style, settings)
public void DispatchEvents()
{
_window.DispatchEvents();
}
public CluwneWindow(IntPtr handle) : base(handle)
// close the window
public void Close()
{
// prevents null issues
CluwneLib.Input = new InputEvents(null);
_window.Close();
}
public CluwneWindow(IntPtr handle, ContextSettings settings) : base(handle, settings)
[Obsolete("Use the new API.")]
public static implicit operator RenderWindow(CluwneWindow window)
{
return window._window;
}
public Color BackgroundColor
{
get;
set;
}
public event EventHandler<EventArgs> Closed;
public event EventHandler<SizeEventArgs> Resized;
}
}

View File

@@ -0,0 +1,49 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SFML.Graphics;
namespace SS14.Client.Graphics.Render
{
public class GraphicsContext
{
private readonly RenderWindow _window;
internal GraphicsContext(RenderWindow window)
{
_window = window;
}
/// <summary>
/// Clear color
/// </summary>
public Color BackgroundColor { get; set; }
public void SetVerticalSyncEnabled(bool enabled)
{
_window.SetVerticalSyncEnabled(enabled);
}
public void SetFramerateLimit(uint limit)
{
_window.SetFramerateLimit(limit);
}
public void Draw(SFML.Graphics.Sprite sprite)
{
_window.Draw(sprite);
}
public void Display()
{
_window.Display();
}
public void Clear(Color color)
{
_window.Clear(color);
}
}
}

View File

@@ -1,4 +1,4 @@
using SFML.Graphics;
using SFML.Graphics;
using SFML.System;
using System;
using System.Diagnostics;
@@ -79,18 +79,6 @@ namespace SS14.Client.Graphics.Render
get { return base.Texture; }
}
public IntRect Crop
{
get;
set;
}
public Vector2f Scale
{
get;
set;
}
public bool UseDepthBuffer
{
get;
@@ -233,15 +221,6 @@ namespace SS14.Client.Graphics.Render
CluwneLib.ResetRenderTarget();
}
/// <summary>
/// Deconstructs and disposes this instance
/// </summary>
protected override void Destroy(bool disposing)
{
GC.Collect();
}
#endregion
#region Drawing Methods
@@ -375,26 +354,7 @@ namespace SS14.Client.Graphics.Render
}
/// <summary>
/// Scale & optionally crop
/// </summary>
/// <param name="destination">The exact rectangle you wish to fill - scales to this size</param>
/// <param name="optionalcrop">To take a subset of the original texture instead of the whole texture</param>
/// <param name="color">Color.</param>
// public void Blit(IntRect destination, IntRect optionalcrop, Color color)
// {
// CluwneSprite _blit;
// Display();
// if (optionalcrop == null)
// _blit = new CluwneSprite("_blit" + key, this);
// else
// _blit = new CluwneSprite("_blit" + key, base.Texture, optionalcrop);
// _blit.Color = color.ToSFMLColor();
// _blit.Draw(destination);
// }
#endregion
}
}

View File

@@ -1,78 +1,67 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="12.0">
<Import Project="..\MSBuild\SS14.Properties.targets" />
<PropertyGroup>
<ProjectType>Local</ProjectType>
<ProjectGuid>{302B877E-0000-0000-0000-000000000000}</ProjectGuid>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<AssemblyKeyContainerName>
</AssemblyKeyContainerName>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
<AssemblyKeyContainerName />
<AssemblyName>SS14.Client.Graphics</AssemblyName>
<DefaultClientScript>JScript</DefaultClientScript>
<DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
<DefaultTargetSchema>IE50</DefaultTargetSchema>
<TargetFrameworkVersion>v4.5.1</TargetFrameworkVersion>
<OutputType>Library</OutputType>
<AppDesignerFolder>
</AppDesignerFolder>
<AppDesignerFolder />
<RootNamespace>SS14.Client.Graphics</RootNamespace>
<StartArguments>
</StartArguments>
<FileUpgradeFlags>
</FileUpgradeFlags>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
<StartArguments />
<FileUpgradeFlags />
<TargetFrameworkProfile />
<ConfigurationOverrideFile />
<AllowedReferenceRelatedFileExtensions>.pdb;.dll.config</AllowedReferenceRelatedFileExtensions>
<AllowUnsafeBlocks>false</AllowUnsafeBlocks>
<BaseAddress>285212672</BaseAddress>
<FileAlignment>4096</FileAlignment>
<OutputPath>$(SolutionDir)bin\Graphics\</OutputPath>
<RegisterForComInterop>False</RegisterForComInterop>
<RemoveIntegerChecks>False</RemoveIntegerChecks>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<BaseAddress>285212672</BaseAddress>
<ConfigurationOverrideFile>
</ConfigurationOverrideFile>
<DefineConstants>TRACE;DEBUG</DefineConstants>
<DebugSymbols>True</DebugSymbols>
<FileAlignment>4096</FileAlignment>
<Optimize>false</Optimize>
<OutputPath>..\bin\Graphics\</OutputPath>
<RegisterForComInterop>False</RegisterForComInterop>
<RemoveIntegerChecks>False</RemoveIntegerChecks>
<WarningLevel>4</WarningLevel>
<PlatformTarget>x86</PlatformTarget>
<Prefer32Bit>false</Prefer32Bit>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
<AllowUnsafeBlocks>False</AllowUnsafeBlocks>
<BaseAddress>285212672</BaseAddress>
<ConfigurationOverrideFile>
</ConfigurationOverrideFile>
<DefineConstants>TRACE</DefineConstants>
<FileAlignment>4096</FileAlignment>
<DefineConstants>TRACE;RELEASE</DefineConstants>
<Optimize>True</Optimize>
<OutputPath>..\bin\</OutputPath>
<RegisterForComInterop>False</RegisterForComInterop>
<RemoveIntegerChecks>False</RemoveIntegerChecks>
<WarningLevel>4</WarningLevel>
<PlatformTarget>x86</PlatformTarget>
<Prefer32Bit>true</Prefer32Bit>
<AllowedReferenceRelatedFileExtensions>.dll.config</AllowedReferenceRelatedFileExtensions>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
<DefineConstants>TRACE;DEBUG</DefineConstants>
<DebugSymbols>True</DebugSymbols>
<Optimize>false</Optimize>
<PlatformTarget>x64</PlatformTarget>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
<DefineConstants>TRACE;RELEASE</DefineConstants>
<Optimize>True</Optimize>
<PlatformTarget>x64</PlatformTarget>
<Prefer32Bit>false</Prefer32Bit>
<AllowedReferenceRelatedFileExtensions>.dll.config</AllowedReferenceRelatedFileExtensions>
</PropertyGroup>
<ItemGroup>
<Reference Include="Microsoft.CSharp">
<Name>Microsoft.CSharp</Name>
</Reference>
<Reference Include="OpenTK, Version=3.0.0.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4, processorArchitecture=MSIL">
<HintPath>..\packages\OpenTK.3.0.0-pre\lib\net20\OpenTK.dll</HintPath>
</Reference>
<Reference Include="sfmlnet-graphics-2">
<Name>sfmlnet-graphics-2</Name>
<HintPath>..\Third-Party\sfmlnet-graphics-2.dll</HintPath>
</Reference>
<Reference Include="sfmlnet-system-2">
<Name>sfmlnet-system-2</Name>
<HintPath>..\Third-Party\sfmlnet-system-2.dll</HintPath>
</Reference>
<Reference Include="sfmlnet-window-2">
<Name>sfmlnet-window-2</Name>
<HintPath>..\Third-Party\sfmlnet-window-2.dll</HintPath>
<HintPath>$(SolutionDir)packages\OpenTK.3.0.0-pre\lib\net20\OpenTK.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Drawing" />
</ItemGroup>
<ItemGroup>
<Compile Include="CluwneLib.cs">
@@ -86,9 +75,16 @@
<Compile Include="Enums\GraphicsEnums.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Event\FrameEvent.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Render\GraphicsContext.cs" />
<Compile Include="Lighting\ILight.cs" />
<Compile Include="Lighting\ILightArea.cs" />
<Compile Include="Lighting\ILightManager.cs" />
<Compile Include="Lighting\LightArea.cs" />
<Compile Include="Lighting\LightManager.cs" />
<Compile Include="Lighting\LightMode.cs" />
<Compile Include="Lighting\Light.cs" />
<Compile Include="Lighting\ShadowMapResolver.cs" />
<Compile Include="Lighting\ShadowmapSize.cs" />
<Compile Include="Shader\TechniqueList.cs" />
<Compile Include="Sprite\AnimationInfo.cs" />
<Compile Include="Sprite\SpriteInfo.cs" />
@@ -96,9 +92,6 @@
<Compile Include="texture\TextureCache.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Interface\ICluwneDrawable.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Properties\AssemblyInfo.cs">
<SubType>Code</SubType>
</Compile>
@@ -120,9 +113,6 @@
<Compile Include="Sprite\TextSprite.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="VertexData\VertexEnums.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="VertexData\VertexField.cs">
<SubType>Code</SubType>
</Compile>
@@ -133,37 +123,39 @@
<SubType>Code</SubType>
</Compile>
<Compile Include="Settings\VideoSettings.cs" />
<Compile Include="View\Camera.cs" />
<Compile Include="View\Viewport.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Utility\SfmlExt.cs" />
<Compile Include="Utility\SfmlCompatibility.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\SFML\src\Graphics\sfml-graphics.csproj">
<Project>{46786269-57b9-48e7-aa4f-8f4d84609fe6}</Project>
<Name>sfml-graphics</Name>
</ProjectReference>
<ProjectReference Include="..\SFML\src\System\sfml-system.csproj">
<Project>{31d24303-f6a9-4d53-bb03-a73edcb3186d}</Project>
<Name>sfml-system</Name>
</ProjectReference>
<ProjectReference Include="..\SFML\src\Window\sfml-window.csproj">
<Project>{d17de83d-a592-461f-8af2-53f9e22e1d0f}</Project>
<Name>sfml-window</Name>
</ProjectReference>
<ProjectReference Include="..\SS14.Shared\SS14.Shared.csproj">
<Project>{0529f740-0000-0000-0000-000000000000}</Project>
<Name>SS14.Shared</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Content Include="csfml-graphics-2.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="csfml-network-2.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="csfml-system-2.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="csfml-window-2.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
<None Include="OpenTK.dll.config">
<Content Include="$(SolutionDir)packages\OpenTK.3.0.0-pre\content\OpenTK.dll.config">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</Content>
<None Include="packages.config" />
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
<PreBuildEvent>
@@ -171,4 +163,4 @@
<PostBuildEvent>
</PostBuildEvent>
</PropertyGroup>
</Project>
</Project>

View File

@@ -1,101 +1,96 @@
using SFML.Window;
using SFML.Window;
namespace SS14.Client.Graphics.Settings
{
public class VideoSettings
{
private Styles WindowStyle;
private ContextSettings OpenGLSettings;
private VideoMode WindowSettings;
private uint RefreshRate;
private ContextSettings _glContextSettings;
private uint _refreshRate;
private VideoMode _videoMode;
private Styles _windowStyle;
public VideoSettings()
{
WindowStyle = Styles.Default; // Titlebar + Resize + Close
WindowSettings = VideoMode.DesktopMode;
_windowStyle = Styles.Default; // Titlebar + Resize + Close
_videoMode = VideoMode.DesktopMode;
OpenGLSettings = new ContextSettings();
RefreshRate = 30;
_glContextSettings = new ContextSettings();
_refreshRate = 30;
}
public VideoSettings(VideoMode mode)
{
_videoMode = mode;
}
/// <summary>
/// Returns a valid Video Mode
/// Returns a valid Video Mode
/// </summary>
/// <returns></returns>
public VideoMode getVideoMode()
public VideoMode GetVideoMode()
{
if (WindowSettings.IsValid())
return WindowSettings;
else
return new VideoMode(800, 600);
//TODO logmanager show that the windowsettings were invalid
if (_videoMode.IsValid())
return _videoMode;
return new VideoMode(800, 600);
}
/// <summary>
/// Returns the current windowStyle
/// Returns the current windowStyle
/// </summary>
/// <returns></returns>
public Styles getWindowStyle()
public Styles GetWindowStyle()
{
return WindowStyle;
return _windowStyle;
}
/// <summary>
/// Sets the Window Size
/// Sets the Window Size
/// </summary>
/// <param name="width"> Width of the window</param>
/// <param name="height">Height of the window </param>
public void SetWindowSize(uint width, uint height)
{
WindowSettings.Height = height;
WindowSettings.Width = width;
_videoMode.Height = height;
_videoMode.Width = width;
}
/// <summary>
/// Activates or deactivates fullscreen
/// Activates or deactivates fullscreen
/// </summary>
/// <param name="active"> true for fullscreen, false for no fullscreen</param>
public void SetFullscreen(bool active)
public void SetFullScreen(bool active)
{
if (active)
{
if (WindowSettings.IsValid())
WindowStyle = Styles.Fullscreen;
if (_videoMode.IsValid())
_windowStyle = Styles.Fullscreen;
else
WindowStyle = Styles.Default;
}
else
WindowStyle = Styles.Default;
// Logmanager Windowsettings are invalid
_windowStyle = Styles.Default;
else
_windowStyle = Styles.Default;
}
/// <summary>
/// Sets the Refresh Rate of the game
/// Sets the Refresh Rate of the game
/// </summary>
/// <param name="rate"> Refresh Rate</param>
public void SetRefreshRate(uint rate)
{
if ((rate >= 30) && (rate <= 144))
RefreshRate = rate;
if (rate >= 30 && rate <= 144)
_refreshRate = rate;
else
RefreshRate = 30;
//Logmanager Rate is either above 144 or below 30
_refreshRate = 30;
//Logmanager Rate is either above 144 or below 30
}
/// <summary>
/// Checks if the VideoSettings are valid and will work on the current PC system
/// Checks if the VideoSettings are valid and will work on the current PC system
/// </summary>
/// <returns>True if not null and settings are valid </returns>
public bool IsValid()
{
if (!WindowStyle.Equals(null) && WindowSettings.IsValid() && !OpenGLSettings.Equals(null))
{
if (!_windowStyle.Equals(null) && _videoMode.IsValid() && !_glContextSettings.Equals(null))
return true;
}
else return false;
return false;
}
}
}

View File

@@ -1,9 +1,15 @@
using OpenTK;
using SFML.System;
using SFML.Graphics.Glsl;
using SS14.Client.Graphics.Render;
using SS14.Client.Graphics.Utility;
using SS14.Shared.Maths;
using SS14.Shared.Utility;
using System.Diagnostics;
using System.IO;
using System.Linq;
using ShaderClass = SFML.Graphics.Shader;
using Vector2 = SS14.Shared.Maths.Vector2;
namespace SS14.Client.Graphics.Shader
@@ -17,13 +23,13 @@ namespace SS14.Client.Graphics.Shader
public GLSLShader(string vertexShaderFilename, string fragmentShaderFilename)
: base(vertexShaderFilename, fragmentShaderFilename)
: base(vertexShaderFilename, null, fragmentShaderFilename)
{
}
public GLSLShader(Stream vertexShaderStream, Stream fragmentShaderStream)
: base(vertexShaderStream, fragmentShaderStream)
: base(vertexShaderStream, null, fragmentShaderStream)
{
}
@@ -49,48 +55,59 @@ namespace SS14.Client.Graphics.Shader
}
public void SetParameter(string Parameter, RenderImage Image)
public void SetUniform(string Parameter, RenderImage Image)
{
base.SetParameter(Parameter, Image.Texture);
base.SetUniform(Parameter, Image.Texture);
}
public void SetParameter(string Parameter, Vector3f vec3)
public void SetUniform(string Parameter, Vector2f vec2)
{
base.SetParameter(Parameter, vec3.X, vec3.Y, vec3.Z);
base.SetUniform(Parameter, vec2);
}
public void SetParameter(string Parameter, Vector4f vec4)
public void SetUniform(string Parameter, Vector2 vec2)
{
base.SetParameter(Parameter, vec4.X, vec4.Y, vec4.Z, vec4.W);
base.SetUniform(Parameter, vec2.Convert());
}
public void SetParameter(string Parameter, Vector2f[] vec2array)
public void SetUniform(string Parameter, Vector3f vec3)
{
for (int i = 0; i < vec2array.Length; i++)
{
this.SetParameter(Parameter + i, vec2array[i]);
}
base.SetUniform(Parameter, vec3);
}
public void SetParameter(string Parameter, Vector3f[] vec3array)
public void SetUniform(string Parameter, Vector3 vec3)
{
for (int i = 0; i < vec3array.Length; i++)
{
this.SetParameter(Parameter + i, vec3array[i]);
}
base.SetUniform(Parameter, vec3.Convert());
}
public void SetParameter(string Parameter, Vector4f[] vec4array)
public void SetUniform(string Parameter, Vector4 vec4)
{
for (int i = 0; i < vec4array.Length; i++)
{
this.SetParameter(Parameter + i, vec4array[i]);
}
base.SetUniform(Parameter, new Vec4(vec4.X, vec4.Y, vec4.Z, vec4.W));
}
public void SetUniformArray(string Parameter, Vector2f[] vec2array)
{
SetUniformArray(Parameter, vec2array.Select(v => (Vec2)v).ToArray());
}
public void SetUniformArray(string Parameter, Vector3f[] vec3array)
{
SetUniformArray(Parameter, vec3array.Select(v => (Vec3)v).ToArray());
}
public void SetUniformArray(string Parameter, Vector4[] vec4array)
{
SetUniformArray(Parameter, vec4array.Select(v => new Vec4(v.X, v.Y, v.Z, v.W)).ToArray());
}
public void SetUniformArray(string Parameter, Vector2[] vec2array)
{
SetUniformArray(Parameter, vec2array.Select(v => new Vec2(v.X, v.Y)).ToArray());
}
public void SetUniformArray(string Parameter, Vector3[] vec3array)
{
SetUniformArray(Parameter, vec3array.Select(v => new Vec3(v.X, v.Y, v.Z)).ToArray());
}
}
}

View File

@@ -1,11 +1,12 @@
using SFML.Graphics;
using SFML.System;
using SS14.Shared.Maths;
namespace SS14.Client.Graphics
{
public static class SpriteExt
{
public static void SetTransformToRect(this SFML.Graphics.Sprite sprite, IntRect rect)
public static void SetTransformToRect(this SFML.Graphics.Sprite sprite, Box2i rect)
{
sprite.Scale = new SFML.System.Vector2f((float)rect.Width / (float)sprite.TextureRect.Width, (float)rect.Height / (float)sprite.TextureRect.Height);
sprite.Position = new Vector2f(rect.Left, rect.Top);

View File

@@ -1,4 +1,4 @@
using SFML.Graphics;
using SFML.Graphics;
using SFML.System;
using System;
using System.Collections.Generic;
@@ -11,7 +11,7 @@ namespace SS14.Client.Graphics.Sprite
/// </summary>
[DebuggerDisplay("[SpriteBatch] IsDrawing: {Drawing} | ")]
public class SpriteBatch : Drawable
{
{
private QueueItem activeItem;
private List<QueueItem> QueuedTextures = new List<QueueItem>();
@@ -19,15 +19,14 @@ namespace SS14.Client.Graphics.Sprite
private readonly uint Max;
private int count;
private bool Drawing;
private uint queueCount;
public int Count
{
get { return count; }
}
public BlendMode BlendingSettings;
public SpriteBatch(uint maxCapacity = 100000)
{
Max = maxCapacity * 4;
@@ -35,7 +34,7 @@ namespace SS14.Client.Graphics.Sprite
}
public void BeginDrawing()
{
{
count = 0;
// we use these a lot, and the overall number of textures
// remains stable, so recycle them to avoid excess calls into
@@ -52,13 +51,13 @@ namespace SS14.Client.Graphics.Sprite
}
public void EndDrawing()
{
{
Drawing = false;
}
private void Using(Texture texture)
{
if (!Drawing)
if (!Drawing)
throw new Exception("Call Begin first.");
if (activeItem == null || activeItem.Texture != texture)
@@ -71,7 +70,7 @@ namespace SS14.Client.Graphics.Sprite
else
{
activeItem = new QueueItem(texture);
}
}
QueuedTextures.Add(activeItem);
}
}
@@ -88,7 +87,6 @@ namespace SS14.Client.Graphics.Sprite
Using(S.Texture);
Vector2f Scale = new Vector2f(S.Scale.X, S.Scale.Y);
float sin = 0, cos = 1;
//FloatMath.SinCos(rotation, out sin, out cos);
S.Rotation = S.Rotation / 180 * (float)Math.PI;
sin = (float)Math.Sin(S.Rotation);
@@ -117,7 +115,7 @@ namespace SS14.Client.Graphics.Sprite
activeItem.Verticies.Append
(
new Vertex(
new SFML.System.Vector2f(
new SFML.System.Vector2f(
pX * cos - pY * sin + S.Position.X,
pX * sin + pY * cos + S.Position.Y),
S.Color,
@@ -156,65 +154,6 @@ namespace SS14.Client.Graphics.Sprite
);
}
/*
public unsafe void Draw(Texture texture, FloatRect rec, IntRect src, Color color)
{
var index = Create(texture);
fixed (Vertex* fptr = vertices)
{
var ptr = fptr + index;
ptr->Position.X = rec.Left;
ptr->Position.Y = rec.Top;
ptr->TexCoords.X = src.Left;
ptr->TexCoords.Y = src.Top;
ptr->Color = color;
ptr++;
ptr->Position.X = rec.Left + rec.Width;
ptr->Position.Y = rec.Top;
ptr->TexCoords.X = src.Left + src.Width;
ptr->TexCoords.Y = src.Top;
ptr->Color = color;
ptr++;
ptr->Position.X = rec.Left + rec.Width;
ptr->Position.Y = rec.Top + rec.Height;
ptr->TexCoords.X = src.Left + src.Width;
ptr->TexCoords.Y = src.Top + src.Height;
ptr->Color = color;
ptr++;
ptr->Position.X = rec.Left;
ptr->Position.Y = rec.Top + rec.Height;
ptr->TexCoords.X = src.Left;
ptr->TexCoords.Y = src.Top + src.Height;
ptr->Color = color;
}
}
public void Draw(Texture texture, FloatRect rec, Color color)
{
int width = 1, height = 1;
if (texture != null)
{
width = (int)texture.Size.X;
height = (int)texture.Size.Y;
}
Draw(texture, rec, new IntRect(0, 0, width, height), color);
}
public void Draw(Texture texture, Vector2f pos, Color color)
{
if (texture == null) throw new ArgumentNullException();
var width = (int)texture.Size.X;
var height = (int)texture.Size.Y;
Draw(texture, new FloatRect(pos.X, pos.Y, width, height), new IntRect(0, 0, width, height), color);
}
*/
public void Draw(RenderTarget target, RenderStates Renderstates)
{
if (Drawing) throw new Exception("Call End first.");

View File

@@ -1,4 +1,4 @@
using SFML.System;
using OpenTK;
namespace SS14.Client.Graphics.Sprite
{
@@ -10,7 +10,7 @@ namespace SS14.Client.Graphics.Sprite
public struct SpriteInfo
{
public string Name;
public Vector2f Offsets;
public Vector2f Size;
public Vector2 Offsets;
public Vector2 Size;
}
}

View File

@@ -1,16 +1,20 @@
using SFML.Graphics;
using SFML.System;
using SS14.Client.Graphics.Interface;
using OpenTK;
using OpenTK.Graphics;
using SS14.Client.Graphics.Utility;
using SS14.Shared.Utility;
using Vector2i = SS14.Shared.Maths.Vector2i;
namespace SS14.Client.Graphics.Sprite
{
/// <summary>
/// Sprite that contains Text
/// </summary>
public class TextSprite : ICluwneDrawable
public class TextSprite
{
private bool _shadowed; // Is the Text Shadowed
private Color _shadowColor; // Shadow Color
private Color4 _shadowColor; // Shadow Color
private Text _textSprite;
private string Label;
@@ -41,19 +45,6 @@ namespace SS14.Client.Graphics.Sprite
_textSprite = new Text(text, font, 14);
}
/// <summary>
/// Creates a TextSprite
/// </summary>
/// <param name="Label"> ID of the TextSprite</param>
/// <param name="x"> position X of TextSprite </param>
/// <param name="y"> Position Y of TextSprite </param>
/// <param name="width"> Width of TextSprite </param>
/// <param name="height"> Height of TextSprite </param>
// public TextSprite(string Label, int x, int y, int width, int height)
// {
// this.Position = new Vector2(x, y);
// }
/// <summary>
/// Draws the TextSprite to the CurrentRenderTarget
/// </summary>
@@ -65,14 +56,14 @@ namespace SS14.Client.Graphics.Sprite
public void Draw()
{
_textSprite.Position = new Vector2f(Position.X, Position.Y); // -(_textSprite.GetLocalBounds().Height/2f));
_textSprite.Color = Color;
_textSprite.Position = new Vector2f(Position.X, Position.Y);
_textSprite.FillColor = Color.Convert();
CluwneLib.CurrentRenderTarget.Draw(_textSprite);
if (CluwneLib.Debug.DebugTextboxes)//CluwneLib.Debug()
if (CluwneLib.Debug.DebugTextboxes)
{
FloatRect fr = _textSprite.GetGlobalBounds();
CluwneLib.drawHollowRectangle((int)fr.Left, (int)fr.Top, (int)fr.Width, (int)fr.Height, 1.0f, Color.Red);
var fr = _textSprite.GetGlobalBounds().Convert();
CluwneLib.drawHollowRectangle((int)fr.Left, (int)fr.Top, (int)fr.Width, (int)fr.Height, 1.0f, Color4.Red);
}
}
@@ -96,9 +87,9 @@ namespace SS14.Client.Graphics.Sprite
return MeasureLine(Text);
}
public Vector2f FindCharacterPos(uint index)
public Vector2 FindCharacterPos(uint index)
{
return _textSprite.FindCharacterPos(index);
return _textSprite.FindCharacterPos(index).Convert();
}
#endregion Methods
@@ -107,9 +98,9 @@ namespace SS14.Client.Graphics.Sprite
public Vector2i Size;
public Color Color;
public Color4 Color;
public Vector2f ShadowOffset { get; set; }
public Vector2 ShadowOffset { get; set; }
public bool Shadowed
{
@@ -123,7 +114,7 @@ namespace SS14.Client.Graphics.Sprite
set => _textSprite.CharacterSize = value;
}
public Color ShadowColor
public Color4 ShadowColor
{
get => _shadowColor;
set => this._shadowColor = value;

View File

@@ -0,0 +1,118 @@
using OpenTK;
using OpenTK.Graphics;
using SFML.Graphics;
using SFML.System;
using SS14.Shared.Maths;
using Vector2i = SS14.Shared.Maths.Vector2i;
using Vector2u = SS14.Shared.Maths.Vector2u;
using Vector2 = SS14.Shared.Maths.Vector2;
namespace SS14.Client.Graphics.Utility
{
/// <summary>
/// Provides compatibility extensions to convert between SFML and OpenTK types.
/// </summary>
public static class SfmlCompatibility
{
/// <summary>
/// Converts a OpenTK Vector2 to a SFML Vector2.
/// </summary>
/// <param name="vec">OpenTK Vector2.</param>
/// <returns>SFML Vector2.</returns>
public static Vector2f Convert(this Vector2 vec)
{
return new Vector2f(vec.X, vec.Y);
}
/// <summary>
/// Converts a SFML Vector2 to a OpenTK Vector2.
/// </summary>
/// <param name="vec">SFML Vector2.</param>
/// <returns>OpenTK Vector2.</returns>
public static Vector2 Convert(this Vector2f vec)
{
return new Vector2(vec.X, vec.Y);
}
/// <summary>
/// Converts a OpenTK Vector3 to a SFML Vector3.
/// </summary>
/// <param name="vec">OpenTK Vector3.</param>
/// <returns>SFML Vector3.</returns>
public static Vector3f Convert(this Vector3 vec)
{
return new Vector3f(vec.X, vec.Y, vec.Z);
}
/// <summary>
/// Converts a SFML Vector3 to a OpenTK Vector3.
/// </summary>
/// <param name="vec">SFML Vector3.</param>
/// <returns>OpenTK Vector3.</returns>
public static Vector3 Convert(this Vector3f vec)
{
return new Vector3(vec.X, vec.Y, vec.Z);
}
/// <summary>
/// Converts a OpenTK Box2 to a SFML FloatRect.
/// </summary>
/// <param name="box">OpenTK Box2.</param>
/// <returns>SFML FloatRect.</returns>
public static FloatRect Convert(this Box2 box)
{
return new FloatRect(box.Left, box.Top, box.Width, box.Height);
}
/// <summary>
/// Converts a SFML FloatRect to a OpenTK Box2.
/// </summary>
/// <param name="rect">SFML FloatRect.</param>
/// <returns>OpenTK Box2.</returns>
public static Box2 Convert(this FloatRect rect)
{
return new Box2(rect.Left, rect.Top, rect.Right(), rect.Bottom());
}
public static IntRect Convert(this Box2i box)
{
return new IntRect(box.Left, box.Top, box.Width, box.Height);
}
public static Box2i Convert(this IntRect rect)
{
return new Box2i(rect.Left, rect.Top, rect.Right(), rect.Bottom());
}
public static Vector2i Convert(this SFML.System.Vector2i vector)
{
return new Vector2i(vector.X, vector.Y);
}
public static SFML.System.Vector2i Convert(this Vector2i vector)
{
return new SFML.System.Vector2i(vector.X, vector.Y);
}
public static Vector2u Convert(this SFML.System.Vector2u vector)
{
return new Vector2u(vector.X, vector.Y);
}
public static Vector2 Convertf(this SFML.System.Vector2u vector)
{
return new Vector2(vector.X, vector.Y);
}
public static Color Convert(this Color4 color)
{
var bcolor = (System.Drawing.Color)color;
return new Color(bcolor.R, bcolor.G, bcolor.B, bcolor.A);
}
public static Color4 Convert(this Color color)
{
return new Color4(color.R, color.G, color.B, color.A);
}
}
}

View File

@@ -1,21 +1,21 @@
using SFML.Graphics;
using SFML.Graphics;
using SFML.System;
using System;
namespace SS14.Shared.Maths
namespace SS14.Client.Graphics.Utility
{
public static class SfmlExt
{
// Vector2i
public static int LengthSquared(this Vector2i vec) => vec.X * vec.X + vec.Y * vec.Y;
public static float Length(this Vector2i vec) => (float)Math.Sqrt(LengthSquared(vec));
public static Vector2f ToFloat(this Vector2i vec) => new Vector2f(vec.X, vec.Y);
public static int LengthSquared(this SFML.System.Vector2i vec) => vec.X * vec.X + vec.Y * vec.Y;
public static float Length(this SFML.System.Vector2i vec) => (float)Math.Sqrt(LengthSquared(vec));
public static Vector2f ToFloat(this SFML.System.Vector2i vec) => new Vector2f(vec.X, vec.Y);
// Vector2f
// Vector2
public static float LengthSquared(this Vector2f vec) => vec.X * vec.X + vec.Y * vec.Y;
public static float Length(this Vector2f vec) => (float)Math.Sqrt(LengthSquared(vec));
public static Vector2i Round(this Vector2f vec) => new Vector2i((int)Math.Round(vec.X), (int)Math.Round(vec.Y));
public static SFML.System.Vector2i Round(this Vector2f vec) => new SFML.System.Vector2i((int)Math.Round(vec.X), (int)Math.Round(vec.Y));
// IntRect
@@ -59,58 +59,6 @@ namespace SS14.Shared.Maths
(byte)(color >> 0),
(byte)(color >> 24)));
/// <summary>
/// Values used internally by <see cref="DirectionTo" />
/// </summary>
private static Direction[] AngleDirections = new Direction[]
{
Direction.East,
Direction.NorthEast,
Direction.North,
Direction.NorthWest,
Direction.West,
Direction.SouthWest,
Direction.South,
Direction.SouthEast,
Direction.East
};
/// <summary>
/// Find the direction that <paramref name="target" /> is from <paramref name="origin" />.
/// </summary>
/// <param name="origin">The origin vector.</param>
/// <param name="target">The target vector.</param>
/// <param name="fallback">The direction used if no direction could be calculated (difference between vectors too small).</param>
public static Direction DirectionTo(this Vector2f origin, Vector2f target, Direction fallback=Direction.South)
{
var mag1 = origin.Magnitude();
var mag2 = target.Magnitude();
// Check whether the vectors are almost zero.
// Don't use == because equality checking on floats is dangerous and unreliable.
// If the range is too wide go ahead and make it smaller.
if (mag1 < 0.0001 && mag1 > -0.0001 && mag2 < 0.0001 && mag2 > -0.0001)
{
return fallback;
}
// Angle in degrees.
// Keep in mind: Cartesian plane so 0° is to the right.
var angle = FloatMath.ToDegrees((float)Math.Atan2(target.Y - origin.Y, target.X - origin.X));
// The directions are assumed to be perfect 45° surfaces.
// So 0° is between the east one, and 22.5° is the edge between east and north east.
// Wrap negative angles around so we're always dealing with positives.
if (angle < 0)
{
angle += 360;
}
// Add 22.5° to offset the angles since 0° is inside one.
angle += 22.5f;
return AngleDirections[(int)Math.Floor(angle/45f)];
}
/// <summary>
/// Returns the dot product of two vectors

View File

@@ -1,56 +0,0 @@
namespace SS14.Client.Graphics.VertexData
{
public class VertexEnums
{
public enum VertexFieldContext
{
/// Position, 3 reals per vertex.
Position ,
/// Normal, 3 reals per vertex.
Normal ,
/// Blending weights.
BlendWeights ,
/// Blending indices.
BlendIndices ,
/// Diffuse colors.
Diffuse ,
/// Specular colors.
Specular ,
/// Texture coordinates.
TexCoords ,
/// Binormal (Y axis if normal is Z).
Binormal ,
/// Tangent (X axis if normal is Z).
Tangent
}
/// <summary>
/// Enumerator for vertex field types.
/// Used to define what type of field we're using.
/// </summary>
public enum VertexFieldType
{
/// 1 Floating point number.
Float1 ,
/// 2 Floating point numbers.
Float2 ,
/// 3 Floating point numbers.
Float3 ,
/// 4 Floating point numbers.
Float4 ,
/// DWORD color value.
Color ,
/// 1 signed short integers.
Short1 ,
/// 2 signed short integers.
Short2 ,
/// 3 signed short integers.
Short3 ,
/// 4 signed short integers.
Short4 ,
/// 4 Unsigned bytes.
UByte4
}
}
}

View File

@@ -1,6 +1,7 @@
using SFML.Graphics;
using SFML.System;
using SS14.Client.Graphics.Collection;
using SS14.Client.Graphics.Utility;
using SS14.Shared.Maths;
using System;
using System.Runtime.InteropServices;
@@ -221,4 +222,4 @@ namespace SS14.Client.Graphics.VertexData
}
#endregion
}
}
}

View File

@@ -0,0 +1,26 @@
using SFML.Graphics;
using SS14.Shared.Maths;
namespace SS14.Client.Graphics.View
{
public class Camera
{
private Viewport _view;
private readonly RenderWindow _viewport;
public Camera(Viewport viewport) { }
public Camera(RenderWindow viewport)
{
_viewport = viewport;
}
public int PixelsPerMeter { get; } = 32;
public Vector2 Position { get; set; }
public void SetView(SFML.Graphics.View view)
{
_viewport.SetView(view);
}
}
}

View File

@@ -1,3 +1,5 @@
using SS14.Shared.Maths;
namespace SS14.Client.Graphics.View
{
public class Viewport
@@ -7,13 +9,14 @@ namespace SS14.Client.Graphics.View
// TODO: Complete member initialization
this.OriginX = originX;
this.OriginY = originY;
this.Width = (int)width;
this.Height = (int)height;
this.Width = width;
this.Height = height;
}
public int Width { get; set; }
public int Height { get; set; }
public uint Width { get; set; }
public uint Height { get; set; }
public int OriginX { get; set; }
public int OriginY { get; set; }
public Vector2u Size => new Vector2u(Width, Height);
}
}

View File

@@ -1,4 +1,4 @@
using SFMLTexture = SFML.Graphics.Texture;
using SFMLTexture = SFML.Graphics.Texture;
using SFML.Graphics;
using System.Collections.Generic;
@@ -8,19 +8,17 @@ namespace SS14.Client.Graphics.TexHelpers
{
public SFMLTexture Texture;
public Image Image;
public bool[,] Opacity;
public TextureInfo(SFMLTexture tex, Image img, bool[,] opacity)
public TextureInfo(SFMLTexture tex, Image img)
{
Texture = tex;
Image = img;
Opacity = opacity;
}
}
public static class TextureCache
{
private static Dictionary<string, TextureInfo> _textures = null;
private static Dictionary<string, TextureInfo> _textures;
public static Dictionary<string, TextureInfo> Textures
{

Some files were not shown because too many files have changed in this diff Show More