Logo

One-Offs

Pumpkin Patch Lamp

Description: Maya Scene

Client: Independent Project Role: Creator Year: 2025Skills: Hard Surface Modeling, XGen, MASH, and Arnold Lighting

Tools: Maya 2026

Pumpkin Patch Lamp was a dive into Maya and its tools for scene creation. The lamp, shepherd’s hook, and pumpkins were modeled assets that I then placed into a scene lit with an HDRI skydome and Arnold Spotlight, placed amongst

in order to keep a cohesive artistic style, meaning every asset is individually modeled and textured. With tight control of the visuals, the player is meant to notice the smaller details of the story.

Highlights

A wireframe of the scene, showing the topology used in the lamp, hook, and pumpkins.

The first lighting pass, where the Arnold Spotlight in the lamp is weaker than the HDRI.

The final lighting pass where the lamp brightness was increased but the color temperature was decreased for a more natural feeling.

Point Man

Description: Dice Game / 3-6 Players / 5-10 MinutesClient: Independent Project Role: Co-Creator Year: 2024 Skills: Game-play flow with iterative design and play-testing

Point Man is a fast paced dice game that I designed with Elijah Stewart, Yaryna Dumanska, Joseph Tapia, and Morgun Woolverton in one month. I designed additional player actions and added different colored dice to the gameplay to help with visual clarity.

Play the game!

amadeaus.itch.io/pointman

Highlights

In Point Man, the goal is to be the last man standings. You play by rolling three dice to act as your troops on the battlefield. You can then choose from different actions with Standard and Vendetta attacks or Fortifying.

Point Man was a study of adding player choice into a game that relied on the randomness of the dice roll. In order to add player actions, we needed to ensure the action was balanced against the standard attack and allowed the player some agency over the game-play.

Cube Controller

Description: Unity/Arduino Controller

Client: Independent Project Role: Co-Creator Year: 2025Skills: C# Scripting and C++ Coding

Tools: Unity 6 and Arduino IDE

Cube Controller was a compact physical cube that housed an Arduino‑based short‑range transmitter which read gyroscope orientation and sent coded signals to a receiver connected to a PC. In Unity I created a 3D replica that received those codes and updated its orientation and display numbers in real time, enabling a player to solve a 3‑digit code by rotating the cube.

Highlights

A showcase of the controller cube being rotated and the corresponding Unity behavior.

//Transmitter Code

//Includes and Vars

#include<Wire.h>

#include <VirtualWire.h>

const int MPU_addr=0x68;

int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;

int forward = 8;

//Done at the beginning of the program.

void setup()

{

    Serial.begin(9600);    

    Serial.println("setup");

    vw_setup(2000);

    vw_set_tx_pin(12);

    Wire.begin();

    Wire.beginTransmission(MPU_addr);

    Wire.write(0x6B);

    Wire.write(0);    

    Wire.endTransmission(true);

}

//Done constantly as its running.

void loop()

{

  //Sets Gyro working wires.

  Wire.beginTransmission(MPU_addr);

  Wire.write(0x3B);  

  Wire.endTransmission(false);

  Wire.requestFrom(MPU_addr,14,true);  

  AcX=Wire.read()<<8|Wire.read();    

  AcY=Wire.read()<<8|Wire.read();  

  AcZ=Wire.read()<<8|Wire.read();  

  Tmp=Wire.read()<<8|Wire.read();  

  GyX=Wire.read()<<8|Wire.read();

  GyY=Wire.read()<<8|Wire.read();  

  GyZ=Wire.read()<<8|Wire.read();  

  //Serial.print("AcX = "); Serial.print(AcX);

   

   //Series of 'if' statements which react to ranges from the gyro and send a message to the receiver.

   if(AcX<-6000&&AcX>-17000)

    {

    char *msg2 = "a";

    vw_send((uint8_t *)msg2, strlen(msg2));

    vw_wait_tx();

    Serial.println("a");

    }

 

   else if(AcX>6000&&AcX<17000)

    {

    char *msg2 = "b";

    vw_send((uint8_t *)msg2, strlen(msg2));

    vw_wait_tx();

    Serial.println("b");

    }

   else if(AcY<-6000&&AcY>-17000)

  {

    char *msg2 = "c";

    vw_send((uint8_t *)msg2, strlen(msg2));

    vw_wait_tx();

    Serial.println("c");

  }

   else if(AcY>6000&&AcY<17000)

{

    char *msg2 = "d";

    vw_send((uint8_t *)msg2, strlen(msg2));

    vw_wait_tx();

    Serial.println("d");

}

   else if(AcZ>6000&&AcZ<18000)

{

    char *msg2 = "f";

    vw_send((uint8_t *)msg2, strlen(msg2));

    vw_wait_tx();

    Serial.println("f");

}

   else if(AcZ<-6000&&AcZ>-18000)

{

    char *msg2 = "g";

    vw_send((uint8_t *)msg2, strlen(msg2));

    vw_wait_tx();

    Serial.println("g");

}

else

  {

     char *msg2 = "e";

    vw_send((uint8_t *)msg2, strlen(msg2));

    vw_wait_tx();

    Serial.println("e");

  }

  Serial.println(AcZ);

}

// RECIEVER CODE

#include <VirtualWire.h>

//Done at the beginning of the program.

void setup()

{

    Serial.begin(9600);

    Serial.println("setup");

    vw_setup(2000);  

    vw_set_rx_pin(8);    

    vw_rx_start();      

    /*pinMode(13, OUTPUT);

    //digitalWrite(13, HIGH);

    pinMode(motorPin1, OUTPUT);

    pinMode(motorPin2, OUTPUT);

    pinMode(motorPin3, OUTPUT);

    pinMode(motorPin4, OUTPUT);*/

}

//Done constantly as its running.

void loop()

{

    uint8_t buf[VW_MAX_MESSAGE_LEN];

    uint8_t buflen = VW_MAX_MESSAGE_LEN;

    if (vw_get_message(buf, &buflen))

    {

      int i;

      for (i = 0; i < buflen; i++)

      {

        if(buf[i] == 'a')//if button 1 is pressed.... i.e.forward buton

        {

          Serial.println("a");

          //Serial.println("4 Left");

        }

     

        if(buf[i] == 'b')

        {

          Serial.println("b");

          //Serial.println("3 Right");

        }

        if(buf[i] == 'c')

        {

          Serial.println("c");

          //Serial.println("2 Front");

        }

        if(buf[i] == 'd')

        {

          Serial.println("d");

          //Serial.println("5 Back");

        }

        if(buf[i] == 'e')

        {

          Serial.println("e");

          //Serial.println("7 Out of Bounds");

        }

        if(buf[i] == 'f')

        {

          Serial.println("f");

          //Serial.println("1 Top");

        }

        if(buf[i] == 'g')

        {

          Serial.println("g");

          //Serial.println("6 Bottom");

        }

    }

  }

}

Logo

One-Offs

Pumpkin Patch Lamp

Description: Maya Scene

Client: Independent Project Role: Creator Year: 2025Skills: Hard Surface Modeling, XGen, MASH, and Arnold Lighting

Tools: Maya 2026

Pumpkin Patch Lamp was a dive into Maya and its tools for scene creation. The lamp, shepherd’s hook, and pumpkins were modeled assets that I then placed into a scene lit with an HDRI skydome and Arnold Spotlight, placed amongst

in order to keep a cohesive artistic style, meaning every asset is individually modeled and textured. With tight control of the visuals, the player is meant to notice the smaller details of the story.

Highlights

A wireframe of the scene, showing the topology used in the lamp, hook, and pumpkins.

The first lighting pass, where the Arnold Spotlight in the lamp is weaker than the HDRI.

The final lighting pass where the lamp brightness was increased but the color temperature was decreased for a more natural feeling.

Point Man

Description: Dice Game / 3-6 Players / 5-10 MinutesClient: Independent Project Role: Co-Creator Year: 2024 Skills: Game-play flow with iterative design and play-testing

Point Man is a fast paced dice game that I designed with Elijah Stewart, Yaryna Dumanska, Joseph Tapia, and Morgun Woolverton in one month. I designed additional player actions and added different colored dice to the gameplay to help with visual clarity.

Play the game!

amadeaus.itch.io/pointman

Highlights

In Point Man, the goal is to be the last man standings. You play by rolling three dice to act as your troops on the battlefield. You can then choose from different actions with Standard and Vendetta attacks or Fortifying.

Point Man was a study of adding player choice into a game that relied on the randomness of the dice roll. In order to add player actions, we needed to ensure the action was balanced against the standard attack and allowed the player some agency over the game-play.

Cube Controller

Description: Unity/Arduino Controller

Client: Independent Project Role: Co-Creator Year: 2025Skills: C# Scripting and C++ Coding

Tools: Unity 6 and Arduino IDE

Cube Controller was a compact physical cube that housed an Arduino‑based short‑range transmitter which read gyroscope orientation and sent coded signals to a receiver connected to a PC. In Unity I created a 3D replica that received those codes and updated its orientation and display numbers in real time, enabling a player to solve a 3‑digit code by rotating the cube.

Highlights

A showcase of the controller cube being rotated and the corresponding Unity behavior.

//Transmitter Code

//Includes and Vars

#include<Wire.h>

#include <VirtualWire.h>

const int MPU_addr=0x68;

int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;

int forward = 8;

//Done at the beginning of the program.

void setup()

{

    Serial.begin(9600);    

    Serial.println("setup");

    vw_setup(2000);

    vw_set_tx_pin(12);

    Wire.begin();

    Wire.beginTransmission(MPU_addr);

    Wire.write(0x6B);

    Wire.write(0);    

    Wire.endTransmission(true);

}

//Done constantly as its running.

void loop()

{

  //Sets Gyro working wires.

  Wire.beginTransmission(MPU_addr);

  Wire.write(0x3B);  

  Wire.endTransmission(false);

  Wire.requestFrom(MPU_addr,14,true);  

  AcX=Wire.read()<<8|Wire.read();    

  AcY=Wire.read()<<8|Wire.read();  

  AcZ=Wire.read()<<8|Wire.read();  

  Tmp=Wire.read()<<8|Wire.read();  

  GyX=Wire.read()<<8|Wire.read();

  GyY=Wire.read()<<8|Wire.read();  

  GyZ=Wire.read()<<8|Wire.read();  

  //Serial.print("AcX = "); Serial.print(AcX);

   

   //Series of 'if' statements which react to ranges from the gyro and send a message to the receiver.

   if(AcX<-6000&&AcX>-17000)

    {

    char *msg2 = "a";

    vw_send((uint8_t *)msg2, strlen(msg2));

    vw_wait_tx();

    Serial.println("a");

    }

 

   else if(AcX>6000&&AcX<17000)

    {

    char *msg2 = "b";

    vw_send((uint8_t *)msg2, strlen(msg2));

    vw_wait_tx();

    Serial.println("b");

    }

   else if(AcY<-6000&&AcY>-17000)

  {

    char *msg2 = "c";

    vw_send((uint8_t *)msg2, strlen(msg2));

    vw_wait_tx();

    Serial.println("c");

  }

   else if(AcY>6000&&AcY<17000)

{

    char *msg2 = "d";

    vw_send((uint8_t *)msg2, strlen(msg2));

    vw_wait_tx();

    Serial.println("d");

}

   else if(AcZ>6000&&AcZ<18000)

{

    char *msg2 = "f";

    vw_send((uint8_t *)msg2, strlen(msg2));

    vw_wait_tx();

    Serial.println("f");

}

   else if(AcZ<-6000&&AcZ>-18000)

{

    char *msg2 = "g";

    vw_send((uint8_t *)msg2, strlen(msg2));

    vw_wait_tx();

    Serial.println("g");

}

else

  {

     char *msg2 = "e";

    vw_send((uint8_t *)msg2, strlen(msg2));

    vw_wait_tx();

    Serial.println("e");

  }

  Serial.println(AcZ);

}

// RECIEVER CODE

#include <VirtualWire.h>

//Done at the beginning of the program.

void setup()

{

    Serial.begin(9600);

    Serial.println("setup");

    vw_setup(2000);  

    vw_set_rx_pin(8);    

    vw_rx_start();      

    /*pinMode(13, OUTPUT);

    //digitalWrite(13, HIGH);

    pinMode(motorPin1, OUTPUT);

    pinMode(motorPin2, OUTPUT);

    pinMode(motorPin3, OUTPUT);

    pinMode(motorPin4, OUTPUT);*/

}

//Done constantly as its running.

void loop()

{

    uint8_t buf[VW_MAX_MESSAGE_LEN];

    uint8_t buflen = VW_MAX_MESSAGE_LEN;

    if (vw_get_message(buf, &buflen))

    {

      int i;

      for (i = 0; i < buflen; i++)

      {

        if(buf[i] == 'a')//if button 1 is pressed.... i.e.forward buton

        {

          Serial.println("a");

          //Serial.println("4 Left");

        }

     

        if(buf[i] == 'b')

        {

          Serial.println("b");

          //Serial.println("3 Right");

        }

        if(buf[i] == 'c')

        {

          Serial.println("c");

          //Serial.println("2 Front");

        }

        if(buf[i] == 'd')

        {

          Serial.println("d");

          //Serial.println("5 Back");

        }

        if(buf[i] == 'e')

        {

          Serial.println("e");

          //Serial.println("7 Out of Bounds");

        }

        if(buf[i] == 'f')

        {

          Serial.println("f");

          //Serial.println("1 Top");

        }

        if(buf[i] == 'g')

        {

          Serial.println("g");

          //Serial.println("6 Bottom");

        }

    }

  }

}

Logo

One-Offs

Pumpkin Patch Lamp

Description: Maya Scene

Client: Independent Project Role: Creator Year: 2025Skills: Hard Surface Modeling, XGen, MASH, and Arnold Lighting

Tools: Maya 2026

Pumpkin Patch Lamp is an environment scene I built to explore procedural and lighting workflows in Maya. The hero assets, which are the lamp hanging from the shepherd's hook and the pumpkins, were modeled and arranged in a field environment. Lighting combines an HDRI skydome with an Arnold Spotlight to achieve a warm atmosphere. Grass coverage was generated using interactive XGen splines, while pumpkin distribution across the field was handled procedurally with a MASH network.

Highlights

A wire-frame of the scene, showing the topology used in the lamp, hook, and pumpkins.

The first lighting pass, where the Arnold Spotlight in the lamp is weaker than the HDRI.

The final lighting pass where the lamp brightness was increased but the color temperature was decreased for a more natural feeling.

Point Man

Description: Dice Game / 3-6 Players / 5-10 MinutesClient: Independent Project Role: Co-Creator Year: 2024 Skills: Game-play flow with iterative design and play-testing

Point Man is a fast paced dice game that I designed with Elijah Stewart, Yaryna Dumanska, Joseph Tapia, and Morgun Woolverton in one month. I designed additional player actions and added different colored dice to the gameplay to help with visual clarity.

Play the game!

amadeaus.itch.io/pointman

Highlights

In Point Man, the goal is to be the last man standings. You play by rolling three dice to act as your troops on the battlefield. You can then choose from different actions with Standard and Vendetta attacks or Fortifying.

Point Man was a study of adding player choice into a game that relied on the randomness of the dice roll. In order to add player actions, we needed to ensure the action was balanced against the standard attack and allowed the player some agency over the game-play.

Cube Controller

Description: Unity/Arduino Controller

Client: Independent Project Role: Co-Creator Year: 2025Skills: C# Scripting and C++ Coding

Tools: Unity 6 and Arduino IDE

Cube Controller was a compact physical cube that housed an Arduino‑based short‑range transmitter which read gyroscope orientation and sent coded signals to a receiver connected to a PC. In Unity I created a 3D replica that received those codes and updated its orientation and display numbers in real time, enabling a player to solve a 3‑digit code by rotating the cube.

Highlights

A showcase of the controller cube being rotated and the corresponding Unity behavior.

//Transmitter Code

//Includes and Vars

#include<Wire.h>

#include <VirtualWire.h>

const int MPU_addr=0x68;

int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;

int forward = 8;

//Done at the beginning of the program.

void setup()

{

    Serial.begin(9600);    

    Serial.println("setup");

    vw_setup(2000);

    vw_set_tx_pin(12);

    Wire.begin();

    Wire.beginTransmission(MPU_addr);

    Wire.write(0x6B);

    Wire.write(0);    

    Wire.endTransmission(true);

}

//Done constantly as its running.

void loop()

{

  //Sets Gyro working wires.

  Wire.beginTransmission(MPU_addr);

  Wire.write(0x3B);  

  Wire.endTransmission(false);

  Wire.requestFrom(MPU_addr,14,true);  

  AcX=Wire.read()<<8|Wire.read();    

  AcY=Wire.read()<<8|Wire.read();  

  AcZ=Wire.read()<<8|Wire.read();  

  Tmp=Wire.read()<<8|Wire.read();  

  GyX=Wire.read()<<8|Wire.read();

  GyY=Wire.read()<<8|Wire.read();  

  GyZ=Wire.read()<<8|Wire.read();  

  //Serial.print("AcX = "); Serial.print(AcX);

   

   //Series of 'if' statements which react to ranges from the gyro and send a message to the receiver.

   if(AcX<-6000&&AcX>-17000)

    {

    char *msg2 = "a";

    vw_send((uint8_t *)msg2, strlen(msg2));

    vw_wait_tx();

    Serial.println("a");

    }

 

   else if(AcX>6000&&AcX<17000)

    {

    char *msg2 = "b";

    vw_send((uint8_t *)msg2, strlen(msg2));

    vw_wait_tx();

    Serial.println("b");

    }

   else if(AcY<-6000&&AcY>-17000)

  {

    char *msg2 = "c";

    vw_send((uint8_t *)msg2, strlen(msg2));

    vw_wait_tx();

    Serial.println("c");

  }

   else if(AcY>6000&&AcY<17000)

{

    char *msg2 = "d";

    vw_send((uint8_t *)msg2, strlen(msg2));

    vw_wait_tx();

    Serial.println("d");

}

   else if(AcZ>6000&&AcZ<18000)

{

    char *msg2 = "f";

    vw_send((uint8_t *)msg2, strlen(msg2));

    vw_wait_tx();

    Serial.println("f");

}

   else if(AcZ<-6000&&AcZ>-18000)

{

    char *msg2 = "g";

    vw_send((uint8_t *)msg2, strlen(msg2));

    vw_wait_tx();

    Serial.println("g");

}

else

  {

     char *msg2 = "e";

    vw_send((uint8_t *)msg2, strlen(msg2));

    vw_wait_tx();

    Serial.println("e");

  }

  Serial.println(AcZ);

}

// RECIEVER CODE

#include <VirtualWire.h>

//Done at the beginning of the program.

void setup()

{

    Serial.begin(9600);

    Serial.println("setup");

    vw_setup(2000);  

    vw_set_rx_pin(8);    

    vw_rx_start();      

    /*pinMode(13, OUTPUT);

    //digitalWrite(13, HIGH);

    pinMode(motorPin1, OUTPUT);

    pinMode(motorPin2, OUTPUT);

    pinMode(motorPin3, OUTPUT);

    pinMode(motorPin4, OUTPUT);*/

}

//Done constantly as its running.

void loop()

{

    uint8_t buf[VW_MAX_MESSAGE_LEN];

    uint8_t buflen = VW_MAX_MESSAGE_LEN;

    if (vw_get_message(buf, &buflen))

    {

      int i;

      for (i = 0; i < buflen; i++)

      {

        if(buf[i] == 'a')//if button 1 is pressed.... i.e.forward buton

        {

          Serial.println("a");

          //Serial.println("4 Left");

        }

     

        if(buf[i] == 'b')

        {

          Serial.println("b");

          //Serial.println("3 Right");

        }

        if(buf[i] == 'c')

        {

          Serial.println("c");

          //Serial.println("2 Front");

        }

        if(buf[i] == 'd')

        {

          Serial.println("d");

          //Serial.println("5 Back");

        }

        if(buf[i] == 'e')

        {

          Serial.println("e");

          //Serial.println("7 Out of Bounds");

        }

        if(buf[i] == 'f')

        {

          Serial.println("f");

          //Serial.println("1 Top");

        }

        if(buf[i] == 'g')

        {

          Serial.println("g");

          //Serial.println("6 Bottom");

        }

    }

  }

}