xform.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:3k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file xform.cpp
  3.  *
  4.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  5.  * 
  6.  * Copyright (c) 2001-2010, Linden Research, Inc.
  7.  * 
  8.  * Second Life Viewer Source Code
  9.  * The source code in this file ("Source Code") is provided by Linden Lab
  10.  * to you under the terms of the GNU General Public License, version 2.0
  11.  * ("GPL"), unless you have obtained a separate licensing agreement
  12.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  13.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  14.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  15.  * 
  16.  * There are special exceptions to the terms and conditions of the GPL as
  17.  * it is applied to this Source Code. View the full text of the exception
  18.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  19.  * online at
  20.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  21.  * 
  22.  * By copying, modifying or distributing this software, you acknowledge
  23.  * that you have read and understood your obligations described above,
  24.  * and agree to abide by those obligations.
  25.  * 
  26.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  27.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  28.  * COMPLETENESS OR PERFORMANCE.
  29.  * $/LicenseInfo$
  30.  */
  31. #include "linden_common.h"
  32. #include "xform.h"
  33. LLXform::LLXform()
  34. {
  35. init();
  36. }
  37. LLXform::~LLXform()
  38. {
  39. }
  40. // Link optimization - don't inline these llwarns
  41. void LLXform::warn(const char* const msg)
  42. {
  43. llwarns << msg << llendl;
  44. }
  45. LLXform* LLXform::getRoot() const
  46. {
  47. const LLXform* root = this;
  48. while(root->mParent)
  49. {
  50. root = root->mParent;
  51. }
  52. return (LLXform*)root;
  53. }
  54. BOOL LLXform::isRoot() const
  55. {
  56. return (!mParent);
  57. }
  58. BOOL LLXform::isRootEdit() const
  59. {
  60. return (!mParent);
  61. }
  62. LLXformMatrix::~LLXformMatrix()
  63. {
  64. }
  65. void LLXformMatrix::update()
  66. {
  67. if (mParent) 
  68. {
  69. mWorldPosition = mPosition;
  70. if (mParent->getScaleChildOffset())
  71. {
  72. mWorldPosition.scaleVec(mParent->getScale());
  73. }
  74. mWorldPosition *= mParent->getWorldRotation();
  75. mWorldPosition += mParent->getWorldPosition();
  76. mWorldRotation = mRotation * mParent->getWorldRotation();
  77. }
  78. else
  79. {
  80. mWorldPosition = mPosition;
  81. mWorldRotation = mRotation;
  82. }
  83. }
  84. void LLXformMatrix::updateMatrix(BOOL update_bounds)
  85. {
  86. update();
  87. mWorldMatrix.initAll(mScale, mWorldRotation, mWorldPosition);
  88. if (update_bounds && (mChanged & MOVED))
  89. {
  90. mMin.mV[0] = mMax.mV[0] = mWorldMatrix.mMatrix[3][0];
  91. mMin.mV[1] = mMax.mV[1] = mWorldMatrix.mMatrix[3][1];
  92. mMin.mV[2] = mMax.mV[2] = mWorldMatrix.mMatrix[3][2];
  93. F32 f0 = (fabs(mWorldMatrix.mMatrix[0][0])+fabs(mWorldMatrix.mMatrix[1][0])+fabs(mWorldMatrix.mMatrix[2][0])) * 0.5f;
  94. F32 f1 = (fabs(mWorldMatrix.mMatrix[0][1])+fabs(mWorldMatrix.mMatrix[1][1])+fabs(mWorldMatrix.mMatrix[2][1])) * 0.5f;
  95. F32 f2 = (fabs(mWorldMatrix.mMatrix[0][2])+fabs(mWorldMatrix.mMatrix[1][2])+fabs(mWorldMatrix.mMatrix[2][2])) * 0.5f;
  96. mMin.mV[0] -= f0; 
  97. mMin.mV[1] -= f1; 
  98. mMin.mV[2] -= f2; 
  99. mMax.mV[0] += f0; 
  100. mMax.mV[1] += f1; 
  101. mMax.mV[2] += f2; 
  102. }
  103. }
  104. void LLXformMatrix::getMinMax(LLVector3& min, LLVector3& max) const
  105. {
  106. min = mMin;
  107. max = mMax;
  108. }