sanyaade-g2g-repos / quimeraengine

Automatically exported from code.google.com/p/quimeraengine
0 stars 1 forks source link

Refactoring de Math para aplicar rediseño enfocado a optimización #243

Closed GoogleCodeExporter closed 8 years ago

GoogleCodeExporter commented 8 years ago
Tal y como han demostrado las últimas pruebas (ver SpeedTest en la carpeta 
team), el actual diseño consistente en el uso de parámetros de salida para 
obtener resultados de una operación sobre un objeto evita que se apliquen 
optimizaciones (concretamente NRVO, disponible en la mayoría de los 
compiladores) de velocidad, lo que supone diferencias de hasta un 3000%, según 
el caso.

Es por tanto necesario realizar las modificaciones necesarias para cambiar las 
firmas de las funciones de manera que se aprovechen las citadas optimizaciones.

Ejemplo de modificación:

void QVector3::CrossProduct(const QBaseVector3& vVector);
void QVector3::CrossProduct(const QBaseVector3& vVector, QBaseVector3& 
vOutVector);

Quedaría:

QVector3 QVector3::CrossProduct(const QBaseVector3& vVector);

Evidentemente esto incluye las modificaciones internas pertinentes enfocadas al 
mismo propósito.

Original issue reported on code.google.com by Lince3D@gmail.com on 14 Feb 2012 at 7:19

GoogleCodeExporter commented 8 years ago

Original comment by Lince3D@gmail.com on 14 Feb 2012 at 7:19

GoogleCodeExporter commented 8 years ago

Original comment by Lince3D@gmail.com on 16 Feb 2012 at 7:28

GoogleCodeExporter commented 8 years ago
QDualQuaternion.h

Método DoubleConjugate:
la segunda componente que se devuelve debe ser "d.Conjugate() * SQFloat::_1", 
no "r...".

QLineSegment2D.h

Método Scale(QBaseVector2)
Te falta el return *this;

QLineSegment3D.h

Método Translate(QTranslationMatrix4x4)
Te falta el return *this;

QQuaternion.h

Método Normalize
Igual se podría hacer
const float_q& fInvLength = SQFloat::_1/fLength;
y ahorrarnos 4 divisiones?

QQuaternion.cpp

Método Slerp:
Algunas constantes habría que ponerles el & (fAngleB, FInvSin,fWeight...) 
¿no? En este método y en UnitSlerp a unas se las pones que no las tenían 
pero a otras que las tenían se las quitas. Como supongo que será por algo, 
explica :)

Resto correcto.

Original comment by jwl...@gmail.com on 16 Feb 2012 at 9:27

GoogleCodeExporter commented 8 years ago
Parche II

QPlane.h

ScaleWithPivot(V3, v3)
Falta return *this;

ScaleWithPivot(V3, v4)
Falta return *this;

QRay2D.h

Reflection
¿No debería devolver un ray2D en vez de un parámetro de salida?

 bool Intersection(const QBaseRay<VectorType, QVector3> &ray) const
En el segundo producto vectorial se te olvidó quitar el parámetro de salida.
 QVector3 vCross = this->Direction.CrossProduct(ray.Direction, vCross);

inline bool Contains(const VectorType &vPoint) const
Parametro de salida
QVector3 vCross = vAux.Direction.CrossProduct(this->Direction, vCross); // 
Calculates cross product to check if both vectors are parallel

Ver comentarios adicionales en el foro.

Original comment by jwl...@gmail.com on 19 Feb 2012 at 10:07

GoogleCodeExporter commented 8 years ago
Parche III

* QSphere.h

inline QSphere& ScaleWithPivot(const VectorType &vScale, const float_q 
&fRadiusScale, const VectorType &vPivot)

Falta documentación de return

inline QSphere& RotateWithPivot(const QRotationMatrix3x3 &rotation, const 
VectorType &vPivot)

Falta documentación de return

* QTransformationMatrix3x3.h

inline QTransformationMatrix3x3 SwitchHandConvention()

El método sería const.

* QTriangle2D.h

inline QVector2 GetCircumcenter() const
Sobra documentacion de vCircumcenter

inline QVector2 GetOrthocenter() const
Sobra documentacion de vOrthocenter

* QVector3.h

QVector3& Transform(const QTransformationMatrix<QMatrix4x3> &transformation);
Falta documentación de return.

* QVector4.h

inline QVector4 Homogenize() const

No estoy seguro de que deba haber un assert aquí. Quizás baste simplemente 
con no hacer nada si w=0.

* QSpaceConversioMatrix.cpp

void QSpaceConversionMatrix::SetViewSpaceMatrix(const QVector4 &vPointOfView, 
const QVector4 &vTarget, const QVector4 &vUpDirection)
{
    this->SetViewSpaceMatrix(QVector3(vPointOfView.x, vPointOfView.y, vPointOfView.z),
                             QVector3(vTarget.x, vTarget.y, vTarget.z),
                             QVector3(vUpDirection.x, vUpDirection.y, vUpDirection.z));
}

Hay un constructor de QVector3 desde un QBaseVector4, igual vale para abreviar.

Original comment by jwl...@gmail.com on 22 Feb 2012 at 9:47

GoogleCodeExporter commented 8 years ago

Original comment by Lince3D@gmail.com on 23 Feb 2012 at 8:20

GoogleCodeExporter commented 8 years ago
Refactorizando métodos de transformación.

Original comment by Lince3D@gmail.com on 23 Feb 2012 at 8:21

GoogleCodeExporter commented 8 years ago

Original comment by Lince3D@gmail.com on 26 Feb 2012 at 7:25

GoogleCodeExporter commented 8 years ago
Parche IV

* QLineSegment3D.h

Transform (QSpaceConversionMatrix)

Documentación: has puesto "converted" en vez de "transformed", como vienes 
haciendo.

Transform (QDualQuaternion), 

Documentación: has puesto "converted" en vez de "transformed", como vienes 
haciendo.

this->.A.Transform (te sobra un punto a la izda de A)

* QRay3D.h

Scale (QBaseVector3), (float_q, ...)
ScaleWithPivot (QBaseVector3), (float_q, ...)

Has puesto auxRay.Origine

Por lo demás correcto, la paso a DONE.

Original comment by jwl...@gmail.com on 27 Feb 2012 at 10:00