Saturday, December 14, 2013

Vinyl, End of Semester

The Open House went incredibly well and we got a lot of really good feedback on the game.  It naturally demos very well since it's bright and loud so we always had people gathered around the TV for the duration of the open house.  Everyone who played the game seemed to really love it, which was awesome, and picked it up really quickly.

We still have quite a bit of polish to do next semester, but considering with how this semester went, I'm extremely happy with where the game has gotten to.

Tuesday, December 10, 2013

Vinyl, Pre-EAE Day!

This last week was the final build for Vinyl before we're going to be showing it off at EAE Day.  As such I worked on a bunch of small tasks we needed to get finished off for the demo, along with a more major feature of actually tying leaderboard functionality in since Cody finished the framework for it last week.  Now clicking on the Leaderboard button in the Song Selection screen causes the songs to vanish and most of the buttons as well and the scores for that song scroll upwards.  Additionally, once the player reaches the Stats Screen at the end of a song they find out where they placed and if they're in the top 10 they get the option to submit their score by entering their initials.

On top of that I added in the new artwork for the power meter, added a particle effect for when the player collides with an obstacle, and made it so that the particles on the new star filter stay inside of the star.  I also fixed two bugs: one was an issue with how sorting songs by high score was working, and the other was making it so that the particles that come out of the player while boosting or after hitting a filter come out of the board the player is on as opposed to their back.


Today I worked on another menu overhaul to get the newest version of the artwork into the game.  Everything is looking so much better now.

Sunday, December 1, 2013

Vinyl, Post-Thanksgiving Update

Now that Thanksgiving is over it's time to cover the last two weeks since I fell behind on blogging again.  Last week was pretty uneventful since it was Thanksgiving, but I did do a complete overhaul on every single menu since we got the new artwork for them.  I think it really helps the game and looks so much better than what we had before.  My second task for the week, which I'm going to get done tomorrow, is to get the new filter object and its particle system in to replace the current one.  It should be relatively straight forward, but since we want a mesh with the particles contained inside of it I'm going to be figuring out how to do things with Unity's particle engine that I haven't done yet.  Should be fun.

The week before last I did a complete overhaul on all of the in-game UI since we got the artwork for that as well and it certainly looks much nicer, although I'm concerned that the power bar has lost a large chunk of its functionality since it's now harder to see in your peripheral vision.  Easy to fix at least, and not a huge concern.  I also started working on the new feature we added to the game that I mentioned last time to allow the player to change the audio effects of the song.  We're calling them Genre Changers and I got the spawning for them all set up so that they're showing up in game.  All that's left is to tie functionality into them once Sherly finishes that up on the audio side.

There's only two weeks left until the end of the semester and I'm starting to wonder if we're going to get all the coding done by that point.  It's looking like we might have a bit of crunching to do during Finals week.

Sunday, November 17, 2013

Vinyl, Information Overload!

This last week my focus was to improve the flow of information to the player.  This happened through two primary means: a new play screen, and a new stats screen.

Play screen:
Instead of the songs being listed on the main menu, they now have their own screen.  This allowed for added information on the songs such as duration, difficulty, and high scores.  Additionally, players can now sort the song list by any of these parameters making it much easier to find and compare songs.


(Note: This is actually the most recent version of the song selection screen.  At the time of writing this blog it was just the inside song buttons and all the other buttons floating in blackness.)

Stats screen:
The stats screen shows up after the player finishes a song and contains the majority of the information dump.  It displays the score the player got not he song in addition to the top 10 online high scores for that song.  It also tells the player what their maximum streak was, how many obstacles they hit, and how many filters they collected.  Finally, it also lets them know how many times they jumped and for how many seconds they used both boosting and scratching.


We also did a bit more designing on Vinyl this week to add in the ability for the player to select the music effect of the filters and the enhancements at the start of the song and at intervals throughout it.  This allows the player a bit more agency in listening to their music while playing the game.

Thursday, November 7, 2013

Vinyl, Break Week

This week has been fairly uneventful since people have been winding down since last week's mad rush.  We've spent the majority of your time looking into bugs that crash the game.  The vast majority of these seem to be caused by PD failing to launch correctly so we've been trying to come up with a way to deal with this and see if it fixes most of the problems.

Additionally, I've been looking into alternate color schemes for the obstacles so that they're easier to see once the full color effect is in place.  The current ones I've settled on that I like are a dusky orange, teal, and green.  All of the obstacles are lighter than the streak they leave on the track so it helps pop them out.

I've also started implementing the skeleton of the stats screen we want to display at the end of each song to inform the player of how well they've done, as well as to provide a location where they learn more about the dev team though a link to our web page.

We're aiming for feature complete on Nov 26th, so we have just 3 weeks to wrap up the remainders of the game.  We're close to that already, but the few things we do want to add are likely going to be pretty work intensive so there may be some crunching in the coming weeks.

Tuesday, November 5, 2013

Vinyl, now in IGF!!

Last week was a huge week filled with loads of work to get the build ready for IGF.  Our first submission went up on Tuesday and was mostly comprised of tweaking and fine tuning all the little issues we could think of.  This gave us a posted build that we knew would be in by the deadline, but we hoped to submit another, more polished one on Thursday if we could.

That night I sent out the build to my brother and a friend in France and got a ton of great feedback on the build, mostly relating to future goals since there wouldn't be enough time to get it in for IGF (and because huge changes that close to a deadline is a terrible ideas), but also some excellent feedback from new time users such as how to play a song not being apparent enough.

Thursday the professors sat down with the game and gave us a lot of feedback as well along with a list of changes they felt were mandatory for the IGF submission.  Most of these changes related to the menus and UI so I sat down and got all of them into the game within a few hours, allowing us to get the submission in that night, right before the deadline.

The most important of these changes were making so that the first song in the list is automatically selected, making the play button colored differently, making it so that a loaded song is automatically selected and scrolled to in the list, and the addition of a power bar to the in game UI so the player can easily tell how much power they have at any given time.

I'm super happy with the latest build and can see where this game is going at last.  I think we're going to have a really awesome final product.

Friday, October 25, 2013

Vinyl, Tweaks and Fixes

Since the IGF submission is coming up in just a week we spent this week focusing on fine tuning and polishing what we have with minimal addition of anything new.  I spent most of my time continuing to work on the menus to make them look better.  Additionally I spent some more time working with the filters on both their position as well as their appearance.  Working together with Zeph we've created a great 8th note filter that really looks awesome.

My addition to the game this week was implementing the streak counter so that it wasn't just a string on the screen.  We have some initial artwork for it and it shows up every 25 streak or when you lose your current streak.  Since implementing this I've decided to change it so that the streak always shows off to the side of the screen and the pop ups will show still in the middle.  This makes it so people can always see what their streak is, while still notifying them clearly of bigger milestones.

Thursday, October 17, 2013

Vinyl, Last 3 Weeks

Last week was more of a team building week than progress on the game since we were pretty fragmented and still all over the place.  We've definitely fixed most of the problems, but I feel like there's still a few that need to be addressed.  Hopefully we can take care of those once everyone is back from Fall Break.

Speaking of Fall Break it's been very productive.  This week I've:


  • Implemented the Main Menu, About Screen, "Loading" Screen, Pause Screen, and set up the framework for the Options Menu.
  • Implemented the varying filter effects so that the more in a row you hit the stronger the effect becomes.
  • Changed the way filter spawning works so that you have to work a bit to collect them.
  • Made it so that when you scratch the filters (and particle effect) will be properly tracked.
  • Added a new particle effect for when the player uses the boost.

The menus was easily the most time consuming, but I'm also very proud of them.  Especially the changes I made to the song selection list so that it fits with the theme of the game incredibly nicely (if I do say so myself).

No song selected:

 Song selected:


The rest of the changes were all smaller and just to get things that were already working to work better.  Most of them were new exposure to code I hadn't worked with before though, so that was really nice to learn about how we're doing other aspects of the code.


Thursday, October 3, 2013

Vinyl, Menus!

This week on Vinyl my main focus was to start getting our menus to a more finished state.  As a result, I added a new scrolling window to hold all of the songs a user imports as opposed to the simple list we had before (which meant you could only have about 20 songs loaded).  I also added functionality so that the user can remove a song from the game's list which also deletes the files the game makes to run with.  This was actually slightly more challenging than I thought it would be just because of the way Unity handles scrolling windows and selection.  The way it's set up now works perfectly, but it does feel slightly hack-y although I can't think of any other way to do it.

On top of that I also made it so that when you finish a level, instead of just sitting there not knowing what to do (end the game) it returns you back to the song selection screen so that you can continue to play.  This should really help with playtesting since people haven't known what to do when they finish a song.

Lastly, I also worked with jumping a bit to give it the "Mario Effect".  This means that if you hit jump a little late, the jump will still go off, just like Mario can jump even after he runs off the edge.  This helped to make jumping feel more responsive and you never feel like a jump fails when it should have gone off anymore.

Thursday, September 26, 2013

Vinyl, Controllers and Art

This week my main focus was getting UI art from Alice into the game.  It took much longer than expected mostly because it was tying functionality into the artwork and not just getting it to display.  The speedometer in particular was the most challenging since I had to figure out how to set and rotate around a pivot in Unity.  In addition to that the scratch bar functions identically as before, but looks far nicer.  It has a new button icon to let the player know how to use it, which goes away once they hit E the first time.  There's also a new bar to track progress through the song, so that it's easy to tell where in the song you are.



On top of getting all that working I also added controller support to the game, which was a pretty easy task.

Tuesday, September 24, 2013

Vinyl, Now With Score!

I'm on a roll here, 2nd week in a row I kept reminding myself to blog and forgot to.  Last week was a pretty productive week for me as well.

The main thing I worked on was implementing the "History of Vinyl" bar visual (temporary for us to test with) and functionality, which functions as our score for the game.  Playing well will increase the audio quality and visuals and vice versa.  In the end the bar won't be visible at all so that players will hear their score.  Hitting obstacles decreases your score, while hitting filters, looping successfully, and avoiding obstacles gives you score.  One future change might be to add a streak mechanic where avoiding obstacles without hitting any increases how much they're worth.

I also implemented a scratch resource so that you can now only scratch for 20 seconds.  This will likely be a number based off the length of the song and we're also thinking of adding a collectible that would slightly replenish this resource.

Finally, I also made it so that instead of our singular obstacle we now have three distinct ones so that they can all behave and look different.

Monday, September 16, 2013

Vinyl, Looping and Mesh Optimization

Oops, forgot to blog what I did on Vinyl last week so here it is a little delayed.

The main thing I did last week was to get the visuals of the looping to work.  Before the needle would just teleport to how far away from the player it was supposed to be.  Now it continues to move away from the player and then pulls back at the end of each loop.  This visual really goes along with the audio very well and helps the player to understand exactly what's going on.  There's still a bit of fine tuning that needs to be done on it for certain edge case fail states, which I plan to finish off this week, but it's in a very good state now.

The other task I took on since I needed more things to do was to make it so that the entire track mesh wasn't drawing the entire time.  Previously with an hour long song the entire mesh, several sub-meshes really, would be created on loading the song and displayed for the duration of the gameplay.  Now I've made it so that only the sub-mesh the player is on and the ones boarding it will be visible.  This has less impact on shorter songs that will likely only have three sub-meshes, but will drastically cut down the number of verts that we're drawing on much longer songs.

The last and smallest task I had was to completely remove the power bar since we decided to no longer use that resource.

Friday, September 6, 2013

Vinyl Gets Particles

This week I worked on adding multiple particle effects to the game in our attempts to get the game to look less programmer-y and more along the lines of what we're shooting for.  Obviously I'm still a programmer and not an artist at all, but at least now the particle systems are set up and ready for the artists to test out materials on.

Two of the particle effects I added are fairly similar, they're for the chorus filter and looping "walls" the player runs into to trigger the effect.  They're colored differently to make it very easy to distinguish between them, but the chorus filter's one also has a lot of movement involved whereas the looping one is stationary since it stops you for the looping effect.

Additionally I made a particle effect on the player itself that activates when you pass through the chorus filter and lasts for the same duration as the audio effect  We had this in the prototype as well and really liked how well the two worked together, it drives home that synesthesia feel we're going for.  The particles shoot out from behind the player in a cone and since we're now using a momentum based movement system, you can fling the particles around which looks pretty awesome.

Aside from that I also added more control schemes to the game as opposed to just WASD.  I feel like we should have a configuration scheme in an options menu where a user could select which scheme they want, but I suppose just having four options works too (IJKL, arrow keys, and 8456).  Everyone called me a nerd for putting IJKL in, but I still remember using that ages ago.

Thursday, August 29, 2013

Back to School, Back to Vinyl

Summer passed in a flash, and while I was unable to work on Vinyl while doing my internship at EA, the game has come a very long way from when I last worked on it.  The track generation code I wrote with Sherly after the end of last semester is still being used to generate each song's track.  Cody has set up a lot of code to analyze and track data from the song so we know when and what to spawn based off of the music.  We have most of the core gameplay set up and working, now we just need to refine the fun and tune everything.

Today I jumped right into the code and fixed the two of the largest bugs that had been plaguing the game for a while.  The first was an issue with the track where the half pipe would be created incorrectly with a roof on top of it. Initially it would seem like an issue with the track generation code, but it only happened on certain songs and not all of them.  Additionally, while travelling through this makeshift tunnel the camera would freak out for a split second, which didn't match up with the mesh having a problem.  Because of all this my initial suspicion was a problem with the spline data that we use to generate the mesh, and not the actual mesh itself.  After digging into the code a bit this turned out to be exactly what was wrong and it was an easy fix to adjust the spline.

The second bug was a larger issue, where after starting up the game it would soft lock.  We knew that this was happening because Unity and PD were failing to connect.  Unity was listening for the connection from PD, but the signal was being requested before PD had finished loading up.  To fix this I made it so that instead of sending one signal we send several attempts if we fail in addition to giving a timeout to the connection attempt so there's a window we're sending the signal in instead of a split second.  Now in the case of it failing, which has gone from almost always to never so far, the game won't soft lock although it will play incorrectly.  The next step is to take care of that fail case in some manner.

Here's the updated look of the game:

Friday, April 26, 2013

Semester End

The end of the semester has arrived and Vinyl is pretty much still in Prototype.  It's come a long way since the industry panel and we've changed a TON about the game, but we're not anywhere close to Alpha.  We're going to be working over the summer, starting completely fresh, to get the game up and running.  We've already set up our first sprint and we've assigned tasks, although only myself, Cody, and Sherly are programming.  The three others are unable to work on the game immediately for various reasons.

I'll admit to not being overly pleased about this whole setup, not for myself, but for the other engineers.  If they're unable to contribute much over the summer, they're going to come back to a game they haven't worked on or contributed much to and that doesn't seem terribly fair to them.  Of course, we're kind of forced into this at the same time since we have to have an alpha version of the game working by the start of next semester.  i just really hope everyone is able to contribute in a way that they're happy with by the end of the summer.  I personally am implementing the obstacles the player deals with since I'm familiar with that code as well as working with Sherly to generate the mesh of the pipe (as opposed to using a pre-made one like we did in the prototype.)  I'm particularly interested in this last task as it's been something I've wanted to work on since the start of the project and because it relates to code I've worked on previously (making a 3D reconstruction from data points.)

Aside from all of this, I'm also not terribly thrilled with the direction the game has moved in since the industry panel.  I'm not saying the game should have been locked where we had it, and I fully support changing and modifying the game, but I feel we're moving in the wrong direction.  A large reason for this, I feel, was our nebulous design and lack of a solid, defining razor for the game.  Because of this, stuff starting being cut or added to the game and it was hard to tell if it fit or not since everyone had a different idea of what the game was.  For me, Vinyl is all about the integration of game and music and NOT a game that just has music thrown into it.  Because of this, the heavy sports game genre influence that emerged really didn't feel right.  Parts of it, such as changing movement to be momentum based as opposed to simply moving work very well, but others, such as grinding just feel tacked on.  With the removal of a score mechanic the game completely lost its game feel and entered the realm of "not a game".  I also felt we were losing a really awesome aspect of our game, that of the online leader-boards which double as a fantastic way of getting word of the game out in addition to providing people a way to compete.  If there's one thing people online like to do it's beat other faceless people on the internet.

I started to become more alarmed once SSX was introduced.  I understand and support looking at other games and seeing how they do things, but directly yanking remixing the song while grinding, a completely unique feature to SSX, is going too far in my opinion.  The questions I keep asking myself is at what point does Vinyl stop being Vinyl and become SSX in the groove of a record?  Why do I want to play Vinyl instead of SSX?  We have to be careful to not be too heavily influenced by what's already been done and actually make this OUR game.  I'm not too concerned about this, but I think it's very important to keep in mind.  I'm still not entirely sold on grinding, but I also don't expect the rest of the group to conform to my design ideals.  I also feel it can work well in the game, we just need a good reason for it to be there, and it needs to be related to the music.

Finally, I feel we're starting to disregard a lot of the feedback we got from the industry panel.  I think the biggest thing about our game that got a lot of really positive feedback was how we make the song sound like crap if you play poorly.  No other game does that and it's our USP.  Now, as the one who's spent the most time working with filters to make the song sound more awesome I fully support that, but I also think we need to keep the negative aspects and if anything have more of them.  Now that we've learned about splines in Engineering we can ensure there's always a "safe" path the player can take so it's possible to reach the end of the song without a section forcing you to mess up the song.

In the last week we've worked to solidify the design of the game and have Mike as the Lead Designer so that we have a more streamlined design as opposed to everyone just throwing stuff into the pot.  Everyone is still going to be contributing, of course, but at least there's a filter now.  I keep pressing how much we need a razor and I think we'll have one soon which should really help us.

Thursday, April 25, 2013

Graphics Write-Up #12

This was a pretty fun assignment that didn't end up being too tricky to do, but there was a bit of debugging to figure out some issues.  All of the coding itself was pretty simple, I pretty much just duplicated my DepthPass and did the same thing for my ShadowPass except from the lights view instead of the camera's.  And....  that was pretty much it.  Changing the light from a point light to a directional light was surprisingly easy and the movement ended up working identically as before except that instead of updating a position, I just update the direction (and the position is calculated from the direction).  The most challenging was setting up the WorldToLightTransform since I just copied what my WorldToViewTransform was doing.  Once I double checked with your instructions, however, D3DXMatrixLookAtLH() worked perfectly.

The fragment shader code was a little trickier to figure out since I had to make sure to sample from the right texel of the shadow map to compare against the texel of the mesh's texture (since they're in different spaces.)  Talking with Derick, Sherly, and Chris really helped with this.

The end result of this assignment is quite possibly the coolest yet.  Seeing shadows working is really awesome.

Here's what the scene looks like:


And here's the shadow map as seen in PIX:


Link to code:  http://www.eng.utah.edu/~jthummel/graphics/ThummelGraphicsAssignment12.zip

Thursday, April 18, 2013

Vinyl Large Progress

I got a lot done on Vinyl this week working with Filter effects to modify the song.  Our wall, which I added a nifty little particle effect to, now adds a chorus filter to the song so that when you hit it three more tracks of the song come on.  The result is a really nice echo effect that lasts for two seconds.  We tested this with a few various types of music, including songs with lyrics, and it pretty much always sounds good, so that's nice.

I spent a lot of time working to get a distortion effect when the player hits a static object, but had a lot of trouble with it.  The main issue is that the filter drastically increases the volume, which ends up blasting out of the speakers.  I tried various ways of dropping the volume, even cutting the output audio to .1 of it's normal volume, but nothing actually decreased the volume of the filter.  This is really unfortunate because the effect of the filter, played for a split second, is a really nice horrible sound that would function great as an obstacle. For now I've shelved this, but I'd like to get back to it in some form since the effect really does work so well.

For now, there's just a small Echo filter on the static so you get a bit of extra echoing.

Finally, I worked with a Reverb filter to play while the player is grinding on one of bJason's rails on the side of the pipe.  This ends up sounding like you've plunged underwater and lasts while you grind.  We've talked about doing a remixing effect while grinding, but I'm more in favor of us coming up with a unique sounding filter.

Thursday, April 11, 2013

Vinyl Update

I worked on Vinyl for the first time in a long while!!!

I updated the static so that on collision it no longer changes your speed or moves you.  Now instead it simply plays an audio effect.  We can make "good" static have a pleasing sound and "bad" static have an annoying sound so that the player has control of collecting or dodging the static depending on what they want to do to their song.  Good and pad are likely bad representations as we can do many various sounds (maybe even player provided?) so that the player can pick and choose which statics to hit.

Additionally I implemented a "filter wall".  Right now it's just a grey wall you can pass through, but it also activates a filter effect on the music.  After hitting the wall the filter will effect the music for 2 seconds before it turns off.  This is actually a pretty awesome new feature as it does some very interesting things with the music.  The echo effect in particular sounds very cool, although it ends up being such an overwhelming about of noise that it gets annoying.  Distortion is also very obvious, but also fairly annoying since it's just static.  high pass and low pass both sound very good though, and the chorus filter is harder to detect, but I think it was actually doing some really awesome things.

Possibly we'll be able to come up with our own filters with help from the PHD music students that can do some really interesting things.

Graphics Write-Up #10 and #11

#10

This was a very interesting and moderately challenging assignment.  Getting the depth pass up and working wasn't too bad, but figuring out all the issues that cropped up from doing so took more time.  I had a really interesting issue where slices of my spheres weren't showing up (making it look kinda like a watermelon).  Additionally, when the meshes moved half of the sphere would vanish like this (Ignore the black sphere in the middle, it's supposed to be like that):

Left:
Right:


Up:

Moving the meshes down did the same thing, but also completely removed the floor.  IN the end, this turned out to be caused because of the order I was making calls.  I was doing the Depth pass, then updating the meshes, and then doing the normal draw pass.  The striped watermelon effect was caused by the natural rotation of the spheres, and the half spheres being removed was from moving them.  Since the depth was being captured and then changed, pixels were failing the depth test and being removed.  The easy fix was to of course do the mesh update first, before anything else.

An additional change I made to make the code a bit nicer was turning the creation of Fragment and Vertex shaders into a method.  This allowed me to set up the correct shaders to use for the depth pass, and was later useful on the next assignment when I had to use more new shaders.

Here's what my Depth pass and the depth buffer of Pix look like side by side:

My depth pass:

PIX's Depth Buffer:

Here's the scene itself with the soft blending edges:


#11

This was a very easy assignment since it was so similar to the previous two.  New textures and a surface, setting them at the right place, all it really was was adding transparency to the opaque bucket.  Drawing the quads was a simple matter of going back to the first assignment and pulling the code into the current project. This was a sort enough assignment I actually ended up writing all the code without testing it and then was pleasantly surprised when everything worked just as I hoped it would.

Despite its ease, it was still a really cool assignment learning how to set up a UI.

Here's the latest version of what my scene looks like:


Code can be found here:




Monday, April 8, 2013

Three Week Update

Once again blogging fell off, and this time it was a combination of being slammed for work, traveling all over, and not really all that much happening in Projects class.

The week after Spring Break we split up tasks and talked more about what we want Vinyl to be like.  I showed the group Symphony since I'd bought and played it over Spring break.  It has several features we want to use such as using the user's library, but we all agree that it's pretty much impossible to tell how the song relates to the gameplay.  Especially on harder difficulties you're so focused on staying alive that you pretty much ignore the music completely.  This is something we HAVE to avoid.  Not much work got done this week, likely because it was just break and GDC was the week after.

As mentioned the week after that was GDC so pretty much the entire class was in San Francisco.  It was a very interesting experience, although at least for engineers, there weren't really any internship opportunities, just entry level jobs.  I think it's going to end up being much more useful next year, especially with a more expensive pass that will let me go to the talks.

The week after that our Ubisoft team went to Montreal to present the game.  It was fascinating to see all the other student games and talk with both students and game devs.  Had a really great time, even if we were cramming like crazy right until the end.

Now that the Ubisoft project is all done with we're able to completely focus on Vinyl.  We only have three more weeks until the end of the semester and at this point we don't know if the deadline negotiations have extended the Alpha date.  We have a lot of work to get done, but I'm sure we'll be able to do it.

Thursday, March 21, 2013

Graphics Write-Up #9

This was a pretty interesting assignment on both sections.  The environment map was much easier of the two, especially since pretty much everything to get it working was done inside of the fragment shader.  In the first picture below you can see it clearly reflected in both the spheres on the sides as well as the floor.  I also went and changed my specular lighting to use the correct view position, using the camera's actual position instead of taking it out of the 4x4 matrix.  It was really cool to see this working in the scene.  I imagine that in the case of an outdoor scene, the environment map would be mirroring the sky-box.

Getting the render target working was more challenging.  It's also one of the cooler things we've done so far visually.  I ran into a few issues that were mostly related to my previous code structure as opposed to the current assignment, but once I'd fixed those, everything worked pretty smoothly.  Most of the troubles with this section was just making sure to put all the calls and change the render target in the correct locations.  Oh, one issue I had was trying to get both of the above to work with normal mapping in addition.  It might be working now that I've fixed a few other issues I ran into, but initially it wasn't working for some reason.  I'm going to look into that more once I have time since it shouldn't be messing up.

Here's what it looks like:


Here's PIX:


Link to code:  http://www.eng.utah.edu/~jthummel/graphics/ThummelGraphicsAssignment9.zip

Thursday, March 7, 2013

Two Week Pre-Spring Break Update

Things have been crazy lately what with the Industry Panel, Game Engineering, Game Graphics, AND Ubisoft on top of it all.  Not a good excuse for forgetting to blog, but there it is.

Last week was the panel and the gate decision.  The panel was fascinating.  It was so awesome to hear what people in the industry thought about our games, I learned so much from just listening to them.  I expected a lot of the feedback they gave such as scope issues for Co-Signers or the fact that Rover Rescue isn't an RTS, but there was also a lot of really amazing feedback for each game I'd never even thought of.

Vinyl was incredibly well received, but we also got a lot of great feedback on what we could improve.  Some key points were:

Making the song sound bad when doing poorly is really unique, definitely stick with this.
This game screams for mobile.
Use a controller, not the keyboard.
The speed indicator wasn't easy to see.

One of the best comments we got afterwards during a small play test session was the idea of adding another power up to be able to clear out all the static on screen.  This way if there's a section that's far too hard you'll be okay.  Mostly we just need to get better spawning off of the music.

There was no class on Tuesday, and then on Thursday all we did was learn which games continued on, Vinyl and Co-Signers.

This Tuesday we finalized groups and Vinyl now has 11 people on it.  Today we talked about what engine we want to use, what mechanics we want, our art style, pretty much everything.  It was a good two hours of team discussion and we really solidified our goals of what's going to happen.  On top of that we also checked out AudioSurf as a group to see what it's like.

Unfortunately, we're not positive on what engine we're going to use since Crytek seems to not be an option if we want to publish.  We're also looking at OGRE, but Unity is getting negative comments.  I really don't care which engine we end up using though.

Over Spring Break next week I'm going to look into pulling data out of an mp3 and also playing a bunch of other music games.

Here's a link to the video of our prototype we showed: http://youtu.be/icjEKQDvM-8

Wednesday, March 6, 2013

Graphics Write-Up #8

This weeks assignment was one of the easiest we've had in a while, which was nice.  Changing the Maya exporter was just a matter of seeing how the normals were done and then doing the same thing for the tangents and bitangents.  Of course, changing that meant the MeshBuilder had to change, but that was a simple fix to how the data was read in, after that all the binary code didn't need any modifications since it's all just more vertex data.

Writing the new shaders also wasn't bad since it was just reading in the new values and modifying the normal based off of them.  The most time intensive part of this assignment was simply making all the new files and loading them into the Lua file so that they're copied.

This was easily the most visually impressive task we've done yet, the normal mapping looks really awesome.

Here's what it looks like with normal mapping!  The left cube is with specular lighting, although you can't really tell with this screenshot.


Link to code:  http://www.eng.utah.edu/~jthummel/graphics/ThummelGraphicsAssignment8.zip

Thursday, February 28, 2013

Graphics Write-Up #7

Not a whole lot to say this time around.  Getting transparency to work was pretty easy, just a matter of setting the render state and then actually using an alpha value.  Most of my time this week was spent with getting the sorting code working correctly and coming up with a best as possible way to sort the transparent objects back to front every update.  Oh, and changing files around, but that's getting faster.

Getting the transparency working was awesome, the binary alpha in particular is really sweet.  It was also cool to see how big of a difference sorting the transparent objects back to front made.  You'd inherently think it shouldn't matter at all (since you can see through them!), but when I was drawing them front to back since that's the way I ordered them in my scene file, you could only see the one in front.  It really drove home the lesson.

Now that I'm looking at the 2nd screenshot below I should probably put the Render state code inside it's own PIX event just so it looks a little nicer, but I'll do that for next week since I don't want to go re-upload the code.

I also made sure to go back and fix all the little errors I'd made after getting feedback on Assignment 5.  6 will still have the same issues since it was submitted before then unfortunately.  Summing them up: I normalized the incoming normals to my fragment shaders so specular lighting is working at last.  I also took out my hard coded debugging specular exponent value and now pull it directly from the material as opposed to the scene file.  And....  I think that's everything that was wrong....


PIX events with only one Opaque and Transparent:

PIX events showing Opaque and Transparent expanded:

What it looks like now:



Link to Code: http://eng.utah.edu/~jthummel/graphics/ThummelGraphicsAssignment7.zip

Friday, February 22, 2013

Graphics Write-Up #6

Once again, this graphics assignment wasn't particularly challenging, but it did take a bit longer than I'd expected.  As of class yesterday I'd pretty much finished and had Maya models loading into my renderer.  However, for some reason only certain meshes were working, my original cubes worked fine and the new cone and soccer ball worked fine, but my torus didn't load at all.  This proved to be the most difficult part of the assignment as I'd never worked with binary files before.

I knew that I was writing the file out correctly, or at least I was pretty confidant I was since at first I didn't know how to convert a binary file into hex to verify it.  Once I got that working it became clear that I was indeed writing the file out correctly.  That left reading the file back in as the only issue.  This seemed rather confusing, though, as it was clearly working with some of the meshes already.  I tried using a cylinder instead of a torus, but it failed to work as well.  After talking to Cody during the break in class he helped me spot the error I'd made in my file reader.

The other section of the assignment, sorting all the PIX calls, was very easy, although it's been quite a while since the last time I wrote a sorting algorithm.  I didn't know at the time how to nest the calls, and now that I think about it I should have done that for this submission, but since we're going to be modifying it slightly during the next assignment I'll just make sure to do it then.

Oh.  I also think there's something wrong with my specular lightning, but I haven't gotten feedback on the last assignment so I'm not sure.  All attempts I've made at "fixing" it have done nothing at all though.

Here's the sorted PIX events broken down so that Effect is at the top of the tree, followed by Material and then finally the Entity.


Thursday, February 21, 2013

Vinyl, Prototype Complete!

By the end of Tuesday we managed to complete all our goals for the prototype.  Since last week we modified it so that instead of the static just randomly appearing, they now actually spawn based off the music itself.  One slight problem with this was that before we spawned them far enough away that it was difficult to notice this as well as we'd have liked.  We talked about running two music tracks, one silently that everything spawns off of, and the other delayed slightly so that everything shows up at the right time, but in the end we just spawn everything closer.  It looks great (other then seeing them appear, which really isn't that bad) and it's still possible to dodge everything.  Additionally, Sherly also got the equalizer fully working and it looks great.

We also found a fantastic Unity plug-in for sound manipulation that should allow us to do very awesome things with the game if we get past the first gate.

Today the producers are giving a dry run pitch to Cohort 2 and then Monday night is the big night.  The first gate.  All the prototypes will be pitched and shown to a panel of industry professionals and we'll see which games pass the gate and actually get a shot at being made into a full fledged game.  I think Vinyl stands a very good chance, but I'm still a little nervous.

Friday, February 15, 2013

Graphics Write-Up #5

This assignment ended up taking longer than I expected it would, but overall it wasn't terribly complex.  Most of the work this time around was just making all the new files, but it was really awesome to see the scene load perfectly after setting all of that up.

Getting the ambient lighting in was simple, but the specular lighting proved to be more challenging.  I got the correct equation in, but the light still wasn't showing up for some reason.  After going into PIX it was revealed that this line in the fragment shader:

float3 specularLight = pow( saturate( dot(R, V) ), specularExponent );

was resulting in 0, which would obviously mean that there's not going to be any specular light.  I talked with Sherly about this issue and she said that the same thing was happening with her 8 vertex cube, but that her 24 vertex cube worked fine.  So I made a new mesh for a 24 vertex cube so that each face could have its own normal and poof, it worked just fine.  I wasn't able to figure out why it doesn't work with the 8 vertex cube, but since it is working on the 24 vertex, at least I know my specular lighting calculations work.

Even though we didn't need a screen shot for this weeks submission, it feels weird to post a blog about a graphics assignment without a picture.  So here's my cubes with specular lighting in.  Unfortunately it's really hard to get a good shot with the rotating cubes.  The front and right side cubes are all using specular lighting, although only the 2nd and 4th are using the 24 vertex mesh.

Link to code: http://www.eng.utah.edu/~jthummel/graphics/ThummelGraphicsAssignment5.zip

Tuesday, February 12, 2013

Vinyl Lights and Sound!

Huge progress on the game this week.  We've got songs playing in game and we have the ability to change the speed of it based on the players speed.  So at the optimal speed the song would play correctly as opposed to too fast or slow.  A slight problem with this seems to be that the song is getting warped somehow, so if you speed up/slow down and then return to the normal speed it won't sound right.  We're trying to figure out why this is.

Volume also is full while in the center of the pipe and decreases as you get near the edges.

On top of this we added lasers as another object to obstruct the player.  These act as walls that prevent you from moving side to side in the pipe narrowing the playing field and making it noticeably harder.  As a side effect of adding these we ran into a small bug where the lasers were appearing pointing up into the sky instead of along the length of the pipe.  We currently added this as an additional feature so that there's a mini light show going on in the distance now, it looks pretty cool, especially since it's all based on how the player is moving.

To go along with all of this we added a Score and Speed display to help inform the player.  Speed currently shows an internal value we understand, but we need to convert it to a number that makes sense and we can teach the player about (RPMs).  Score constantly increases, but does so faster if you're in the center of the pipe and going at the optimal speed.

Now we want to make things change based on the music as opposed to just randomly spawning them in the world.  We're not sure if we'll actually have this done in time for the pitch in two weeks, but maybe it will happen.

Here's what it currently looks like:

Sunday, February 10, 2013

Graphics Write-Up #4

This assignment was brutal.  In the end I logged a total of 15 hours on it.  10 of those hours were trivial file parsing code, which was incredibly dull and boring.  The other 5 hours were at least more interesting.

Setting up the light color and intensity was very easy.  I implemented this first before doing anything else so I could see if it was working.  I also did the depth buffer at this point, although I obviously was unable to test it with a single cube.  Once I had the file parsing working, I then had to figure out how to change the code so that multiple objects could be drawn instead of just one.

This was probably the most interesting part of the assignment since I had to really go through all of the code and understand exactly what it was doing.  The code changes really weren't that bad though.  Instead of using a single m_scene object I just made an array of them and looped as necessary.  Initially all I did was wrap the Update, Load, and Release in for loops based on the number of entities in the scene, but this just resulted in a black screen.  

After a bunch of struggling and use of PIX, Sherly helped a bunch by telling me that parts of Update could only be called once, which obviously makes sense.  So I took out the clearing, BeginScene, and EndScene and I finally had three cubes working.

The end result is awesome.  Now all we have to do to add more objects to the scene is change/add files and the program *should* do the rest of it.




Tuesday, February 5, 2013

Vinyl Progress

Today during class we made a big step forward in getting the game to a playable state.  After struggling with it for a while we finally got the player movement down so that the half-pipe movement feels natural and behaves as it does in other games of the same genre.

With that stumbling block down we're now moving forward at full steam.  We've already added in basic enemy spawns for the player to avoid.  Right now they just spawn down the pipe directly in front of you, but eventually they'll ideally be spawning off of the music.  For the extent of the prototype I imagine we'll just randomize where in front of you they spawn instead of directly ahead.

Today we also met with a music PHD student who seems very interested in our game.  Our goal is that he might be able to help create some music for the game and how to tie it in well.

We've still got a week until the dry run presentation, by then we need to have some form of color in the game, but I think we've got most of the core elements in.  It's already enjoyable to play around with, even if only for a short time.  Once it becomes a little more interactive with collisions it should get a lot better.

Thursday, January 31, 2013

Graphics Write-Up #3

This week was considerably easier than the past weeks.  There were a few stumbling points however.  This was the largest one:


{ 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 },
{ 0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0 },
{ 0, 24, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 },
{ 0, 32, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0 },


In the end, COLOR had to be moved to the end since I wasn't sure how large it was and thus how much to offset the next data by.  (In retrospect, calling sizeof on the type would have worked too).  The light itself was working after implementing it like the camera, although it felt like it wasn't actually moving.  Changing the increments from 1 to 10 helped improve that though, which makes sense since the light needs to change a lot for it to have a noticeable impact.

The only other stumbling block was setting up the UVs.  I initially did it with 0,0 at the bottom left and it looked horrible and you couldn't tell what the texture was supposed to be.  I messed around with the UVs for a while trying to figure out what was going on, but then Shrly explained that in DirectX the origin is actually the upper left.

Another slightly odd issue was attempting to call a variable in the FragmentShader texture.  For some reason that just doesn't work.

I love that the light isn't actually lighting things up, but instead darkening things.  It's like an anti-light!

Camera is still on WASD and the Cube is on the arrow keys.
Light Controls:
I - Up
J - Left
K - Down
L - Right



P.S.  In case it isn't obvious from our almost identical write-ups, Jason and I worked together on this assignment (as with previous ones).

Wednesday, January 30, 2013

Vinyl v2.0

Yesterday we spent the majority of class time going over exactly what we want Vinyl to feel like.  We know that we want a heavy emphasis on flow, with the ultimate objective being that the player loses track of time as they experience their music through our game.  A big source of inspiration for us was Super Hexagon since it does an excellent job of doing this.

As a result we've changed our gameplay slightly, mostly focusing on a single gameplay experience as opposed to previously when we were planning on having vinyl, strings, drums, and brass sections.  Now the game is entirely based in the groove of a record we're going to represent with a half-pipe.  The player will control an avatar by moving them left and right (for dodging purposes) in addition to controlling their speed (seeking to maintain an optimal speed so that the song plays neither too fast nor too slow).

If the character is running down the bottom of the pipe then the sound is balanced and will come out of both speakers.  On the other hand, if the player moves up the left wall the sound will shift to the left speaker more and more and visa versa.  While running down the groove the player will have to dodge static pockets that in addition to reducing score, will randomly change the character's speed and bump them to the left or right.

Something we've thought of for the future is to include a feature where if you go too far to the left or right you end up falling into the next groove over causing the song to skip forwards or back.

Now that we have a really solid idea of exactly what we want we're able to get a prototype up and running in Unity which we expect to have done by the end of tomorrow ideally.

Sunday, January 27, 2013

Groups Decided

This week the groups were decided and set in stone.  Cellblock, Fus Fus and Vinyl are still around as expected, but there's also a 4th group now that's combining a bunch of people's ideas into a game.  Vinyl has 5 of us working on it, myself, Jason, Sherly, Mike, and Brianne.

Tuesday we planned out a rough idea of how we want the next three weeks to go and came up with a basic plan of what we want to do engineering wise.  We're going to be talking with Zodiac since they have a rail system as well, which is what we're after.

Since then, and especially on Thursday, I spent a lot of time playing various other music games to see how they did things.  I got a bit of inspiration and ideas, but most of them just have music playing and the game doesn't really use it.  There's an iPhone game, Synesthetic, that's the closest thing to what we're going for.  We also listened to a bunch of various types of music as a group to try and decide what genre we're going to use for the prototype.  Roger recommended that we not use a copyrighted song, even for the prototype, which we're going to go with.

Thursday, January 24, 2013

Graphics Write-up #2



Wow!  That was certainly a crazy assignment.  Part of the issue was that Joe had given us an absolutely massive assignment that was due Tuesday so I didn't actually start working on this one until Wednesday.  Coding wise, we hadn't covered how to write the viewToProjected transform so that was the most challenging aspect I think.  In general, I understood all the concepts since we covered them very well in class, but putting down those concepts into working code was more challenging than I anticipated.  If we hadn't had the video of the class to go over your code multiple times I doubt I would have finished this assignment in time.

Another more challenging section of the code was getting the vertexBuffer and the indexBuffer to communicate, but Jason K and I thought we'd figured it out and then you confirmed it in an e-mail so that was great.  Additionally getting the camera created was very easy, but actually getting it to work as a camera wasn't as obvious.  Once I figured out it was just how you set up the transform everything made a lot more sense.

Oh, I also got the triangle count and vertex count into the file so that now no values are hard coded into the code, which I'm really happy about.  A big future change to make will be to get everything out of the same file and into separate files.  I wanted to do that this assignment, but there just wasn't enough time.

Camera Controls:
W: Up
A: Left
S: Down
D: Right

Cube Controls:
Arrow Keys



Link to code:  http://eng.utah.edu/~jthummel/graphics/ThummelGraphicsAssignment2.zip

Thursday, January 17, 2013

Game Pitching, the Results!

So after the pitching on Tuesday, today we got feedback from the professors on each pitch, which was really nice to hear.  In my case, Roger even went as far to say that my modifications to the rogue-like formula were "genius", which was pretty awesome.  They did feel that the High Fantasy aspects of the game were over used and didn't really bring anything to the game which I agreed with.  I've always used it for the example since everyone will understand it, but I feel like the game could work with almost any setting since it's so flexible.  We then got the rather shocking announcement that they weren't going to pick which games we'd as we'd expect them to.  Instead, it was up to all of us to figure out which game we were going to work on with the one restriction that teams had to be more than 5 people, but less than 12.

As of this point, the three games that have enough people on them are Cellblock, Vinyl, and Fus-Fus with around 9 people who still aren't on a team that's large enough.  At this point it's unclear if those 9 will come onto one of the three current teams, or if another game will be added to the group.  Sadly, my game didn't draw enough attention despite several people saying they were interested in it.  I'm really not that upset about it since I feel that so many of the games had a lot of promise and that any of them could have resulted in a game I'd be happy to work on.

I'm on the Vinyl team since I do have a music background and I also feel like it has the potential to be a really awesome game.  I'm a little unsure of how we're going to get the ball rolling on this, but I think the consensus between the current engineers on the team is to work on the string grinding first.  I'm really excited for the brass instrument section with the player flying through the tubes, it's going to be a lot of fun both to play and program I think.

Graphics Write Up 1

File Format:
For my file format I went with something I'd used in the past when working on my 3D reconstruction program and also just because it makes a lot of sense.  It's simply an x, y pair per line grouped into lines of three for a triangle with a blank line to separate the triangles visually.  One change I would like to make to the format is including the number of triangles to draw in the first line since right now I just hard-coded that value, which is really bad practice.

Shader Modifications:
Since some of the default shader manipulation used sin and cos to do interesting things I went on to try and see what tan would do and was not disappointed.  So now both my coloring and position are using tangent calculations, which I feel looks really cool especially since the movement clearly distinguishes the two triangles.

Additional Stuff:
Figuring out the correct order to draw the triangles in was certainly very interesting.  I'd initially gone counter-clockwise, which didn't work, and then changing to clockwise ended up working perfectly.  However, one of the guys I was working with had both of his triangles clockwise as well and they weren't working, which didn't seem to make sense.  In the end we decided it was because I was beginning both of my triangles in the same location, the upper left and corner of the rectangle.  We're not entirely sure if that was it in the end, but it does work.

Another thing that was confusing, but easy to fix, was only drawing a single triangle.  After going through the code again I found the logic where it decided how many triangles to draw and changed it to 2.  As I said above, this clearly isn't the best solution to this and I'd prefer to be reading in the first line of the file to figure out how many triangles need to be drawn.

The last thing that took a bit of work was setting up the MeshBuilder tool.  It probably would have been easiest to completely copy the TextureBuilder tool and then just rename everything, but instead I created a new project and then copied each file over individually.  As a result my project properties weren't correctly set up and so I went through all of those and tried to set them up.  In the end I missed one, which messed up some of the Windows specific code, but a quick Google search fixed that.  I'm also glad I went through this way since it really helped to learn how all the dependencies worked and where everything was being loaded in from.

Pix Screenshots:



Code to this first assignment can be found here: http://www.eng.utah.edu/~jthummel/graphics/

Thursday, January 10, 2013

Game Pitching

So our first assignment this semester is pitching a game idea to the class as a possible thesis project.  I'm going to be pitching Dungeon Descent since I've been designing it for the last two years.  When I pitched it in the Capstone class it was well received and moved on to the prototyping phase, but didn't make it past that. This time, hopefully I've refined it enough that it will end up being selected as a thesis game.

The core of the game remains the same:  A rogue-like RPG where the player controls a party of four adventurers through a dungeon, but eventually is forced to return to the surface to avoid dying.  However, doing so resets the party's experience and items so that the next descent is a fresh start.  The one exception to this rule are special artifact items that will last forever once discovered and are the primary means of being able to advance deeper into the dungeon.  Levels will always be randomly generated to ensure that no two playthroughs ever feel the same since the game will force replayabilty.

Previously I'd pitched the game with the concept of an item combiner which would take all the items you'd found in a run and give you a chance to get an artifact item so the player would be rewarded even if they hadn't found an artifact.  I felt this was a band-aid fix to the issue though and wasn't a huge fan of it so I've modified it.  Now the player will get "Descent Experience" each time they go through the dungeon earning more the farther they manage to make it.  This will contribute to your "Descent Level" which will provide small benefits to each run.  For example, at Descent Level 1 the party could start with a health potion.  Hopefully this system will be enough of a reward so that on runs where the player doesn't find an artifact, they don't feel like they'd just wasted their time.

The unique aspect of the RPG part of the game is still the spell system, although  it's changed a bit as well.  Spells are still just a single item that when equipped to a character provides a unique spell.  For instance, the Fire scroll allows the Mage to cast Fireball and the Fighter to cast Protect.  Spells can also be combined, although now only the Mage and Cleric can do this (since they're the more magic oriented classes).  Combination spells can be any combination of two scrolls (or even 3 in the Mage's case at high level) such as Fire + Fire which would result in an AoE version of the normal Fire spell or Fire + Earth which could be Meteor.  Combination spells do more damage, and have special attributes, but also cost more mana to cast.  Spell slots would be unlocked at certain levels, for example the Mage might get a single slot at level 5, and then a double slot at level 10.