From patchwork Thu Jul 21 12:36:31 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexandros Frantzis X-Patchwork-Id: 2964 Return-Path: X-Original-To: patchwork@peony.canonical.com Delivered-To: patchwork@peony.canonical.com Received: from fiordland.canonical.com (fiordland.canonical.com [91.189.94.145]) by peony.canonical.com (Postfix) with ESMTP id 6336B23F4D for ; Thu, 21 Jul 2011 12:43:11 +0000 (UTC) Received: from mail-qy0-f173.google.com (mail-qy0-f173.google.com [209.85.216.173]) by fiordland.canonical.com (Postfix) with ESMTP id 32E47A184F2 for ; Thu, 21 Jul 2011 12:43:11 +0000 (UTC) Received: by mail-qy0-f173.google.com with SMTP id 10so3962301qyk.11 for ; Thu, 21 Jul 2011 05:43:11 -0700 (PDT) Received: by 10.229.25.212 with SMTP id a20mr174608qcc.148.1311252190930; Thu, 21 Jul 2011 05:43:10 -0700 (PDT) X-Forwarded-To: linaro-patchwork@canonical.com X-Forwarded-For: patch@linaro.org linaro-patchwork@canonical.com Delivered-To: patches@linaro.org Received: by 10.229.217.78 with SMTP id hl14cs139528qcb; Thu, 21 Jul 2011 05:43:10 -0700 (PDT) Received: by 10.216.88.132 with SMTP id a4mr187917wef.31.1311251795391; Thu, 21 Jul 2011 05:36:35 -0700 (PDT) Received: from adelie.canonical.com (adelie.canonical.com [91.189.90.139]) by mx.google.com with ESMTP id x56si389392wec.87.2011.07.21.05.36.35; Thu, 21 Jul 2011 05:36:35 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of bounces@canonical.com designates 91.189.90.139 as permitted sender) client-ip=91.189.90.139; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of bounces@canonical.com designates 91.189.90.139 as permitted sender) smtp.mail=bounces@canonical.com Received: from loganberry.canonical.com ([91.189.90.37]) by adelie.canonical.com with esmtp (Exim 4.71 #1 (Debian)) id 1QjsUT-0000DB-1I for ; Thu, 21 Jul 2011 12:36:33 +0000 Received: from loganberry.canonical.com (localhost [127.0.0.1]) by loganberry.canonical.com (Postfix) with ESMTP id 7C50B2EA025 for ; Thu, 21 Jul 2011 12:36:31 +0000 (UTC) MIME-Version: 1.0 X-Launchpad-Project: glmark2 X-Launchpad-Branch: ~glmark2-dev/glmark2/trunk X-Launchpad-Message-Rationale: Subscriber X-Launchpad-Branch-Revision-Number: 21 X-Launchpad-Notification-Type: branch-revision To: Linaro Patch Tracker From: noreply@launchpad.net Subject: [Branch ~glmark2-dev/glmark2/trunk] Rev 21: Add Matrix4f::invert() method. Message-Id: <20110721123631.17019.51446.launchpad@loganberry.canonical.com> Date: Thu, 21 Jul 2011 12:36:31 -0000 Reply-To: noreply@launchpad.net Sender: bounces@canonical.com Errors-To: bounces@canonical.com Precedence: bulk X-Generated-By: Launchpad (canonical.com); Revision="13475"; Instance="initZopeless config overlay" X-Launchpad-Hash: 6935b4d4ab3f6a3793594525478b3d54ad48689b ------------------------------------------------------------ revno: 21 committer: Alexandros Frantzis timestamp: Thu 2010-07-08 17:58:44 +0300 message: Add Matrix4f::invert() method. modified: matrix.cpp matrix.h --- lp:glmark2 https://code.launchpad.net/~glmark2-dev/glmark2/trunk You are subscribed to branch lp:glmark2. To unsubscribe from this branch go to https://code.launchpad.net/~glmark2-dev/glmark2/trunk/+edit-subscription === modified file 'matrix.cpp' --- matrix.cpp 2010-07-08 12:51:29 +0000 +++ matrix.cpp 2010-07-08 14:58:44 +0000 @@ -154,6 +154,41 @@ return *this; } +/** + * Inverts this matrix. + * + * This method can currently handle only pure translation-rotation matrices. + * + * @return reference to the matrix + */ +Matrix4f &Matrix4f::invert() +{ + // If the bottom row is [0, 0, 0, 1] this is a pure translation-rotation + // transformation matrix and we can optimize the matrix inversion. + // Read http://www.gamedev.net/community/forums/topic.asp?topic_id=425118 + // for an explanation. + if (m[3] == 0.0 && m[7] == 0.0 && m[11] == 0.0 && m[15] == 1.0) { + // Extract and invert the translation part 't'. The inverse of a + // translation matrix can be calculated by negating the translation + // coordinates. + Matrix4f t(1.0, 1.0, 1.0); + t.m[12] = -m[12]; t.m[13] = -m[13]; t.m[14] = -m[14]; + + // Invert the rotation part 'r'. The inverse of a rotation matrix is + // equal to its transpose. + m[12] = m[13] = m[14] = 0; + this->transpose(); + + // inv(m) = inv(r) * inv(t) + *this *= t; + } + else { + // Don't care about the general case for now + } + + return *this; +} + /** * Creates an empty matrix. * @@ -166,6 +201,11 @@ m[15] = 1.0; } +/** + * Copy constructor. + * + * @param mat the matrix to copy the contents of. + */ Matrix4f::Matrix4f(Matrix4f &mat) { memcpy(m, mat.m, sizeof(m)); === modified file 'matrix.h' --- matrix.h 2010-07-08 12:51:29 +0000 +++ matrix.h 2010-07-08 14:58:44 +0000 @@ -21,6 +21,7 @@ Matrix4f &transpose(); Matrix4f &perspective(GLfloat fovy, GLfloat aspect, GLfloat zNear, GLfloat zFar); Matrix4f &identity(); + Matrix4f &invert(); Matrix4f &operator*=(const Matrix4f &pM);