Skip to content

Instantly share code, notes, and snippets.

@karlgluck
karlgluck / RoombaVictory.ps1
Created Sep 18, 2019
Play the Roomba's victory jingle using the Powershell beep. Because why not?
View RoombaVictory.ps1
[console]::beep(260,200)
[console]::beep(320,200)
[console]::beep(380,150)
[console]::beep(520,200)
Start-Sleep -Milliseconds 200
[console]::beep(520,150)
[console]::beep(700,800)
@karlgluck
karlgluck / PerfectPixelCamera.cs
Created Sep 13, 2018
Main file from the Perfect Pixel Camera asset on the Unity asset store, licensed with MIT https://assetstore.unity.com/packages/tools/camera/perfect-pixel-camera-by-gg-ez-100000
View PerfectPixelCamera.cs
// Copyright 2018 Karl Gluck
//
// 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 restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
View Viewport to World Point Unity.cs
private static Vector3 ViewportToWorldPointUnity (Vector3 point, float fieldOfView, float aspect, Vector3 from, Vector3 to, Vector3 up)
{
// The zNear / zFar magic numbers are what Unity's viewport always uses regardless of camera settings
var matP = Matrix4x4.Perspective (fieldOfView, aspect, 0.6f /* zNear */, 1000f /* zFar */);
// For some reason we have to reverse these coordinates
from = -from;
to = -to;
@karlgluck
karlgluck / VectorMagnitude.md
Created Oct 13, 2017
Approximate magnitude of 2d and 3d vectors
View VectorMagnitude.md

Vec3 Magnitude

These C# implementations of approximate magnitude with no square roots are actually slower than calling a native implementation in Unity, but if this were implemented intelligently in C there's a good chance they would be faster. In any case, they're here because it was a pain to get the magic numbers.

Accurate to within 4.5%.


public static float MagnitudeFast (this Vector2 self)
    {
@karlgluck
karlgluck / GvimOmniSharpSetup.md
Last active Sep 21, 2017
Sadly, Gvim + OmniSharp-vim is just not worth the hassle on Windows. Locks up for 1s+ every cursor movement.
View GvimOmniSharpSetup.md

How to set up Gvim + OmniSharp-vim on Windows 10

Install Gvim

Right-click the C:\Program Files (x86)\Vim folder and change its Security permissions to allow full control & editing -> You shouldn't have to give admin permissions to do anything else in this guide

Install pathogen.vim

Clone OmniSharp-vim to C:\Program Files (x86)\Vim\vimfiles\bundle\omnisharp-vim

@karlgluck
karlgluck / ECS.cs
Last active May 17, 2018
My quick and incomplete version of Overwatch's Entity-Component System from the GDC17 presentation. Mostly written to think about how this would be implemented in a language with reflection.
View ECS.cs
public class ECSEntity
{
public ArrayList Components;
public static ECSEntity Acquire ()
{
throw new System.NotImplementedException();
ECSEntity retval = null;
return retval;
}
@karlgluck
karlgluck / IsPointInside.cs
Last active Jul 13, 2017
Winding method for finding whether a point is contained by a 2D polygon defined by a vertex loop (C#/Unity)
View IsPointInside.cs
public static bool IsPointInside (Vector2 point, Vector2[] polygonBoundary)
{
int i = 0, j = 1;
int retval = 0;
while (j < polygonBoundary.Length)
{
var pointI = polygonBoundary[i];
var pointJ = polygonBoundary[j];
int side = (pointJ.x - pointI.x) * (point.y - pointI.y) - (point.x - pointI.x) * (pointJ.y - pointI.y);
int upward = ((side > 0) & (pointI.y <= point.y) & (pointJ.y > point.y)) ? +1 : 0;
@karlgluck
karlgluck / google-spreadsheet-as-database.gs
Last active Mar 7, 2017
Easy way to make a key-value store in a Google Spreadsheet. Just publish as a webapp and use jsonp.
View google-spreadsheet-as-database.gs
function doGet(request)
{
var lock = LockService.getPublicLock();
lock.waitLock(15000);
var ss = SpreadsheetApp.openById(request.parameter.id);
var sheet = ss.getSheetByName('Sheet1');
var obj;
var dataRange = sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn());
var dataValues = dataRange.getValues();
if (request.parameter.k && request.parameter.v) {
@karlgluck
karlgluck / Inverted-Program-Flow-By-Abusing-IEnumerator.md
Last active Dec 4, 2016
A novel control flow pattern for easily writing a game's primary state machine
View Inverted-Program-Flow-By-Abusing-IEnumerator.md

I'm working on some side projects and have been toying with ideas for more efficient ways to write games in Unity with C#. One of the major hangups for some of my larger side projects is that once it reaches sufficient complexity, it's hard to tell exactly what state the app is in. Even the simple wallet app I built has this issue. I've come up with the beginnings of a solution so I wanted to write it down before it gets lost.

The key problem is that you want your program to respond to inputs that require waiting for a response from something (a webserver, a user, etc). There are a number of options in Unity with C#.

These first 4 options are variations on a theme of control "elsewhere" in the program letting your code know that something has happened:

  • Virtual Callback E.g. if you derive from a class, and override a method which gets called in response to an event
  • Reflection Callback E.g. if you declare OnMouseMove on a class and that function gets called whenever the mouse moves
  • **Callb
@karlgluck
karlgluck / Binder.cs
Last active Mar 7, 2017
Super simple predeclaration framework for Unity that I'm toying with! Basically you can just declare any delegate field with [Bind] on it and this will look around for a static function or single member on another class that implements it, and hook that up on launch.
View Binder.cs
using System;
using System.Collections;
using System.Reflection;
using UnityEngine.Scripting;
// [Bind] is used to annotate a static field or property of type Func or Action. It causes
// the value of that member to be mapped to a function somewhere else in the program with the
// same name as that field. The target function can be a static function or an instance
// function whose class has a static property/field of its own type named "Singleton".
//