Technical Artist - Heavy Iron

During my time at Heavy Iron I was introduced to Test Driven Development and leveraging it creating a Perforce Wrapper helped me ensure that my code would run reliably. The core functionality of the tests checked that all the wrapping code did not alter expected functionality of Perforce. While others observed the machine state to check if operations were able to complete properly. The tests helps make it easier to rapidly change the Perforce wrapper class without worrying breaking dependent functionality.
        
class PerforceWrapper(object):
    '''Handles Perforce operations,
    includes wrappers for common operations     
    connections are generated at object creation and closed at object deletion.
    '''
----/----
    def isCheckedOutBy(self, filePath):
        '''
        returns a list of names of users with the file checked out or false
        '''
        status = self.filesStatus(filePath)[0]
        otherNames = [] # a list of all the other uses with the file checked out.
        if "otherOpen" in status:
            for numOthers in range(0,int(status["otherOpens"])):
                for name in status["otherOpen"]:
                    name.split("@")[0].split(".")
                    nameOut = name[0][0].upper() + name[0][1:].lower() + " " +\
                        name[1][0].upper() + name[1][1:].lower()
                    otherNames.append(nameOut)
            return otherNames
        return False
----/----
    def test_openFilesForEdit(self):
        '''
        using dummy file paths in the depot, these will need to be changed per workspace,
        once p4 where is working this may be something that could be done with depot paths,
        though it will invalidate the isolation of the tests
        check to see if the edit func checks out the files properly
        '''
        self.perforceObject.connectionOpen()
        #checkout some files, check their status and revert them.
        edit = self.perforceObject.edit(self.filePaths)
        #check that the files are okay for writing, which is W_OK False
        fileStats = self.helper_filesStatus(self.filePaths,os.W_OK,False)
        revert = self.perforceObject.revert(self.filePaths)
        self.assertTrue(fileStats,"The files were not all checked out (made writable with p4 edit)")
        
        

A member of the Art Team was working on exporting a number of different file states from After Effects and had devised a method of toggling the states using limited scripts. Their setup required them to move an element around a composition and hit render for sixteen different states. I created a batch script which automated the state changes and rendering for them. It allowed them to iterate on their designs more freely and spin up unattended renders on a separate machine. The function that assisted with automatic renaming based on the element had the following functionality: A member of the Art Team was working on exporting a number of different file states from After Effects and had devised a method of toggling the states using limited scripts. Their setup required them to move an element around a composition and hit render for sixteen different states. I created a batch script which automated the state changes and rendering for them. It allowed them to iterate on their designs more freely and spin up unattended renders on a seperate machine. The function that assisted with automatic renaming files based on the element had the following implementation:

    function ReplaceName(fileName){
        var name  = sel.name;
        //replaces keywords in a given string with formatting cleanup
        var NameCase = function nameCase(name){
                //capitalize things like a Noun
            var nameOut
            for (var i = 0; i < name.length; i++){   
                if(i==0){
                    nameOut += name[i].toUpperCase();
                } else if (name[i] == " " ) {
                    nameOut += name[i];
                    i++;
                    nameOut += name[i].toUpperCase();
                } else { nameOut +=name[i].toLowerCase();};
            }
            return nameOut
            }
        var nameUpper = name.toUpperCase();
        var nameLower = name.toLowerCase();
        var nameNoun = NameCase(name);
        fileName = fileName.replace("[NAME]", nameNoun);
        fileName = fileName.replace("[UPPER]", nameUpper);
        fileName = fileName.replace("[LOWER]", nameLower);
        fileName = fileName.replace("[NOUN]", nameNoun);
        return fileName;
    };

In addition to tools;
At one opportunity I pitched art improvements to one of the games in development, which were received.
I handled content assembly in the engine for two games in Unity for an external contract and deployed builds on to specialized hardware.