filtering trick

here's how you cut down the number of texture samples needed for a
filter. instead of sampling two adjacent pixels, scaling by a weight,
and adding, sample at a point in between the pixel and use a different
weight. to calculate the offset between the pixels and the new weight
just set the two equations equal.

p0 * w0 + p1 * w1 = (p0 * (1 - offset) + p1 * offset) * newWeight

p0 * w0 + p1 * w1 = p0 * ((1 - offset) * newWeight) + p1 * (offset * newWeight)
w0 = (1 - offset) * newWeight
w1 = offset * newWeight

offset = w1 / (w0 + w1)

newWeight = w0 + w1

gw arena

i've been hopelessly addicted to pvp random arena in guild wars this weekend. i think 4v4 is way more fun than 8v8. there are just so many fun turn arounds. i've been focusing on necro curses and mesmer illusions and have been able to pretty easily 1v1 anything i come up against. well except for blood magic necro but i've been unlocking those skills now so that i can try that out on a different character.

nin concert

nine inch nails concert at key arena was great. autolux opened and wasn't bad. queens of the stoneage followed and they were completely lame. but then reznor was up and was phenomenal. hurt, burn, and right where it belongs all in one performance... so awesome. and unbelievably the song deep is actually really good live. who could have known?

orthonormalization

gram-schmidt orthonormalization is really elegant, but i haven't had occasion to use it in practice. a common situation i run into requires creating an orthonormal basis from three 3d vectors which start pretty close to orthogonal. for example, say you have a forward vector and also approximate right and up vectors and you want them all orthonormal. sounds like a perfect job for gram-schmidt orthonormalization right? sure, but it's more efficient to just do two cross products.
cross product method:

right = normalize(cross(up, forward))
up = cross(forward, right)
= 1 normalize + 12 multiplies + 6 subtracts

gram-schmidt method:

right = normalize(right - dot(right, forward)*forward)
up = normalize(up - dot(up, forward)*forward)
= 2 normalize + 12 multiplies + 6 adds + 6 subtracts

(note that a second normalize is skipped for the cross product method because forward is assumed to be unit length and the cross product of two unit length vectors is also unit length. note also for the gram-schmidt method that subtracting the projection of up onto right is skipped because the right and up approximations we started with are assumed to be orthogonal.)
is there any use of gram-schmidt orthonormalization in three dimensions that can't be replaced by a more efficient algorithm with cross products?

9700 death

the first and last triangles my precious ati radeon 9700 pro ever rendered were those of warcraft 3. it died today at 1am during an intense 3v3 random team game. it's ram had been going bad for some time now and i'm thankful it held on as long as it did. we had a lot of good times together and it hurts me to say goodbye. rest in peace. :)