Technical Skills

  • Programming languages:         C, C++, C#/.NET, JAVA, Python, PHP, SQL, HTML, CSS.
  • Engines\ Graphic API’s:            Unity 3D, Unreal, Godot, Falcor, WPF, OpenGL, DirectX, GLSL, HLSL, AR/VR/MR.
  • Exp. with Platforms:         Windows, Mac, Linux, iOS, Android, Oculus, Cardboard, Pico, Hololens, HTC Vive, Varjo.
  • Parallel Programming:     OpenMP, MPI, SIMD, pthreads, C++ Threads.
  • Skilled in version control, build systems, Gitlab CI, Blender, GIMP, TestFlight.
  • Experience working with digital audio workstations : Reaper,   Fruity Loops,   Audacity.

Stadt Up: eHMI - TUM Lehrstuhl für Ergonomie - Research Assistant

Unity, C#, .NET, HTC Vive

  • A research project to determine the decisions made and to measure the reactions of participants while crossing the road in presence of Autonomous vehicles and human driven cars.
  • The participant is made to walk across the virtual street wearing a VR headset based on different rules of the autonomous vehicles to brake, alarm the participant and drive through. The participant makes these decisions in the presence of another confederate pedestrian NPC who is also aiming to cross the road.
  • 30 different levels are presented to the participant in a random order and the entire process is controlled from the computer screen using a UI.
  • Created the underlying states to easily transition from entering and managing data of the participant to the gameplay with 30 randomized levels based on the planned sheet of possible Automated Vehicle level scenarios and the correct/incorrect reaction of the participant.
  • Data of the participant's movement, the time of interactions, level specific data of the particular scenario and the eye tracking is saved for the department's research.
  • Worked as the only developer with a team that managed live trials with the particpants.

Sabes - TUM Lehrstuhl für Ergonomie - Research Assistant

Unity, C#, .NET, HTC Vive

  • A research project to study the reaction of participants to the proximity of automated robots in VR compared to an actual physical automated robot.
  • The project includes 30 levels, each level test the participant's psychological response to the proximity of the robot by clicking on the controller while the robot approaches the participant and when the particpant walks along a straight line.
  • The robot reacts differently upon different circumstances, evading, stopping in place or backing off.
  • The application runs on the headset and the participant can give feedback with in-game UI on completion. The project runs on the PC monitor guided by a guide that controls the trials with the UI on the screen.
  • Data of all the 30 trials are saved for research and functionality for recovery of the data is created in case of crashes during the application or headset malfunction.
  • Worked as the only developer with a team that managed live trials with the particpants.

Tea Diffusion - TUM Professur für Fachdidaktik Life Sciences - Research Assistant

Unity, C#, .NET, Hololens 2, Vuforia, Blender

  • A chemistry experiment with the idea of the diffusion of tea particles when poured into boiling water. The experiment is built for extended reality using the Hololens 2 for the purpose of teaching.
  • Created a simulation to initially move water particles (H20 molecules) using Bézier curves. Tea particles are then added into the beaker to simulate a similar movement in a solution.
  • H20 molecules and tea particles created using Blender with a low polygon count to allow for the existence of many such particles in a single scene. Multiple textures are baked into a single UV texture allowing the use of dynamic batching with a single material and hence fewer draw calls.
  • Created multiple UIs for the participant to navigate and give feedback. The data is saved on the device and then sent for saving over the internet.
  • Worked as the only developer.

Electrolysis - TUM Professur für Fachdidaktik Life Sciences - Research Assistant

Unity, C#, .NET, Hololens 2, Vuforia, Blender

  • A chemistry experiment of electrolysis in AR using the Hololens 2 for teaching purposes.
  • The experiment is done alongside a real physical experiment and the reactions can be seen virtually through the HoloLens glasses.
  • The UI is created for the participants to navigate through the experiment at the same time step by step explaining the procedure of the experiment.
  • The participant then provides feedback for research purposes which is sent online via google forms to be saved.
  • The UI was created and adjusted as per requirements to make it more comfortable for the participant.
  • Worked as the only developer.

XR Project - TUM Lehrstuhl für Ergonomie - Research Assistant

Unreal, C++, Varjo

  • A research project in the Unreal engine using the Varjo XR-3 headset.
  • Gameplay involves a sequence of trials where the robot approaches the participant. Each trial is based upon its specific level data. Created using a combination of blueprints and code in Unreal.
  • Level data includes level specific settings and platform changes between VR or AR. Implemented handtracking and controller input.
  • Created a UI HUD specifically for Unreal XR projects to control the experiment that is run on the headset worn by participants.
  • Managed the robot mesh by importing it from a high quality CAD file using Blender to an optimized FBX option with a hierarchy suitable for animating it in Unreal.

Graph rewrite and Architecture Modeller - TUM Lehrstuhl für Computergestützte Modellierung und Simulation - Research Assistant

GrGen.NET, Autodesk Revit, C#, .NET, WPF

  • GrGen.NET is a tool for graph transformation. Rules of an architectural setting is created and debugged using it. These rules are used to transform an architectural construction model example and then loaded into Revit which can then edit settings of the model based upon an added UI.
  • Created the rules as per the requirement (example: a window allowed only in between a wall, connection of beams with walls) and applied it to an example model. The graphs are then rewritten using GrGen.
  • Created the UI on the Revit side using WPF for the rules to be output for the graph rewriting.
  • The UI allows for modifications to that specific window with an ID. (example that window is only allowed on a brick wall.)
  • Created the UI on the Revit side to be rewritten into the graph and the rewritting process.
  • Initially worked in a team of 3, each managing separate tasks. Then overtook the project as the only programmer.


Real-time Adaptive Temporal Denoising using Mutual Information - TUM Lehrstuhl für Grafik und Visualisierung - Master Thesis

NVIDIA Falcor Rendering framework, C++, HLSL

  • Real-time denoising built upon ASVGF (Adaptive Spatiotemporal Variance-Guided filtering).
  • The thesis is based upon using an information metric like Mutual Information and Entropy to substitute the luminance-variance in ASVGF.
  • Used the NVIDIA Falcor Rendering framework to build render graphs and add the rendering code components of the filter.
  • Initially fixed the SVGF code of Falcor and built its render graph as per the paper that refers it. The assets of the scene are first stored using a deferred render pass and then to a path-tracer, the SVGF algorithm was fixed by correctly demodulating the visible image with the albedo, emission and specular textures to retrieve only the illumination as required by the algorithm.
  • Referred to the ASVGF code from the original paper resource that was created using a 2018 version of Falcor with an Open GL renderer. Recreated the ASVGF denoiser using the current Falcor framework which uses DirectX 12.
  • Once the color is demodulated, we get only the illumination of a single sample per-pixel. The reconstruction is then done by temporally and spatially filtering and after, the reverse procedure is performed i.e. the reconstructed illumination is modulated with the same textures to get the final color.
  • Added the mutual information, entropy setting and other variables to test with different properties.
  • Differentiated the results in the output EXR (extended range) images by the different algorithms used along with the reference image.

Outbreak - Mashmo Games

Unity Engine, C#, .NET, Oculus Gear VR, Oculus GO, Oculus Rift


  • Outbreak is a single-player VR survival game. The game is based on a player collecting item-drops like weapons, bullets, interacting with the environment and killing enemies to complete objectives.
  • For easy creation and maintenance of the project, I created a Level Manager, Task System, Objective Manager. These components are XML based and serializable systems, to make development easy for level designers and artists.
  • Level Manager : Manages all of its sub levels, data to be set on the player on start of each sub level, the player data that needs to be saved. A level designer can easily select and edit the level data, For example: If the designer wants the player to have an AK-47 type of gun as his primary gun and the gun needs to have 50 bullets with 5 bullets in its first cartridge, the designer can easily do so from the level manager.
  • Task System : The task system includes XML pages which manages a sequence of instructions. For example : A designer can create a sequence of instructions to start/stop a sound, position the player, add/remove an object, manage the environment etc. And these sequences can be called from anywhere within the game with a unique ID.
  • Objective System : The objective system manages the range of objectives within any level. When an objective is complete, the system registers that completion and transitions the game to the next level on the completion of all objectives of that level. The objective list can be edited to be an unordered or ordered list, ordererd : an objective is complete only if the previous objective is complete.
  • All objects that are reusable in the game like item drops, weapon drops, enemies, 2D audio sources are managed by an object pool for optimization purposes to promote reusability and prevent the instantiation of an object each time it is required.
  • The entire game is interconnected by an Event System that fires an event to manage every step of the game.
  • With the use of the above features the development process is made easy for designers to add cinematic and game play scenes. Each weapon and item in the game is customizable with a fire rate and other features.
  • Created a shader for object highlighting, crosshair and environment designs. Optimized meshes and assets for its use on a low-powered VR headset. Textures that belong to similar objects are baked into a single texture to make use of Unity's dynamic batching system and hence reduce draw calls.

Bowling Mania - Mashmo Games

Unity Engine, C#, .NET, PHP, SQL, Oculus Gear VR, Oculus GO

  • A single-player arcade bowling game for VR. The controls are easy to handle, intuitive to understand and can be played with only the headset or with the controller.
  • The game contains 3 levels and a practice level. Each level is based on a unique location, each having its own interactions in the environment.
  • The gameplay includes 6 different types of bowling balls. Each ball has a unique ability for specific situations, for example the clone ball which splits into 2 balls.
  • Implemented In-App purchases for Oculus purchases as well In-Game currency, the In-Game currency earned can be spent on items in other games developed by the company.
  • A player can choose to purchase other levels or Mashmo coins and spend the coins on balls, ball skins etc to use in game.
  • Managed all gameplay and graphic assets, created a leaderboard, achievements to unlock to engage the user with the game.

Better Meals - Zenno Games

Unity Engine, .NET, C#, Tenjin, iOS

  • Better Meals is a diet and weight management application with meal recommendations.
  • The application allows the user to subscribe to different plans based on the particular platform offered by the subscription.
  • Integrated the connection between the server side and user to retrieve a recipe demanded by the user based on the user's characteristics. Various dishes and recipes will be offered to the user. The user can also choose to save the recipe into their 'Grocery List' for later.
  • The user can track their weight and health based on the meals suggested by the system.
  • To track the users engagement with the application, Tenjin commands for analysis as requested by the client were added to the system. I created a system so the client can add as many commands as required for future requirements.

Potions and Arrows - Indie

Unity Engine, C#, .NET

  • Potions and Arrows is a single player side-scroller game for Windows and XBox.
  • I created a dialogue UI panel that can display different effects on text for example: Jitter, Wavey, Typewriter, Colours using vertex movement of the characters.
  • Created a dialogue system and a database to take a sequence of dialogues from a set and display it with effects. The system is made as a serializable component for easy editing by any developer. Each dialogue can have as many effects as needed and a designer can edit these dialogues, add and remove an effect easily.
  • Added player interaction to work alongside the dialogue system to enable certain functionality for example: allow a player to buy an item from a 'merchant' NPC.
  • All effects and their parameters can be edited from a serialized field. Fox Example: The rate at which a dialogue with a typewriter effect is revealed etc.
  • The panel can also be used with options for the player to select, for example: 'Buy', 'Exit' and each option can trigger an event.

Ninjutsu Warrior - Mashmo Games

Unity Engine, C#, .NET, PHP, SQL, Oculus Gear VR, Oculus GO, PICO VR, Google Daydream

  • Ninjutsu Warrior is a single-player VR slashing game using the remote as a weapon.
  • The game has 2 modes, a classic and a timed game.
  • The game consists of 3 environments, each having 60 levels in the classic mode. Each set of 60 levels is ordered in an increasing order of difficulty.
  • Objects in the form of fruits and vegetables are shot towards the player and the user has to slice these objects using the remote as a weapon. Each level in the classic mode has a specifc amount and type of object to slice. Completing the slicing objective, the user can go on to the next level. Slicing a rotten fruit or vegetable will reduce your points in the level.
  • In the timed level slicing as many fruits as possible is the objective. Slicing a positive or negative clock thrown at you will increase or decrease the time allowed for you in that level.
  • On account of a large amount of objects being used in a single level, the objects used are pooled for performance and avoid the instantiation of each object every time it is required.
  • Implemented an In-App Purchase system to update a server with In-Game currency. The user can collect coins by completing levels and use those coins to purchase weapons. All purchased, currency earned and level progress is saved and loaded from the server. The coins earned can be used to purchase items in other games published by Mashmo Games like Bowling Mania.
  • Made platform-specific and generic systems for easy compatibility with different VR platforms like PICO VR, Google Daydream.



Anesthesia SimSTAT - Indusgeeks Solutions

Unity Engine, C#, .NET, WebGL

  • Anesthesia SimSTAT is a single player game made for anesthesiologists to simulate various medical scenarios. The player is given a certain medical operation scenario with a patient that is suffering with particular conditions. The player's responsibility is to analyze and point out the steps to complete the operation while playing the role of an anesthesiologist.
  • During the course of the game the player has to infuse the patient with the correct amount of medications. Set up a medication system to retrieve and send the correct dosage of medication to a server and the total amount of drugs infused.
  • Contributed to the development of a task executor that starts/ ends various types of tasks at certain points of the game.
  • A dynamic scoring system and UI that displays any amount of scores retrieved from the server.
  • A dialogue manager to run dialogues (text and audio) from and to certain characters.

FretBuzz : 2D / 3D Game Engine - Hobby Project

C++, OpenGL

  • A gameobject-component based game engine to replicate features as required to create 2D or 3D games.
  • The engine includes 2D physics using Box2D, post-processing, a sprite batch renderer, XML animation entries etc.
  • Components can be added onto a gameobject. Components include animators, colliders, sprite renderers, images, camera, audio sources, lights, mesh renderers, animation controllers, character controllers. A scene includes multiple gameobjects and multiple scenes can be loaded at the same time.
  • A user-designed class component can also be created and added to a gameobject.
  • The renderer in the engine manages all rendering paths, post processing using a single camera at the moment, resizing, Open GL rendering settings.
  • Meshes along with their textures are loaded in the .Obj or .Fbx format using the Assimp library. 2D sprite animations are loaded as sprite sheets with animation triggers and their respective textures/sprites are included in the xml files for that animation.
  • The graphics components include a post-processing unit that uses a frame buffer, a skybox renderer using a cubemap texture etc.
  • An object to render can easily be modified to use a different material with a vertex, fragment, geometry shader.
  • Each scene manages all the gameobjects that are included in its hierarchy and a game object can be set to not be destroyed on transitioning to a different scene.
  • Attempted to replicate one of my favourite games 'Hotline Miami'

Delegate and Event Manager - Hobby Project

C++

  • Created a delegate that can store multiple functions of the same type. A delegate can be passed as an arguement.
  • Functions that can be added into the delegate are methods of an object, static and global functions.
  • Can add two delegates of the same type together to get 1 delegate. You can remove all the functions from 1 delegate that are common with another delegate and can specify particular functions you want removed from a delegate.
  • Delegates can be used as events and subscribed/ unsubscribed to the EventManager.
  • Events can be invoked from the EventManager with specific arguements and the unique identifier.

Unity Asset : Object Pooling System - Hobby Project

Unity Engine, C#, .NET

  • Each time you create an object for use you allocate the required memory on the heap and call its constructor. When the object is not required anymore you discard the object, calling the garbage collector and thereby deallocating the memory previously acquired. These processes take time during runtime when the application needs to run efficiently.
  • The object pooling system allows for creation of the object and storing the object in a pool. When required the object is taken out of the pool and used, when the object is not required anymore it is pushed back into the pool. As the object is already created and only destroyed when the application ends, it prevents the actions of instantiation and destruction allowing for each object to be reusable.
  • If the user requires an object and the object count of the pool that manages that object is zero, the pool will automatically create the object at runtime. If the programmer understands that the application will eventually require, for example 5 objects in the future, the programmer can set the size of the pool to 5 at the start. This will allow the system to create 5 objects and push them in the pool only to be popped when required during the application's lifetime.
  • The object pool class is made to be generic and can thus be templated to be used as a pool of a specific type. This allows it to be templated of the type 'MonoBehaviour'.
  • The object pool of type MonoBehaviour can be used to store gameobjects in a pool. The templated prefab for which the gameobject should be pooled can be specified in the class constructor as well as the parent to which the pooled gameobject should be a child of.
  • A defined function on each pooled object is called when retrieved and pushed into its respective pool allowing the object to perform actions when activated / deactivated such as instantiation / release of references etc.

Multithreaded Job System - Hobby Project

C++

  • A simple job system implementing the usage of my knowledge of multithreading in C++.
  • Initialize the system on start, thereby retrieving a pointer to the system and you should destroy the system on end.
  • Jobs can be sent to be executed. Every thread on your system will be running continuously from the start. A thread will be put to sleep using a wake condition to avoid running the loop continuously if there are no jobs sent to be executed. When a job is submitted, a sleeping thread will be notified and will take it upon itself to run the job on a thread in parallel.
  • A job pool is a fixed size circular buffer that stores all the submitted jobs. The pool is responsible for managing the head and the tail. It works as a fixed size queue and with the help of mutex's it is built to be thread safe. Being thread-safe only a single thread can take the next job and a job can be put onto the buffer by preserving the head and tail position of the buffer.
  • As all threads are always running in parallel, there is no way to join the threads and the threads are only stopped on destroying the Job System. Instead, the Wait function can be used to wait for execution for jobs on all threads to be completed until the main thread proceeds.

Memory-managed container library - Hobby Project

C++

  • Created components of a string, list, delegate, event and event handlers in C++ to replicate the availability in C#.
  • Each component allocates and frees the memory used within the object.
  • The delegate is made to work with methods, const and static functions. It saves the type of object, class type, function, return type and parameters. A delegate can be created to pass any number of parameters, parameter types and return type. A delegate can be created to be used as a multicast delegate. The list is used to create a delegate to hold the different functions of a multicast delegate.
  • The String, List resizes based on the user entries. To prevent the allocation of memory at every string or list resize, the size of the component is incremented to twice the current component size or to the new size if the new size is more than twice the original size.
  • An Event manager uses a dynamic pointer to call functions of that object. It can have multiple handlers so that handlers can be restricted to manage only certain events.

InputPollerGLFW - Hobby Project

C++

  • Keyboard and mouse input functionality in C++ for use with the GLFW library on Windows.
  • Can be easily imported for use in an existing C++ project that utilizes GLFW.
  • Can check for keyboard and mouse events such as button pressed in that frame, released in that frame, held down, mouse position, scroll, enable/disable cursor.

Task System - Hobby Project

Unity Engine, C#, .NET

  • A task system in the Unity game engine to create a story graph. Was used in OutbreakVR by game designers for designing the story and the game.
  • Allows to manage sequences of tasks and execute them efficiently in the game by pooling all task/sequence objects.
  • New tasks as required can be created based upon the existing template.
  • Multiple sequences can be executed at any time.
  • Each sequence includes a list of tasks whose functionality is defined by the user.
  • A sequence can be of multiple types as new modes can be used to modify how a sequence executes its tasks.