Update of /cvsroot/java-game-lib/LWJGL/src/native/win32 In directory usw-pr-cvs1:/tmp/cvs-serv1539 Modified Files: org_lwjgl_Math_MatrixOpAdd_MatrixOpDirect.cpp org_lwjgl_Math_MatrixOpAdd_MatrixOpSafe.cpp org_lwjgl_Math_MatrixOpCopy_MatrixOpDirect.cpp org_lwjgl_Math_MatrixOpCopy_MatrixOpSafe.cpp org_lwjgl_Math_MatrixOpInvert_MatrixOpDirect.cpp org_lwjgl_Math_MatrixOpInvert_MatrixOpSafe.cpp org_lwjgl_Math_MatrixOpMultiply_MatrixOpDirect.cpp org_lwjgl_Math_MatrixOpMultiply_MatrixOpSafe.cpp org_lwjgl_Math_MatrixOpNegate_MatrixOpDirect.cpp org_lwjgl_Math_MatrixOpNegate_MatrixOpSafe.cpp org_lwjgl_Math_MatrixOpNormalise_MatrixOpDirect.cpp org_lwjgl_Math_MatrixOpNormalise_MatrixOpSafe.cpp org_lwjgl_Math_MatrixOpSubtract_MatrixOpDirect.cpp org_lwjgl_Math_MatrixOpSubtract_MatrixOpSafe.cpp Added Files: MatrixOpCommon.cpp MatrixOpCommon.h Log Message: First draft of ANSIC++ Vector code. Needs to be tested. --- NEW FILE: MatrixOpCommon.cpp --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/win32/MatrixOpCommon.cpp //#include <iostream> #include <jni.h> #include "MatrixOpCommon.h" bool Matrix::identicalDataSpaces(Matrix & other) { if (address != other.address) return JNI_FALSE; if (stride != other.stride) return JNI_FALSE; if ((width * height) != (other.width * other.height)) return JNI_FALSE; return JNI_TRUE; } bool Matrix::intersectingDataSpaces(Matrix & other) { char * my_max_address = &address[ stride * elements ]; char * other_max_address = &other.address[ other.stride * other.elements]; if (address >= other.address || address <= other_max_address) return JNI_TRUE; if (other.address >= address || other.address <= my_max_address) return JNI_TRUE; return JNI_FALSE; } void Matrix::transposeMatrix(float * src, float * dst, int src_width, int src_height) { // square matrix transpose if (src_width == src_height) { for (int i = 0; i < src_width; i++) for (int j = 0; j < src_width; j++) dst[i + src_width * j] = src[j + i * src_width]; } // non square matrix transpose else { for (int i = 0; i < src_width; i ++) for (int j = 0; j < src_height; j++) dst[i + src_height * j] = src[j + i * src_height]; } } void Matrix::transposeMatrix(float * mat, int src_width, int src_height) { float temp; // square matrix transpose if (src_width == src_height) { for (int col = 0; col < src_width; col++) { for (int row = col+1; row < src_height; row++) { // swap the two elements temp = mat [col * src_height + row]; mat[col * src_height + row] = mat[row * src_width + col]; mat[row * src_width + col] = temp; } } } // non square matrix transpose else { transposeMatrix(mat, transpose_record, src_width, src_height); memcpy(mat, transpose_record, src_width * src_height * sizeof(float)); } } SrcMatrix::SrcMatrix ( jint addr, jint s, jint w, jint h, jint e, jboolean t): Matrix(addr, s, e), record_offset((char *) addr), record_size (w*h) { if (t) { width = h; height = w; } else { width = w; height = h; } elements = e; record = new float[width * height]; // vectors do not need to be transposed transpose = (t == JNI_TRUE) && (w != 1) && (h != 1); if (transpose && (width != height)) // only need temp storage for transpose if the matrix is not square transpose_record = new float[width*height]; else transpose_record = 0; if (elements == 1) { // fool the nextRecord function into returning a value elements = 2; nextRecord(); elements = 1; } } SrcMatrix::~SrcMatrix() { //cout << "SrcMatrix destructor \n"; delete [] record; if (transpose_record != 0) delete [] transpose_record; } float * SrcMatrix::nextRecord() { if (elements > 1) { //cout << "Elements: " << elements << "\n"; //cout << "Address: " << (unsigned int) (record_offset) << "\n"; // the record is not properly aligned if ((unsigned int) (record_offset) & FLOAT_ALIGNMENT) { // copy the floats into a buffer so that they are aligned // on 4 byte margins (not necessary on intel, but a good thing) memcpy (record, record_offset, record_size * sizeof(float)); if (transpose) transposeMatrix (record, height, width); record_offset = &record_offset[stride]; current_record_ptr = record; } // the record is aligned but it has to be transposed else if (transpose) { transposeMatrix ((float *) (record_offset), record, height, width); record_offset = &record_offset[stride]; current_record_ptr = record; } // nothing has to be done to the record else { // the floats are aligned in memory current_record_ptr = (float *) record_offset; record_offset = &record_offset[stride]; } } return current_record_ptr; } DstMatrix::DstMatrix (jint addr, jint s, jint w, jint h, jint e, jboolean t): Matrix(addr, s, e) { width = w; height = h; record_size = width * height; record = new float[record_size]; // vectors do not need to be transposed transpose = (t) && (w != 1) && (h != 1); if (transpose) transpose_record = new float[width*height]; else transpose_record = 0; data_buffered = JNI_FALSE; record_buffered = JNI_FALSE; record_offset = address - stride; } DstMatrix::~DstMatrix() { //cout << "DstMatrix destructor \n"; delete [] record; if (transpose_record != 0) delete [] transpose_record; // copy back any buffered data if (data_buffered) { char * src = buffer; char * dest = address; for (int i = 0; i < elements; i++) { memcpy(dest, src, record_size * sizeof(float)); src += stride; dest += stride; } delete [] buffer; } } void DstMatrix::configureBuffer(SrcMatrix & a, SrcMatrix & b) { if (!a.intersectingDataSpaces(b)) { // as long as the output only overlays 1 of the sources, and the other // source only has 1 matrix in it, only a record_buffer is required if (a.elements == 1 && identicalDataSpaces(b)) record_buffered = JNI_TRUE; else if (b.elements == 1 && identicalDataSpaces(a)) record_buffered = JNI_TRUE; else // otherwise all of the output has to be buffered createBuffer(); } else createBuffer(); } void DstMatrix::configureBuffer(SrcMatrix & a) { if (identicalDataSpaces(a)) record_buffered = JNI_TRUE; else if (intersectingDataSpaces(a)) createBuffer(); } void DstMatrix::createBuffer() { data_buffered = JNI_TRUE; buffer = new char[ elements * stride ]; record_offset = buffer - stride; } float * DstMatrix::nextRecord() { record_offset = &record_offset[stride]; if ((((unsigned int)(record_offset)) & FLOAT_ALIGNMENT) || transpose || record_buffered) { last_record_in_temp = JNI_TRUE; return record; } else { last_record_in_temp = JNI_FALSE; return (float *) record_offset; } } void DstMatrix::writeRecord() { if (last_record_in_temp) { // 3 reasons why the record would be in temp // // 1. The record is not aligned // 2. The result will need to be transposed // 3. Direct Mode where result would overlay an operand if (((unsigned int)(record_offset)) & FLOAT_ALIGNMENT) { if (transpose) transposeMatrix(record, width, height); memcpy (record, record_offset, record_size * sizeof(jfloat)); } else if (transpose) { transposeMatrix(record, (float *) record_offset, width, height); } else memcpy (record_offset, record, record_size * sizeof(jfloat)); } } /////////////////////////////////////////////////////////////////////////// void subMatrix (const float * src, int side, float * dst , int col_omit, int row_omit) { int index = 0; for (int c = 0; c < side; c++) { if (c == col_omit) continue; for (int r = 0; r < side; r++) { if (r == row_omit) continue; dst[index++] = src[r + c * side]; } } } float determinant (const float * matrix , int side) { // we are assuming for this case that the data is in column major format float det = 0; if (side == 2) // your basic cross product det = matrix[0] * matrix[3] - matrix[2] * matrix[1]; else { int temp_side = side - 1; float temp_matrix [temp_side * temp_side]; float sign = 1; for (int i = 0; i < side; i++) { // get a sub matrix by eliminating the ith row and the 0th column subMatrix(matrix, side, temp_matrix, 0, i); // add to the determinant sign * [a]i0 * [M]i0 det += sign * matrix[i] * determinant (temp_matrix, temp_side); // alternate the sign sign = (sign == 1) ? -1 : 1; } } return det; } --- NEW FILE: MatrixOpCommon.h --- CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/win32/MatrixOpCommon.h /* * Matrix.h * * * Created by tristan on Sat Aug 24 2002. * Copyright (c) 2001 __MyCompanyName__. All rights reserved. * */ #define FLOAT_ALIGNMENT 0x00000003 float determinant (const float * matrix , int side); void subMatrix (const float * src, int side, float * dst , int col_omit, int row_omit); /////////////////////////////////////////////////////////////////////////////////////// // Matrix ////////////////////////////////////////////////////////////////////////////////////// class Matrix { protected: float * transpose_record; // to use while transposing the record public: char * address; // the start of the data jint stride; // the distance between each record jint width, // the width of the matrix height, // the height of the matrix elements; // the number of matricies jboolean transpose; // whether this matrix is or will be transposed Matrix (jint a, jint s, jint e): address((char *)a), stride(s), elements(e) {} bool identicalDataSpaces (Matrix & other); bool intersectingDataSpaces(Matrix & other); void transposeMatrix(float * src, float * dst, int src_width, int src_height); void transposeMatrix(float * mat, int src_width, int src_height); }; /////////////////////////////////////////////////////////////////////////////////////// // Src Matrix ////////////////////////////////////////////////////////////////////////////////////// class SrcMatrix: public Matrix { private: char * record_offset; // the offset of this record in memory float * record; // temporary storage to store a fully aligned and transposed // copy of the record, if the one in memory is not so float * current_record_ptr; // the address of the memory containing the record last // returned by the nextRecord() function jint record_size; // the total floats in each record public: SrcMatrix ( jint address, jint stride, jint width, jint height, jint elements, jboolean transpose); void rewind() { record_offset = address; } float * nextRecord(); ~SrcMatrix(); }; /////////////////////////////////////////////////////////////////////////////////////// // Dst Matrix ////////////////////////////////////////////////////////////////////////////////////// class DstMatrix: public Matrix { char * record_offset; // the offset of the record in memory jboolean data_buffered; // if all of the data has to be buffered char * buffer; // a buffer used when data_buffered jboolean last_record_in_temp; jboolean record_buffered; // if only a single record is buffered float * record; // to store data if source is unaligned jint record_size; public: DstMatrix (jint address, jint stride, jint width, jint height, jint elements, jboolean transpose); void configureBuffer(SrcMatrix & a, SrcMatrix & b); void configureBuffer(SrcMatrix & a); void createBuffer(); float * nextRecord(); void writeRecord(); ~DstMatrix(); }; Index: org_lwjgl_Math_MatrixOpAdd_MatrixOpDirect.cpp CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/win32/org_lwjgl_Math_MatrixOpAdd_MatrixOpDirect.cpp =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/native/win32/org_lwjgl_Math_MatrixOpAdd_MatrixOpDirect.cpp,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- org_lwjgl_Math_MatrixOpAdd_MatrixOpDirect.cpp 24 Aug 2002 21:16:53 -0000 1.1 +++ org_lwjgl_Math_MatrixOpAdd_MatrixOpDirect.cpp 28 Aug 2002 16:45:24 -0000 1.2 @@ -1,75 +1,101 @@ -/* - * Copyright (c) 2002 Light Weight Java Game Library Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'Light Weight Java Game Library' nor the names of - * its contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * $Id$ - * - * Win32 math library. - * - * @author cix_foo <ci...@us...> - * @version $Revision$ - */ - -#include <windows.h> -#include "org_lwjgl_Math_MatrixOpAdd_MatrixOpDirect.h" -/* - * Class: org_lwjgl_Math_MatrixOpAdd_MatrixOpDirect - * Method: execute - * Signature: (IIIIIZIIIIIZIIZ)V - */ -JNIEXPORT void JNICALL Java_org_lwjgl_Math_00024MatrixOpAdd_00024MatrixOpDirect_execute - ( - JNIEnv * env, - jobject obj, - jint leftSourceAddress, - jint leftSourceStride, - jint leftElements, - jint leftSourceWidth, - jint leftSourceHeight, - jboolean transposeLeftSource, - jint rightSourceAddress, - jint rightSourceStride, - jint rightElements, - jint rightSourceWidth, - jint rightSourceHeight, - jboolean transposeRightSource, - jint destAddress, - jint destStride, - jboolean transposeDest - ) -{ - float * leftSource = (float *) leftSourceAddress; - float * rightSource = (float *) rightSourceAddress; - float * dest = (float *) destAddress; -} +/* + * Copyright (c) 2002 Light Weight Java Game Library Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of 'Light Weight Java Game Library' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/** + * $Id$ + * + * Win32 math library. + * + * @author cix_foo <ci...@us...> + * @version $Revision$ + */ + +#include <windows.h> +#include "org_lwjgl_Math_MatrixOpAdd_MatrixOpDirect.h" +#include "MatrixOpCommon.h" +/* + * Class: org_lwjgl_Math_MatrixOpAdd_MatrixOpDirect + * Method: execute + * Signature: (IIIIIZIIIIIZIIZ)V + */ +JNIEXPORT void JNICALL Java_org_lwjgl_Math_00024MatrixOpAdd_00024MatrixOpDirect_execute + ( + JNIEnv * env, + jobject obj, + jint leftSourceAddress, + jint leftSourceStride, + jint leftElements, + jint leftSourceWidth, + jint leftSourceHeight, + jboolean transposeLeftSource, + jint rightSourceAddress, + jint rightSourceStride, + jint rightElements, + jint rightSourceWidth, + jint rightSourceHeight, + jboolean transposeRightSource, + jint destAddress, + jint destStride, + jboolean transposeDest + ) +{ + SrcMatrix left (leftSourceAddress, leftSourceStride, + leftSourceWidth, leftSourceHeight, leftElements, transposeLeftSource); + SrcMatrix right (rightSourceAddress, leftSourceStride, + rightSourceWidth, rightSourceHeight, rightElements, transposeRightSource); + DstMatrix dest (destAddress, destStride, + left.width, left.height, left.elements * right.elements, transposeDest); + + dest.configureBuffer(left, right); + + float * leftRecord, * rightRecord, * destRecord; + + left.rewind(); + for (int i = 0; i < left.elements; i++) + { + leftRecord = left.nextRecord(); + + right.rewind(); + for (int j = 0; j < right.elements; j++) + { + rightRecord = right.nextRecord(); + destRecord = dest.nextRecord(); + + for (int k = (dest.width * dest.height) - 1; k >= 0; k--) + destRecord[k] = leftRecord[k] + rightRecord[k]; + + dest.writeRecord(); + } + } + +} Index: org_lwjgl_Math_MatrixOpAdd_MatrixOpSafe.cpp CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/win32/org_lwjgl_Math_MatrixOpAdd_MatrixOpSafe.cpp =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/native/win32/org_lwjgl_Math_MatrixOpAdd_MatrixOpSafe.cpp,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- org_lwjgl_Math_MatrixOpAdd_MatrixOpSafe.cpp 24 Aug 2002 21:16:53 -0000 1.1 +++ org_lwjgl_Math_MatrixOpAdd_MatrixOpSafe.cpp 28 Aug 2002 16:45:24 -0000 1.2 @@ -41,6 +41,7 @@ #include <windows.h> #include "org_lwjgl_Math_MatrixOpAdd_MatrixOpSafe.h" +#include "MatrixOpCommon.h" /* * Class: org_lwjgl_Math_MatrixOpAdd_MatrixOpSafe * Method: execute @@ -67,9 +68,33 @@ jboolean transposeDest ) { - float * leftSource = (float *) leftSourceAddress; - float * rightSource = (float *) rightSourceAddress; - float * dest = (float *) destAddress; + SrcMatrix left (leftSourceAddress, leftSourceStride, + leftSourceWidth, leftSourceHeight, leftElements, transposeLeftSource); + SrcMatrix right (rightSourceAddress, leftSourceStride, + rightSourceWidth, rightSourceHeight, rightElements, transposeRightSource); + DstMatrix dest (destAddress, destStride, + left.width, left.height, left.elements * right.elements, transposeDest); + + float * leftRecord, * rightRecord, * destRecord; + + left.rewind(); + for (int i = 0; i < leftElements; i++) + { + leftRecord = left.nextRecord(); + right.rewind(); + + for (int j = 0; j < rightElements; j++) + { + rightRecord = right.nextRecord(); + destRecord = dest.nextRecord(); + + for (int k = (leftSourceWidth * rightSourceWidth) - 1; k >= 0; k--) + destRecord[k] = leftRecord[k] + rightRecord[k]; + + dest.writeRecord(); + } + } + } Index: org_lwjgl_Math_MatrixOpCopy_MatrixOpDirect.cpp CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/win32/org_lwjgl_Math_MatrixOpCopy_MatrixOpDirect.cpp =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/native/win32/org_lwjgl_Math_MatrixOpCopy_MatrixOpDirect.cpp,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- org_lwjgl_Math_MatrixOpCopy_MatrixOpDirect.cpp 24 Aug 2002 21:16:53 -0000 1.1 +++ org_lwjgl_Math_MatrixOpCopy_MatrixOpDirect.cpp 28 Aug 2002 16:45:24 -0000 1.2 @@ -41,6 +41,7 @@ #include <windows.h> #include "org_lwjgl_Math_MatrixOpCopy_MatrixOpDirect.h" +#include "MatrixOpCommon.h" /* * Class: org_lwjgl_Math_MatrixOpCopy_MatrixOpDirect * Method: execute @@ -61,8 +62,29 @@ jboolean transposeDest ) { - float * source = (float *) sourceAddress; - float * dest = (float *) destAddress; + if (transposeSource == transposeDest) + { + transposeSource = false; + transposeDest = false; + } + + SrcMatrix source (sourceAddress, sourceStride, sourceWidth, sourceHeight, numElements, transposeSource); + DstMatrix dest (destAddress, destStride, source.width, source.height, source.elements, transposeDest); + + dest.configureBuffer(source); + + float * sourceRecord, * destRecord; + + for (int i = 0; i < source.elements; i++) + { + sourceRecord = source.nextRecord(); + destRecord = dest.nextRecord(); + + // just do a straight memory copy + memcpy(destRecord, sourceRecord, source.width*source.height*sizeof(jfloat)); + dest.writeRecord(); + } } + Index: org_lwjgl_Math_MatrixOpCopy_MatrixOpSafe.cpp CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/win32/org_lwjgl_Math_MatrixOpCopy_MatrixOpSafe.cpp =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/native/win32/org_lwjgl_Math_MatrixOpCopy_MatrixOpSafe.cpp,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- org_lwjgl_Math_MatrixOpCopy_MatrixOpSafe.cpp 24 Aug 2002 21:16:53 -0000 1.1 +++ org_lwjgl_Math_MatrixOpCopy_MatrixOpSafe.cpp 28 Aug 2002 16:45:24 -0000 1.2 @@ -41,6 +41,7 @@ #include <windows.h> #include "org_lwjgl_Math_MatrixOpCopy_MatrixOpSafe.h" +#include "MatrixOpCommon.h" /* * Class: org_lwjgl_Math_MatrixOpCopy_MatrixOpSafe * Method: execute @@ -61,6 +62,25 @@ jboolean transposeDest ) { - float * source = (float *) sourceAddress; - float * dest = (float *) destAddress; + // remove any unnecessary copying + if (transposeSource == transposeDest) + { + transposeSource = false; + transposeDest = false; + } + + SrcMatrix source (sourceAddress, sourceStride, sourceWidth, sourceHeight, numElements, transposeSource); + DstMatrix dest (destAddress, destStride, source.width, source.height, source.elements, transposeDest); + + float * sourceRecord, * destRecord; + + for (int i = 0; i < source.elements; i++) + { + sourceRecord = source.nextRecord(); + destRecord = dest.nextRecord(); + + // just do a straight memory copy + memcpy(destRecord, sourceRecord, source.width * source.height * sizeof(jfloat)); + dest.writeRecord(); + } } Index: org_lwjgl_Math_MatrixOpInvert_MatrixOpDirect.cpp CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/win32/org_lwjgl_Math_MatrixOpInvert_MatrixOpDirect.cpp =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/native/win32/org_lwjgl_Math_MatrixOpInvert_MatrixOpDirect.cpp,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- org_lwjgl_Math_MatrixOpInvert_MatrixOpDirect.cpp 24 Aug 2002 21:16:53 -0000 1.1 +++ org_lwjgl_Math_MatrixOpInvert_MatrixOpDirect.cpp 28 Aug 2002 16:45:24 -0000 1.2 @@ -41,6 +41,7 @@ #include <windows.h> #include "org_lwjgl_Math_MatrixOpInvert_MatrixOpDirect.h" +#include "MatrixOpCommon.h" /* * Class: org_lwjgl_Math_MatrixOpInvert_MatrixOpDirect * Method: execute @@ -61,6 +62,47 @@ jboolean transposeDest ) { - float * source = (float *) sourceAddress; - float * dest = (float *) destAddress; + // We are under the assumption that sourceWidth == sourceHeight and the matrix + // defined within is invertable + + SrcMatrix source (sourceAddress, sourceStride, + sourceWidth, sourceHeight, numElements, transposeSource); + DstMatrix dest (destAddress, destStride, + source.width, source.height, source.elements, transposeDest); + + dest.configureBuffer(source); + + float * sourceRecord, * destRecord; + + int temp_side = source.width-1; + float temp_matrix [temp_side*temp_side]; + + for (int i = 0; i < source.elements; i++) + { + sourceRecord = source.nextRecord(); + destRecord = dest.nextRecord(); + + float det = determinant(sourceRecord, sourceWidth); + float sign; + + for (int c = 0; c < source.width; c++) + { + sign = (c & 1) ? 1.0f : -1.0f; + + for (int r = 0; r < source.width; r++) + { + // get the sub matrix + subMatrix(sourceRecord, source.width, temp_matrix, c, r); + + // transpose the result + destRecord[r + c * source.width] + = (sign / det) * determinant(temp_matrix, temp_side); + + // swap signs + sign = (sign == 1) ? -1.0f : 1.0f; + } + } + + dest.writeRecord(); + } } Index: org_lwjgl_Math_MatrixOpInvert_MatrixOpSafe.cpp CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/win32/org_lwjgl_Math_MatrixOpInvert_MatrixOpSafe.cpp =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/native/win32/org_lwjgl_Math_MatrixOpInvert_MatrixOpSafe.cpp,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- org_lwjgl_Math_MatrixOpInvert_MatrixOpSafe.cpp 24 Aug 2002 21:16:53 -0000 1.1 +++ org_lwjgl_Math_MatrixOpInvert_MatrixOpSafe.cpp 28 Aug 2002 16:45:24 -0000 1.2 @@ -41,6 +41,9 @@ #include <windows.h> #include "org_lwjgl_Math_MatrixOpInvert_MatrixOpSafe.h" +#include "MatrixOpCommon.h" + + /* * Class: org_lwjgl_Math_MatrixOpInvert_MatrixOpSafe * Method: execute @@ -61,6 +64,45 @@ jboolean transposeDest ) { - float * source = (float *) sourceAddress; - float * dest = (float *) destAddress; + // We are under the assumption that sourceWidth == sourceHeight and the matrix + // defined within is invertable + + SrcMatrix source (sourceAddress, sourceStride, + sourceWidth, sourceHeight, numElements, transposeSource); + DstMatrix dest (destAddress, destStride, + source.width, source.height, source.elements, transposeDest); + + float * sourceRecord, * destRecord; + + int temp_side = source.width-1; + float temp_matrix [temp_side*temp_side]; + + for (int i = 0; i < source.elements; i++) + { + sourceRecord = source.nextRecord(); + destRecord = dest.nextRecord(); + + float det = determinant(sourceRecord, sourceWidth); + float sign; + + for (int c = 0; c < source.width; c++) + { + sign = (c & 1) ? 1.0f : -1.0f; + + for (int r = 0; r < source.width; r++) + { + // get the sub matrix + subMatrix(sourceRecord, source.width, temp_matrix, c, r); + + // transpose the result + destRecord[r + c * source.width] + = (sign / det) * determinant(temp_matrix, temp_side); + + // swap signs + sign = (sign == 1) ? -1.0f : 1.0f; + } + } + + dest.writeRecord(); + } } Index: org_lwjgl_Math_MatrixOpMultiply_MatrixOpDirect.cpp CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/win32/org_lwjgl_Math_MatrixOpMultiply_MatrixOpDirect.cpp =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/native/win32/org_lwjgl_Math_MatrixOpMultiply_MatrixOpDirect.cpp,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- org_lwjgl_Math_MatrixOpMultiply_MatrixOpDirect.cpp 24 Aug 2002 21:16:53 -0000 1.1 +++ org_lwjgl_Math_MatrixOpMultiply_MatrixOpDirect.cpp 28 Aug 2002 16:45:24 -0000 1.2 @@ -41,6 +41,8 @@ #include <windows.h> #include "org_lwjgl_Math_MatrixOpMultiply_MatrixOpDirect.h" +#include "MatrixOpCommon.h" +#include <cstring> /* * Class: org_lwjgl_Math_MatrixOpMultiply_MatrixOpDirect * Method: execute @@ -67,9 +69,55 @@ jboolean transposeDest ) { - float * leftSource = (float *) leftSourceAddress; - float * rightSource = (float *) rightSourceAddress; - float * dest = (float *) destAddress; -} + if (transposeLeftSource && transposeRightSource) + { + transposeLeftSource = false; + transposeRightSource = false; + transposeDest = !transposeDest; + } + + SrcMatrix left (leftSourceAddress, leftSourceStride, + leftSourceWidth, leftSourceHeight, leftElements, transposeLeftSource); + SrcMatrix right (rightSourceAddress, leftSourceStride, + rightSourceWidth, rightSourceHeight, rightElements, transposeRightSource); + DstMatrix dest (destAddress, destStride, + right.width, left.height, left.elements * right.elements, transposeDest); + + dest.configureBuffer(left, right); + + float * leftRecord, * rightRecord, * destRecord; + + // check out discussions envolving ordering + + + left.rewind(); + for (int i = 0; i < leftElements; i++) + { + leftRecord = left.nextRecord(); + + right.rewind(); + for (int j = 0; j < rightElements; j++) + { + rightRecord = right.nextRecord(); + destRecord = dest.nextRecord(); + + memset(destRecord, 0, dest.width * dest.height * sizeof(jfloat)); + + for (int rightCol = 0; rightCol < right.width; rightCol++) + { + for (int leftIndex = 0; leftIndex < left.width*left.height; leftIndex++) + { + destRecord[i % dest.height] += leftRecord[i] * rightRecord[i / leftSourceHeight]; + } + + rightRecord = &rightRecord[right.height]; + destRecord = &destRecord[dest.height]; + + } + dest.writeRecord(); + } + } + +} Index: org_lwjgl_Math_MatrixOpMultiply_MatrixOpSafe.cpp CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/win32/org_lwjgl_Math_MatrixOpMultiply_MatrixOpSafe.cpp =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/native/win32/org_lwjgl_Math_MatrixOpMultiply_MatrixOpSafe.cpp,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- org_lwjgl_Math_MatrixOpMultiply_MatrixOpSafe.cpp 24 Aug 2002 21:16:53 -0000 1.1 +++ org_lwjgl_Math_MatrixOpMultiply_MatrixOpSafe.cpp 28 Aug 2002 16:45:24 -0000 1.2 @@ -41,6 +41,9 @@ #include <windows.h> #include "org_lwjgl_Math_MatrixOpMultiply_MatrixOpSafe.h" +#include "MatrixOpCommon.h" +#include <cstring> + /* * Class: org_lwjgl_Math_MatrixOpMultiply_MatrixOpSafe * Method: execute @@ -67,9 +70,54 @@ jboolean transposeDest ) { - float * leftSource = (float *) leftSourceAddress; - float * rightSource = (float *) rightSourceAddress; - float * dest = (float *) destAddress; + if (transposeLeftSource && transposeRightSource) + { + transposeLeftSource = false; + transposeRightSource = false; + transposeDest = !transposeDest; + } + + + SrcMatrix left (leftSourceAddress, leftSourceStride, + leftSourceWidth, leftSourceHeight, leftElements, transposeLeftSource); + SrcMatrix right (rightSourceAddress, leftSourceStride, + rightSourceWidth, rightSourceHeight, rightElements, transposeRightSource); + DstMatrix dest (destAddress, destStride, + right.width, left.height, left.elements * right.elements, transposeDest); + + float * leftRecord, * rightRecord, * destRecord; + + // check out discussions envolving ordering + + + left.rewind(); + for (int i = 0; i < leftElements; i++) + { + leftRecord = left.nextRecord(); + + right.rewind(); + for (int j = 0; j < rightElements; j++) + { + rightRecord = right.nextRecord(); + destRecord = dest.nextRecord(); + + memset(destRecord, 0, dest.width * dest.height * sizeof(jfloat)); + + for (int rightCol = 0; rightCol < right.width; rightCol++) + { + for (int leftIndex = 0; leftIndex < left.width*left.height; leftIndex++) + { + destRecord[i % dest.height] += leftRecord[i] * rightRecord[i / leftSourceHeight]; + } + + rightRecord = &rightRecord[right.height]; + destRecord = &destRecord[dest.height]; + + } + dest.writeRecord(); + } + } + } Index: org_lwjgl_Math_MatrixOpNegate_MatrixOpDirect.cpp CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/win32/org_lwjgl_Math_MatrixOpNegate_MatrixOpDirect.cpp =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/native/win32/org_lwjgl_Math_MatrixOpNegate_MatrixOpDirect.cpp,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- org_lwjgl_Math_MatrixOpNegate_MatrixOpDirect.cpp 24 Aug 2002 21:16:53 -0000 1.1 +++ org_lwjgl_Math_MatrixOpNegate_MatrixOpDirect.cpp 28 Aug 2002 16:45:24 -0000 1.2 @@ -41,6 +41,7 @@ #include <windows.h> #include "org_lwjgl_Math_MatrixOpNegate_MatrixOpDirect.h" +#include "MatrixOpCommon.h" /* * Class: org_lwjgl_Math_MatrixOpNegate_MatrixOpDirect * Method: execute @@ -61,6 +62,25 @@ jboolean transposeDest ) { - float * source = (float *) sourceAddress; - float * dest = (float *) destAddress; + SrcMatrix source (sourceAddress, sourceStride, sourceWidth, sourceHeight, numElements, transposeSource); + DstMatrix dest (destAddress, destStride, source.width, source.height, numElements, transposeDest); + + dest.configureBuffer(source); + + int * sourceRecord, * destRecord; + + for (int i = 0; i < source.elements; i++) + { + sourceRecord = (int *) source.nextRecord(); + destRecord = (int *) dest.nextRecord(); + + // we can cheat and use the less expensive xor + // to switch the sign bit of the float + // single precision format 1 - sign 8 - exponent (excess 127) 23 - mantisa + + for (int j = 0; j < sourceWidth*sourceHeight; j++) + destRecord[j] = sourceRecord[j] ^ 0x80000000; + + dest.writeRecord(); + } } Index: org_lwjgl_Math_MatrixOpNegate_MatrixOpSafe.cpp CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/win32/org_lwjgl_Math_MatrixOpNegate_MatrixOpSafe.cpp =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/native/win32/org_lwjgl_Math_MatrixOpNegate_MatrixOpSafe.cpp,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- org_lwjgl_Math_MatrixOpNegate_MatrixOpSafe.cpp 24 Aug 2002 21:16:53 -0000 1.1 +++ org_lwjgl_Math_MatrixOpNegate_MatrixOpSafe.cpp 28 Aug 2002 16:45:24 -0000 1.2 @@ -41,6 +41,7 @@ #include <windows.h> #include "org_lwjgl_Math_MatrixOpNegate_MatrixOpSafe.h" +#include "MatrixOpCommon.h" /* * Class: org_lwjgl_Math_MatrixOpNegate_MatrixOpSafe * Method: execute @@ -61,6 +62,23 @@ jboolean transposeDest ) { - float * source = (float *) sourceAddress; - float * dest = (float *) destAddress; + SrcMatrix source (sourceAddress, sourceStride, sourceWidth, sourceHeight, numElements, transposeSource); + DstMatrix dest (destAddress, destStride, source.width, source.height, numElements, transposeDest); + + int * sourceRecord, * destRecord; + + for (int i = 0; i < source.elements; i++) + { + sourceRecord = (int *) source.nextRecord(); + destRecord = (int *) dest.nextRecord(); + + // we can cheat and use the less expensive xor + // to switch the sign bit of the float + // single precision format 1 - sign 8 - exponent (excess 127) 23 - mantisa + + for (int j = 0; j < sourceWidth*sourceHeight; j++) + destRecord[j] = sourceRecord[j] ^ 0x80000000; + + dest.writeRecord(); + } } Index: org_lwjgl_Math_MatrixOpNormalise_MatrixOpDirect.cpp CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/win32/org_lwjgl_Math_MatrixOpNormalise_MatrixOpDirect.cpp =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/native/win32/org_lwjgl_Math_MatrixOpNormalise_MatrixOpDirect.cpp,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- org_lwjgl_Math_MatrixOpNormalise_MatrixOpDirect.cpp 24 Aug 2002 21:16:53 -0000 1.1 +++ org_lwjgl_Math_MatrixOpNormalise_MatrixOpDirect.cpp 28 Aug 2002 16:45:24 -0000 1.2 @@ -41,6 +41,11 @@ #include <windows.h> #include "org_lwjgl_Math_MatrixOpNormalise_MatrixOpDirect.h" +#include "MatrixOpCommon.h" +#include <cmath> + +using namespace std; + /* * Class: org_lwjgl_Math_MatrixOpNormalise_MatrixOpDirect * Method: execute @@ -61,6 +66,32 @@ jboolean transposeDest ) { - float * source = (float *) sourceAddress; - float * dest = (float *) destAddress; + SrcMatrix source (sourceAddress, sourceStride, sourceWidth, sourceHeight, numElements, transposeSource); + DstMatrix dest (destAddress, destStride, source.width, source.height, source.elements, transposeDest); + + dest.configureBuffer(source); + + float * sourceRecord, * destRecord; + float magnitude, magnitude_squared; + + int i; + register int j; + + for (i = 0; i < source.elements; i++) + { + + magnitude_squared = 0; + sourceRecord = source.nextRecord(); + destRecord = dest.nextRecord(); + + for (j = 0 ; j < sourceWidth*sourceHeight; i++) + magnitude_squared += sourceRecord[j] * sourceRecord[j]; + + magnitude = (float) sqrt((double) magnitude_squared); + + for (j = 0; j < sourceWidth*sourceHeight; i++) + destRecord[j] = sourceRecord[j] / magnitude; + + dest.writeRecord(); + } } Index: org_lwjgl_Math_MatrixOpNormalise_MatrixOpSafe.cpp CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/win32/org_lwjgl_Math_MatrixOpNormalise_MatrixOpSafe.cpp =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/native/win32/org_lwjgl_Math_MatrixOpNormalise_MatrixOpSafe.cpp,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- org_lwjgl_Math_MatrixOpNormalise_MatrixOpSafe.cpp 24 Aug 2002 21:16:53 -0000 1.1 +++ org_lwjgl_Math_MatrixOpNormalise_MatrixOpSafe.cpp 28 Aug 2002 16:45:24 -0000 1.2 @@ -41,6 +41,11 @@ #include <windows.h> #include "org_lwjgl_Math_MatrixOpSubtract_MatrixOpSafe.h" +#include "MatrixOpCommon.h" +#include <cmath> + +using namespace std; + /* * Class: org_lwjgl_Math_MatrixOpNormalise_MatrixOpSafe * Method: execute @@ -61,6 +66,30 @@ jboolean transposeDest ) { - float * source = (float *) sourceAddress; - float * dest = (float *) destAddress; + SrcMatrix source (sourceAddress, sourceStride, sourceWidth, sourceHeight, numElements, transposeSource); + DstMatrix dest (destAddress, destStride, source.width, source.height, source.elements, transposeDest); + + float * sourceRecord, * destRecord; + float magnitude, magnitude_squared; + + int i; + register int j; + + for (i = 0; i < source.elements; i++) + { + + magnitude_squared = 0; + sourceRecord = source.nextRecord(); + destRecord = dest.nextRecord(); + + for (j = 0 ; j < sourceWidth*sourceHeight; i++) + magnitude_squared += sourceRecord[j] * sourceRecord[j]; + + magnitude = (float) sqrt((double) magnitude_squared); + + for (j = 0; j < sourceWidth*sourceHeight; i++) + destRecord[j] = sourceRecord[j] / magnitude; + + dest.writeRecord(); + } } Index: org_lwjgl_Math_MatrixOpSubtract_MatrixOpDirect.cpp CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/win32/org_lwjgl_Math_MatrixOpSubtract_MatrixOpDirect.cpp =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/native/win32/org_lwjgl_Math_MatrixOpSubtract_MatrixOpDirect.cpp,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- org_lwjgl_Math_MatrixOpSubtract_MatrixOpDirect.cpp 24 Aug 2002 21:16:53 -0000 1.1 +++ org_lwjgl_Math_MatrixOpSubtract_MatrixOpDirect.cpp 28 Aug 2002 16:45:24 -0000 1.2 @@ -41,6 +41,7 @@ #include <windows.h> #include "org_lwjgl_Math_MatrixOpSubtract_MatrixOpDirect.h" +#include "MatrixOpCommon.h" /* * Class: org_lwjgl_Math_MatrixOpSubtract_MatrixOpDirect * Method: execute @@ -67,9 +68,41 @@ jboolean transposeDest ) { - float * leftSource = (float *) leftSourceAddress; - float * rightSource = (float *) rightSourceAddress; - float * dest = (float *) destAddress; + if (transposeLeftSource && transposeRightSource) + { + transposeLeftSource = false; + transposeRightSource = false; + transposeDest = !transposeDest; + } + + SrcMatrix left (leftSourceAddress, leftSourceStride, + leftSourceWidth, leftSourceHeight, leftElements, transposeLeftSource); + SrcMatrix right (rightSourceAddress, leftSourceStride, + rightSourceWidth, rightSourceHeight, rightElements, transposeRightSource); + DstMatrix dest (destAddress, destStride, + left.width, left.height, left.elements * right.elements, transposeDest); + + dest.configureBuffer(left, right); + + float * leftRecord, * rightRecord, * destRecord; + + left.rewind(); + for (int i = 0; i < left.elements; i++) + { + leftRecord = left.nextRecord(); + + right.rewind(); + for (int j = 0; j < right.elements; j++) + { + rightRecord = right.nextRecord(); + destRecord = dest.nextRecord(); + + for (int k = (left.width * left.height) - 1; k >= 0; k--) + destRecord[k] = leftRecord[k] - rightRecord[k]; + + dest.writeRecord(); + } + } } Index: org_lwjgl_Math_MatrixOpSubtract_MatrixOpSafe.cpp CVS Browser: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/java-game-lib/LWJGL/src/native/win32/org_lwjgl_Math_MatrixOpSubtract_MatrixOpSafe.cpp =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/native/win32/org_lwjgl_Math_MatrixOpSubtract_MatrixOpSafe.cpp,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- org_lwjgl_Math_MatrixOpSubtract_MatrixOpSafe.cpp 24 Aug 2002 21:16:53 -0000 1.1 +++ org_lwjgl_Math_MatrixOpSubtract_MatrixOpSafe.cpp 28 Aug 2002 16:45:24 -0000 1.2 @@ -41,6 +41,8 @@ #include <windows.h> #include "org_lwjgl_Math_MatrixOpSubtract_MatrixOpSafe.h" +#include "MatrixOpCommon.h" + /* * Class: org_lwjgl_Math_MatrixOpSubtract_MatrixOpSafe * Method: execute @@ -67,9 +69,40 @@ jboolean transposeDest ) { - float * leftSource = (float *) leftSourceAddress; - float * rightSource = (float *) rightSourceAddress; - float * dest = (float *) destAddress; + if (transposeLeftSource && transposeRightSource) + { + transposeLeftSource = false; + transposeRightSource = false; + transposeDest = !transposeDest; + } + + SrcMatrix left (leftSourceAddress, leftSourceStride, + leftSourceWidth, leftSourceHeight, leftElements, transposeLeftSource); + SrcMatrix right (rightSourceAddress, leftSourceStride, + rightSourceWidth, rightSourceHeight, rightElements, transposeRightSource); + DstMatrix dest (destAddress, destStride, + left.width, left.height, left.elements * right.elements, transposeDest); + + float * leftRecord, * rightRecord, * destRecord; + + left.rewind(); + for (int i = 0; i < left.elements; i++) + { + leftRecord = left.nextRecord(); + + right.rewind(); + for (int j = 0; j < right.elements; j++) + { + rightRecord = right.nextRecord(); + destRecord = dest.nextRecord(); + + for (int k = (left.width * left.height) - 1; k >= 0; k--) + destRecord[k] = leftRecord[k] - rightRecord[k]; + + dest.writeRecord(); + } + } } + |