Check out my portfolio and contact me.

Wireframes and Data Models, a look into building a web application

For my first post in a very, very long time we’ll be looking at the Wireframes and data models of a web application I’m currently building in grad school. The application is an asset/project manager that will track as much of the user interactions within the system along with a visual flow of assets through the pipeline of the project for CG Studios. I’ll be doing several blog posts where I’ll discuss the different parts of the creation processes of the web application. The vision I have for the web application is one where it will be entirely modular and can be setup anyway when it comes to adding departments, users, and projects into the system. Along with control on a per project basis of the users and departments involved. Along with having greater information on the users like salary, average time on tasks, etc, I hope to then be able to visually demonstrate for project leads to be able to see the flow of assets (binary files, images, 3D models, scenes) through the production pipeline. Being able to give accurate eta updates or bids on work is a goal as well (yay big data).
This first post is going to be about the initial development of the application, where I’ll be discussing the wireframes and data models that I’m looking to use with the web application. So sit back and enjoy as I flop around while trying to figure out how to one man build a large complex application. I’m neither perfect nor an expert and comments/suggestion left below are always welcome.


To begin making sense of any kind of user interaction with the web application, I started with just simply sketching out the potential interactions on graphing paper creating wireframes. Some of these are just simple quick drawings where I explore just one potential look or interaction. I sketched out some of the core pages and how some of the interactions on those pages might play out. Nathan Barry does a wonderful job of explaining his workflow when designing the views of a web application.

Project View

Departments View

Asset Views

Task Views

Data Models

Continuing on while looking at the wireframes and data models of a web application, we will look at the data models. These models listed below will form the core of the management system. These models are all still a work in progress. If you are unfamiliar with data models and would like to learn more checkout’s course on the subject. Simon Allardice does a fantastic job of explaining relational databases in a format that is agnostic.


Project Model

  • name = CharField
  • date_created = DateTimeField
  • is_active =BooleanField
  • created_by =ForeignKey(CustomeUser)
  • client = CharField
  • icon=ImageField

Department Model

  • name = CharField
  • date_created = DateTimeField
  • is_active = BooleanField
  • created_by = ForeignKey(CustomeUser)
  • projec(s)t =ManyToManyField(Can belong to many projects)
  • description = CharField
  • icon=ImageField

Asset Model

  • name =CharField
  • date_created =DateTimeField
  • created_by =ForeignKey(CustomeUser)
  • project =ForeignKey(Project)
  • current_department =ManyToManyField
  • icon=ImageField

Sub Asset Model

  • name = CharField
  • date_created =DateTimeField
  • last_modified =DateTimeField
  • created_by =ForeignKey(CustomUser)
  • parent_asset = ForeignKey(Asset)
  • checked_out = BooleanField()
  • current_checked_out_user =ForeignKey(CustomUser)
  • location =FilePathField(allow_folders=False)
  • type =ForeignKey(AssetType)
  • current_department =ForeignKey(Department)
  • object = ObjectConrolerClass()
  • iteration_amount = IntegerField
  • asset_dependencies = ManyToMany(SubAsset)
  • icon=ImageField

Asset Type Model

  • name = CharField
  • date_created = dateTimeField
  • created_by = ForeignKey(CusomeUser)
  • accepted_file_types = Many

Custom User

  • email =EmailField
  • first_name = CharField
  • last_name = CharField
  • is_staff = BooleanField
  • is_active = BooleanField
  • date_joined =DateTimeField
  • objects = CustomUserManager()
  • salary_wage= IntegerField
  • average_task_completion_time = TimeQueryClass()
  • current_assignments = ManyToMany(Task)
  • departments = ManyToMany(Department)
  • projects = ManyToMany(Project)
  • avatar = ImageField

Task Manager Model

  • name = CharField
  • assigned_user = ForeignKey(CustomUser)
  • assigned_by = ForeignKey(CustomUser)
  • date_assigned = DateField
  • ate_completed = DateField
  • feed_back = CharField
  • description = CharField
  • assigned_assets = ManyToMany
  • assigned_sub_assets = ManyToMany
Thanks for reading my post where I looked at the Wireframes and Data models of the current web application I’m developing. Please feel free to leave comments below, to ask questions, or share thoughts.


Incremental Save Script Maya Python

I came up with a nice little incremental save script in Maya for those that want to control when they incrementally save instead of Maya’s incremental solution where if you enable this action it will save out a new version of your file each time you save. This could be troublesome when you are working with very large files and don’t want your drives filled up with saves don’t necessarily need to be incremented.

from pymel.core import *
import os

def incSave():
    path = sceneName()
    fileName = path.split('/')[-1].partition(".")[0]
    newFileName = fileName+"_0001"+".ma"
    incSaveFolder = "incrementalSave"
    fileFolder = os.path.abspath(os.path.join(path, os.pardir))
    incSaveFolderPath = os.path.join(fileFolder,incSaveFolder)
    projectSaveFolder = os.path.join(incSaveFolderPath, fileName)
    incSaveFilePath = os.path.join(projectSaveFolder, newFileName)
    if os.path.exists(incSaveFilePath):
        savedFiles = os.listdir(projectSaveFolder)
        incFiles = []
        for i in savedFiles:
            if fileName in i:
        lastFile = incFiles[len(incFiles)-1]
        name = lastFile.partition(".")[0]
        newName = name[:-4]+(str(int(name[-4:])+1).zfill(4))+".ma"
        incSaveFilePath = os.path.join(projectSaveFolder, newName)


As always I hope this helps people out and feel free to leave any comments or suggestions to improve this script. as a warning I have someone testing this out for me and I have made small changes to it and I will make changes to it on an as needed basis.


siggraphI recently returned from my first SIGGRAPH and I know it’s been a while since my last post. I got to see some very interesting papers, though when they brought up math I promptly lost interest, and some spectacular presentations on the making of Monsters University, Epic, and a host of really cool things as well.



My overall experience was great at SIGGRAPH, though California’s weather through me for a new since I’m from Texas and if it’s not above 85 degrees towards the end of July there’s just something wrong.

It was a breath of fresh air getting to meet new people from around the industry and to just sit down and have a conversation with someone that can understand you. The people were friendly to meet and it  was relatively easy to strike a conversation with someone you didn’t know.

Job Fair

SIGGRAPH also had a job fair, which from hearing from others was rather small. It was nice having a place where I could speak to an actual person from companies that you respect, instead of some online form. Though there were some companies there that I would question why they even had a booth to begin with since the only thing the people seemed to be able to do is lip service or in one case to just sign your name on their website.

Disney Animation studios took it one step further and had there on hall where they had team leads looking at people’s portfolio’s and giving feed back. It was a pretty awesome thing to be able to get direct feed back face to face on my portfolio from someone at a company that I highly respect.



The show room was a rather interesting place, ranging from Cinema4D’s live demo’s where they were also streaming live, to Pixar’s RenderMan, and to all the small booths that where located throughout the floor. One company was showing off their motion capture abilities with a skateboard ramp where they people skate boarding or roller skating and showing a live push of the information onto a game character on the TV screens around the booth.

There was also a very large number of 3D printing booths with some very cool things as well. I did wait in line for my tea pot from Pixar’s which is a rather cute version of Mike from Monsters University, but I did miss out on the poster they were handing out.


The Studio

There was also another interesting area as well called the studio where it was less about businesses trying to promote themselves and more about cool things being done with CG. They had things ranging from playing a game where you dipped your arms into water and used your fingers to shoot down monsters that were projected onto the surface of the pool.

There was also a really cool 3D scanner that I sat in line for and managed to take home the files. Unfortunately the .obj file was horribly low res and can’t be used. I’ll be looking around here soon to see if I can’t find any other any other importers for Maya since I have two other file formats that I was given as well.


Web Development

So I recently started the journey of learning web development. To start out I decided to go ahead and rebuild my personal portfolio site, since it need to be done anyways I figured why not kill two birds with one stone. To accomplish this task I used Foundation 3 and WordPress, where I developed my site and then converted it into a custom WordPress template.


To start out it was rather interesting to have to install all the support software on my machine just to even begin to start developing my. I had to install Homebrew, Ruby on Rails, Foundation, and MAMP (which I already had installed). But once I got all the software in place the development speed was incredible.


Working within a web framework infinitely increase the web development speed, I wish I had started learning this years ago. Sass is also a pretty interesting way to develop as well, I really like how it’s setup to write CSS where I can nest classes within classes. The only thing I had to really adjust to was the fact that hierarchy really matters when it comes to CSS in Sass. Also adjusting to grid based web page layout was interesting to get use to as well. But overall my experience was overwhelmingly positive while learning a new way to develop websites.

Converting my site into a WordPress template was a rather interesting and difficult task. To start this next step I setup a sub domain on my website and installed WordPress. I then took a blank theme and started copying and pasting my code into the appropriate pages. To say I didn’t know what I was doing was pretty accurate. I’m not exactly familiar with php, I can read it and get an idea of what some things do as long as they are named appropriately, but for the most part I was in the dark. Needless to say my first time uploaded my theme to the test sever yielded some pretty broken results. But I would honestly say that learning to do this the hard way was probably the best. I’m one of those people that learns best by doing and by doing it a lot. Needless to say with the slow start in implementing my site into the template it was overall a very interesting and educational experience.


Once I was finally happy with my theme I had to recreate all of my content from my old site and port it into the test site, since I planned to start fresh with my old site by deleting the root directory of all assets. This included bringing over all of my SEO as well which wasn’t exactly difficult. I also had to remake 60+ thumbnail images for my portfolio which I can say isn’t exactly the most interesting task to do. I was introduced to fancybox for displaying all my images and videos, I’ve fallen in love with this tool with how elegant and simple it is.


Once I had all of my content created and ported over, I bit the bullet and deleted all of the information in domains public html folder, except for my test websites domain. There was something interesting just watching my website being deleted through my ftp client. After that I installed a fresh version of WordPress and within 2 hours I had my new portfolio site up and running with SEO in toe as well.

Overall I really enjoyed the experience in getting my hands dirty and tinkering with the creation of my portfolio site. I hope to continue learning and growing with web development along with my fledgling python and javascript skills.



Auto Rigging Awesome Spine

I hope everyone had a wonderful holiday. Mine was good and bad at the same time. I had my wisdom teeth pulled between Christmas and New Years. Not really a great experience if I do say so myself now onto Auto Rigging Awesome Spine

Thanks to having my teeth pulled though I finally sat down and finished up creating a script to make faith of the fallen’s Awesome Spine Setup. I really like this implementation of an ik spine mainly because of how versatile it is and that you can’t gimbal lock it.

Manually Rigging The Spine

To start off with I first went through and did the tutorial manually so I would better understand what all I was doing when I went back and turned it into script. I did cheat at the end when I was connecting all the output and input nodes. I have gotten so use to doing things through code that I have begun to forget how to do certain tasks through Maya’s interface, so instead of spending an hour looking up how to connect input nodes through Maya’s interface I just wrote up a simple static script to connect everything for me. I don’t see this as much of a problem since doing connections can be tedious and messing up can cause problems, it was just faster and simpler to have the system handle it for me.

The final result from doing it manually actually didn’t work for me. I had managed to miss click one of my ik constraints in the early steps and so I failed at creating the rig manually. This was ok since I had gotten and understand of how the rigging process worked and I knew what I had messed up on.

Auto Rigging Awesome Spine

The Auto Rigging of the Awesome Spine was rather difficult and fun for me. To start off I duplicated the spine joint chain using a function I had already created with python, where I stored the joint rotations, positions and parents of each joint and then created a whole new set of joints and parented them according to the information I queried.

After that, it was actually rather simple array manipulation creating the other parts of the rig. Though during this proceses I had to speak to my mentor Ryan Griffin, who is always very patient and kind to me, several times for clarification and help. I managed to globally change Arrays, which I still haven’t figured out how I managed to do, though my mentor called it clever i’d argue with him on that one. The creation of the groups, locator nodes, and ikHandles was all just array manipulation from when I created the ik chain originally. I just had to find a way to execute the information that I had already to yield the results I desired.

This script does have limitations. There must always be 5 spine joints or it wont work. I have some ideas on how to make it dynamic but it would still always require the number of joints to be an odd number. There must also be control curves created and named properly in the scene for the script to execute. I did learn some things along the way. I gained a better understand of array manipulation and I learned how to loop through two different arrays at the same time, which doesn’t seem to be a big deal until you try and do it. I feel that my code became less bloated as well and that I started using dynamic solutions instead of static ones. I hope this has been an interesting/insightful read on Auto Rigging Awesome Spine.

All in all this was a difficult but fun process that I thoroughly enjoyed. I also added my shoulder control curve setup to my arm rigging script. My next step is to setup the auto rigging for the head controls and then from there I don’t know if want to start on the auto rigging of the facial controls or setup the FK with space switching scripts.