Main Page | Namespace List | Class Hierarchy | Alphabetical List | Compound List | File List | Namespace Members | Compound Members | File Members

# Mesh.h

Go to the documentation of this file.

    00001 //------------------------------------------------------------------------------
    00002 // Lamp : Open source game middleware
    00003 // Copyright (C) 2004  Junpei Ohtani ( Email : junpee@users.sourceforge.jp )
    00004 //
    00005 // This library is free software; you can redistribute it and/or
    00006 // modify it under the terms of the GNU Lesser General Public
    00007 // License as published by the Free Software Foundation; either
    00008 // version 2.1 of the License, or (at your option) any later version.
    00009 //
    00010 // This library is distributed in the hope that it will be useful,
    00011 // but WITHOUT ANY WARRANTY; without even the implied warranty of
    00012 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    00013 // Lesser General Public License for more details.
    00014 //
    00015 // You should have received a copy of the GNU Lesser General Public
    00016 // License along with this library; if not, write to the Free Software
    00017 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    00018 //------------------------------------------------------------------------------
    00019
    00020 /** @file
    00021  * メッシュヘッダ
    00022  * @author Junpee
    00023  */
    00024
    00025 #ifndef MESH_H_
    00026 #define MESH_H_
    00027
    00028 #include <Graphics/Scene/SceneObject.h>
    00029 #include <Graphics/System/GraphicsDeviceObjectHolder.h>
    00030 #include <Core/Container/ArrayList.h>
    00031
    00032 namespace Lamp{
    00033
    00034 class Model;
    00035 class MeshData;
    00036 class Material;
    00037 class RigidMesh;
    00038 class CharacterMesh;
    00039
    00040 //------------------------------------------------------------------------------
    00041 /**
    00042  * メッシュ
    00043  */
    00044 class Mesh : public SceneObject , public GraphicsDeviceObjectHolder{
    00045 friend class SceneObjectManagerTemplate<Mesh>;
    00046 friend class Renderer;
    00047 friend class MeshManager;
    00048 friend class Model;
    00049 friend class Shader;
    00050 friend class FixedShader;
    00051 public:
    00052     /**
    00053      * リファレンスカウントの取得
    00054      * @return リファレンスカウント
    00055      */
    00056     virtual int getReferenceCount() const{
    00057         if(parent_ != NULL){ return 1; }
    00058         return 0;
    00059     }
    00060
    00061     //--------------------------------------------------------------------------
    00062     /**
    00063      * コピー
    00064      * @param copyMask コピーマスク
    00065      * @return コピーされたメッシュ
    00066      */
    00067     virtual Mesh* copy(u_int copyMask = 0) const = 0;
    00068
    00069     /**
    00070      * 再帰的破棄
    00071      * @param mesh 破棄するメッシュ
    00072      * @return 破棄したオブジェクト数
    00073      */
    00074     static int recursiveDestroy(Mesh* mesh);
    00075
    00076     //--------------------------------------------------------------------------
    00077     /**
    00078      * 親の取得
    00079      * @return 親
    00080      */
    00081     virtual Model* getParent() const{ return parent_; }
    00082
    00083     //--------------------------------------------------------------------------
    00084     /**
    00085      * グローバルでスケールを使用しているか
    00086      * @return グローバルでスケールを使用しているならtrue
    00087      */
    00088     virtual bool isGlobalScaled() const{ return globalScaled_; }
    00089
    00090     /**
    00091      * 法線の正規化を必要とするか
    00092      * @return 法線の正規化を必要とするならtrue
    00093      */
    00094     virtual bool requireNormalize() const{ return false; }
    00095
    00096     //--------------------------------------------------------------------------
    00097     // バウンディングスフィア
    00098     //--------------------------------------------------------------------------
    00099     /**
    00100      * バウンディングスフィアの設定
    00101      * @param boundingSphere 設定するバウンディングスフィア
    00102      */
    00103     virtual void setBoundingSphere(const Sphere& boundingSphere);
    00104
    00105     /**
    00106      * バウンディングスフィアの取得
    00107      * @return バウンディングスフィア
    00108      */
    00109     virtual const Sphere& getBoundingSphere() const;
    00110
    00111     /**
    00112      * ワールドバウンディングスフィアの取得
    00113      * @return ワールドバウンディングスフィア
    00114      */
    00115     virtual const Sphere& getWorldBoundingSphere() const{
    00116         return worldBoundingSphere_;
    00117     }
    00118
    00119     //--------------------------------------------------------------------------
    00120     // バウンディングボックス
    00121     //--------------------------------------------------------------------------
    00122     /**
    00123      * バウンディングボックスの設定
    00124      * @param boundingBox 設定するバウンディングボックス
    00125      */
    00126     virtual void setBoundingBox(const AxisAlignedBox& boundingBox);
    00127
    00128     /**
    00129      * バウンディングボックスの取得
    00130      * @return バウンディングボックス
    00131      */
    00132     virtual const AxisAlignedBox& getBoundingBox() const;
    00133
    00134     /**
    00135      * ワールドバウンディングボックスの取得
    00136      * @return ワールドバウンディングボックス
    00137      */
    00138     virtual const AxisAlignedBox& getWorldBoundingBox() const{
    00139         return worldBoundingBox_;
    00140     }
    00141
    00142     //--------------------------------------------------------------------------
    00143     // 中心
    00144     //--------------------------------------------------------------------------
    00145     /**
    00146      * 中心の取得
    00147      * @return 中心
    00148      */
    00149     virtual const Vector3& getCenter() const;
    00150
    00151     /**
    00152      * ワールド中心の取得
    00153      * @return ワールド中心
    00154      */
    00155     virtual const Vector3& getWorldCenter() const{
    00156         return worldBoundingSphere_.getCenter();
    00157     }
    00158
    00159     //--------------------------------------------------------------------------
    00160     /**
    00161      * 有効、無効の設定
    00162      * @param enabled trueなら有効、falseなら無効
    00163      */
    00164     virtual void setEnabled(bool enabled){ enabled_ = enabled; }
    00165
    00166     /**
    00167      * 有効、無効の取得
    00168      * @return trueなら有効、falseなら無効
    00169      */
    00170     virtual bool isEnabled() const{ return enabled_; }
    00171
    00172     /**
    00173      * グローバルでの有効、無効の取得
    00174      * @return trueなら有効、falseなら無効
    00175      */
    00176     virtual bool isGlobalEnabled() const{ return globalEnabled_; }
    00177
    00178     //--------------------------------------------------------------------------
    00179     // メッシュデータインターフェース
    00180     //--------------------------------------------------------------------------
    00181     /**
    00182      * メッシュデータの設定
    00183      * @param meshData 設定するメッシュデータ
    00184      */
    00185     virtual void setMeshData(MeshData* meshData);
    00186
    00187     /**
    00188      * メッシュデータの取得
    00189      * @return メッシュデータ
    00190      */
    00191     virtual MeshData* getMeshData() const{ return meshData_; }
    00192
    00193     /**
    00194      * メッシュデータの削除
    00195      */
    00196     virtual void removeMeshData(){ setMeshData(NULL); }
    00197
    00198     //--------------------------------------------------------------------------
    00199     // マテリアルインターフェース
    00200     //--------------------------------------------------------------------------
    00201     /**
    00202      * マテリアルの設定
    00203      * @param material 設定するマテリアル
    00204      */
    00205     virtual void setMaterial(Material* material);
    00206
    00207     /**
    00208      * マテリアルの取得
    00209      * @return マテリアル
    00210      */
    00211     virtual Material* getMaterial() const{ return material_; }
    00212
    00213     /**
    00214      * マテリアルの削除
    00215      */
    00216     virtual void removeMaterial(){ setMaterial(NULL); }
    00217
    00218     //--------------------------------------------------------------------------
    00219     // プリミティブタイプ
    00220     //--------------------------------------------------------------------------
    00221     /// プリミティブタイプ
    00222     enum PrimitiveType{
    00223         /// トライアングルリスト
    00224         triangleList = 0,
    00225         /// インデックストライアングルリスト
    00226         indexedTriangleList,
    00227         /// プリミティブタイプ最大値
    00228         ptMax,
    00229     };
    00230
    00231     /**
    00232      * プリミティブタイプがインデックスを持つかどうか
    00233      * @param primitiveType プリミティブタイプ
    00234      * @return プリミティブタイプがインデックスを持つならtrue
    00235      */
    00236     static bool primitiveTypeHasIndex(PrimitiveType primitiveType);
    00237
    00238     /**
    00239      * プリミティブタイプから文字列への変換
    00240      * @param primitiveType プリミティブタイプ
    00241      * @return プリミティブタイプ文字列
    00242      */
    00243     static String primitiveTypeToString(PrimitiveType primitiveType);
    00244
    00245     /**
    00246      * 文字列からプリミティブタイプへの変換
    00247      * @param primitiveTypeString プリミティブタイプ文字列
    00248      * @return プリミティブタイプ
    00249      */
    00250     static PrimitiveType primitiveTypeFromString(
    00251         const String& primitiveTypeString);
    00252
    00253     //--------------------------------------------------------------------------
    00254     // メッシュインターフェース
    00255     //--------------------------------------------------------------------------
    00256     /**
    00257      * プリミティブタイプの設定
    00258      * @param primitiveType プリミティブタイプ
    00259      */
    00260     virtual void setPrimitiveType(Mesh::PrimitiveType primitiveType);
    00261
    00262     /**
    00263      * プリミティブタイプの取得
    00264      * @return プリミティブタイプ
    00265      */
    00266     virtual Mesh::PrimitiveType getPrimitiveType() const;
    00267
    00268     /**
    00269      * プリミティブカウントの取得
    00270      * @return プリミティブカウント
    00271      */
    00272     virtual int getPrimitiveCount() const;
    00273
    00274     /**
    00275      * 三角の取得
    00276      * @param index プリミティブインデックス
    00277      * @return 三角
    00278      */
    00279     virtual Triangle getTriangle(int index) const;
    00280
    00281     //--------------------------------------------------------------------------
    00282     /**
    00283      * 頂点インデックスを持つかどうか
    00284      * @return 頂点インデックスを持つならtrue
    00285      */
    00286     virtual bool hasVertexIndices() const;
    00287
    00288     /**
    00289      * 頂点インデックス数の設定
    00290      * @param vertexIndexCount 頂点インデックス数
    00291      */
    00292     virtual void setVertexIndexCount(int vertexIndexCount);
    00293
    00294     /**
    00295      * 頂点インデックス数の取得
    00296      * @return 頂点インデックス数
    00297      */
    00298     virtual int getVertexIndexCount() const;
    00299
    00300     /**
    00301      * 頂点インデックスの設定
    00302      * @param index インデックス
    00303      * @param vertexIndex 頂点インデックス
    00304      */
    00305     virtual void setVertexIndex(int index, int vertexIndex);
    00306
    00307     /**
    00308      * 頂点インデックスの取得
    00309      * @param index インデックス
    00310      * @return 頂点インデックス
    00311      */
    00312     virtual int getVertexIndex(int index) const;
    00313
    00314     /**
    00315      * 頂点インデックス配列の取得
    00316      * @return 頂点インデックス配列
    00317      */
    00318     virtual const u_short* getVertexIndexArray();
    00319
    00320     //--------------------------------------------------------------------------
    00321     /**
    00322      * 頂点数の設定
    00323      * @param vertexCount 頂点数
    00324      */
    00325     virtual void setVertexCount(int vertexCount);
    00326
    00327     /**
    00328      * 頂点数の取得
    00329      * @return 頂点数
    00330      */
    00331     virtual int getVertexCount() const;
    00332
    00333     //--------------------------------------------------------------------------
    00334     /**
    00335      * 位置の設定
    00336      * @param index インデックス
    00337      * @param position 位置
    00338      */
    00339     virtual void setPosition(int index, const Vector3& position);
    00340
    00341     /**
    00342      * 位置の取得
    00343      * @param index インデックス
    00344      * @return 位置
    00345      */
    00346     virtual const Vector3& getPosition(int index) const;
    00347
    00348     /**
    00349      * 位置配列の取得
    00350      * @return 位置配列
    00351      */
    00352     virtual const Vector3* getPositionArray() const;
    00353
    00354     //--------------------------------------------------------------------------
    00355     /**
    00356      * 法線を有効にするかどうか
    00357      * @param normalFlag trueなら法線が有効になる
    00358      */
    00359     virtual void enableNormal(bool normalFlag);
    00360
    00361     /**
    00362      * 法線が有効かどうか
    00363      * @return 法線が有効ならtrue
    00364      */
    00365     virtual bool hasNormal() const;
    00366
    00367     /**
    00368      * 法線の設定
    00369      * @param index インデックス
    00370      * @param normal 法線
    00371      */
    00372     virtual void setNormal(int index, const Vector3& normal);
    00373
    00374     /**
    00375      * 法線の取得
    00376      * @param index インデックス
    00377      * @return 法線
    00378      */
    00379     virtual const Vector3& getNormal(int index) const;
    00380
    00381     /**
    00382      * 法線配列の取得
    00383      * @return 法線配列
    00384      */
    00385     virtual const Vector3* getNormalArray() const;
    00386
    00387     //--------------------------------------------------------------------------
    00388     /**
    00389      * カラーを有効にするかどうか
    00390      * @param colorFlag trueならカラーが有効になる
    00391      */
    00392     virtual void enableColor(bool colorFlag);
    00393
    00394     /**
    00395      * カラーが有効かどうか
    00396      * @return カラーが有効ならtrue
    00397      */
    00398     virtual bool hasColor() const;
    00399
    00400     /**
    00401      * カラーの設定
    00402      * @param index インデックス
    00403      * @param color カラー
    00404      */
    00405     virtual void setColor(int index, const Color4c& color);
    00406
    00407     /**
    00408      * カラーの取得
    00409      * @param index インデックス
    00410      * @return カラー
    00411      */
    00412     virtual const Color4c& getColor(int index) const;
    00413
    00414     /**
    00415      * カラー配列の取得
    00416      * @return カラー配列
    00417      */
    00418     virtual const Color4c* getColorArray() const;
    00419
    00420     //--------------------------------------------------------------------------
    00421     /**
    00422      * テクスチャ座標セット数の設定
    00423      * @param texCoordSetCount テクスチャ座標セット数
    00424      */
    00425     virtual void setTexCoordSetCount(int texCoordSetCount);
    00426
    00427     /**
    00428      * テクスチャ座標セット数の設定
    00429      * @return テクスチャ座標セット数
    00430      */
    00431     virtual int getTexCoordSetCount() const;
    00432
    00433     //--------------------------------------------------------------------------
    00434     /**
    00435      * テクスチャ座標タイプの設定
    00436      * @param texCoordSet テクスチャ座標セット
    00437      * @param texCoordType テクスチャ座標タイプ
    00438      */
    00439     virtual void setTexCoordType(int texCoordSet, TexCoord::Type texCoordType);
    00440
    00441     /**
    00442      * テクスチャ座標タイプの取得
    00443      * @param texCoordSet テクスチャ座標セット
    00444      * @return テクスチャ座標タイプ
    00445      */
    00446     virtual TexCoord::Type getTexCoordType(int texCoordSet) const;
    00447
    00448     /**
    00449      * テクスチャ座標タイプ配列の取得
    00450      * @return テクスチャ座標タイプ配列
    00451      */
    00452     virtual const TexCoord::Type* getTexCoordTypeArray() const;
    00453
    00454     //--------------------------------------------------------------------------
    00455     /**
    00456      * テクスチャ座標の設定
    00457      * @param index インデックス
    00458      * @param texCoordSet テクスチャ座標セット
    00459      * @param texCoord テクスチャ座標
    00460      * @param numTexCoord いくつのテクスチャ座標か
    00461      */
    00462     virtual void setTexCoord(
    00463         int index, int texCoordSet, const float* texCoord, int numTexCoord);
    00464
    00465     /**
    00466      * テクスチャ座標配列の取得
    00467      * @return テクスチャ座標配列
    00468      */
    00469     virtual const float* const* getTexCoordArray() const;
    00470
    00471     /**
    00472      * テクスチャ座標配列の取得
    00473      * @param texCoordSet テクスチャ座標セット
    00474      * @return テクスチャ座標配列
    00475      */
    00476     virtual const float* getTexCoordArray(int texCoordSet) const;
    00477
    00478     /**
    00479      * テクスチャ座標配列サイズの取得
    00480      * @param texCoordSet テクスチャ座標セット
    00481      * @return テクスチャ座標配列サイズ
    00482      */
    00483     virtual int getTexCoordArraySize(int texCoordSet) const;
    00484
    00485     //--------------------------------------------------------------------------
    00486     /**
    00487      * 一次元テクスチャ座標の設定
    00488      * @param index インデックス
    00489      * @param texCoordSet テクスチャ座標セット
    00490      * @param texCoord 一次元テクスチャ座標
    00491      */
    00492     virtual void setTexCoord1(
    00493         int index, int texCoordSet, const TexCoord1& texCoord);
    00494
    00495     /**
    00496      * 一次元テクスチャ座標の取得
    00497      * @param index インデックス
    00498      * @param texCoordSet テクスチャ座標セット
    00499      * @return 一次元テクスチャ座標
    00500      */
    00501     virtual const TexCoord1& getTexCoord1(int index, int texCoordSet) const;
    00502
    00503     /**
    00504      * 一次元テクスチャ座標配列の取得
    00505      * @param texCoordSet テクスチャ座標セット
    00506      * @return 一次元テクスチャ座標配列
    00507      */
    00508     virtual const TexCoord1* getTexCoord1Array(int texCoordSet) const;
    00509
    00510     //--------------------------------------------------------------------------
    00511     /**
    00512      * 二次元テクスチャ座標の設定
    00513      * @param index インデックス
    00514      * @param texCoordSet テクスチャ座標セット
    00515      * @param texCoord 二次元テクスチャ座標
    00516      */
    00517     virtual void setTexCoord2(
    00518         int index, int texCoordSet, const TexCoord2& texCoord);
    00519
    00520     /**
    00521      * 二次元テクスチャ座標の取得
    00522      * @param index インデックス
    00523      * @param texCoordSet テクスチャ座標セット
    00524      * @return 二次元テクスチャ座標
    00525      */
    00526     virtual const TexCoord2& getTexCoord2(int index, int texCoordSet) const;
    00527
    00528     /**
    00529      * 二次元テクスチャ座標配列の取得
    00530      * @param texCoordSet テクスチャ座標セット
    00531      * @return 二次元テクスチャ座標配列
    00532      */
    00533     virtual const TexCoord2* getTexCoord2Array(int texCoordSet) const;
    00534
    00535     //--------------------------------------------------------------------------
    00536     /**
    00537      * 三次元テクスチャ座標の設定
    00538      * @param index インデックス
    00539      * @param texCoordSet テクスチャ座標セット
    00540      * @param texCoord 三次元テクスチャ座標
    00541      */
    00542     virtual void setTexCoord3(
    00543         int index, int texCoordSet, const TexCoord3& texCoord);
    00544
    00545     /**
    00546      * 三次元テクスチャ座標の取得
    00547      * @param index インデックス
    00548      * @param texCoordSet テクスチャ座標セット
    00549      * @return 三次元テクスチャ座標
    00550      */
    00551     virtual const TexCoord3& getTexCoord3(int index, int texCoordSet) const;
    00552
    00553     /**
    00554      * 三次元テクスチャ座標配列の取得
    00555      * @param texCoordSet テクスチャ座標セット
    00556      * @return 三次元テクスチャ座標配列
    00557      */
    00558     virtual const TexCoord3* getTexCoord3Array(int texCoordSet) const;
    00559
    00560     //--------------------------------------------------------------------------
    00561     /**
    00562      * 四次元テクスチャ座標の設定
    00563      * @param index インデックス
    00564      * @param texCoordSet テクスチャ座標セット
    00565      * @param texCoord 四次元テクスチャ座標
    00566      */
    00567     virtual void setTexCoord4(
    00568         int index, int texCoordSet, const TexCoord4& texCoord);
    00569
    00570     /**
    00571      * 四次元テクスチャ座標の取得
    00572      * @param index インデックス
    00573      * @param texCoordSet テクスチャ座標セット
    00574      * @return 四次元テクスチャ座標
    00575      */
    00576     virtual const TexCoord4& getTexCoord4(int index, int texCoordSet) const;
    00577
    00578     /**
    00579      * 四次元テクスチャ座標配列の取得
    00580      * @param texCoordSet テクスチャ座標セット
    00581      * @return 四次元テクスチャ座標配列
    00582      */
    00583     virtual const TexCoord4* getTexCoord4Array(int texCoordSet) const;
    00584
    00585     //--------------------------------------------------------------------------
    00586     /**
    00587      * 頂点あたりボーン数の設定
    00588      * @param bonesPerVertex 頂点あたりボーン数
    00589      */
    00590     virtual void setBonesPerVertex(int bonesPerVertex);
    00591
    00592     /**
    00593      * 頂点あたりボーン数の取得
    00594      * @return 頂点あたりボーン数
    00595      */
    00596     virtual int getBonesPerVertex() const;
    00597
    00598     /**
    00599      * ボーンインデックスが有効かどうか
    00600      * @return ボーンインデックスが有効ならtrue
    00601      */
    00602     virtual bool hasBoneIndex() const;
    00603
    00604     /**
    00605      * ボーンインデックスの設定
    00606      * @param vertexIndex 頂点インデックス
    00607      * @param boneNumber ボーン番号
    00608      * @param boneIndex ボーンインデックス
    00609      */
    00610     virtual void setBoneIndex(
    00611         int vertexIndex, int boneNumber, u_char boneIndex);
    00612
    00613     /**
    00614      * ボーンインデックスの設定
    00615      * @param vertexIndex 頂点インデックス
    00616      * @param boneIndex ボーンインデックス
    00617      */
    00618     virtual void setBoneIndex(int vertexIndex, u_char boneIndex);
    00619
    00620     /**
    00621      * ボーンインデックスの取得
    00622      * @param vertexIndex 頂点インデックス
    00623      * @param boneNumber ボーン番号
    00624      * @return ボーンインデックス
    00625      */
    00626     virtual u_char getBoneIndex(int vertexIndex, int boneNumber) const;
    00627
    00628     /**
    00629      * ボーンインデックスの取得
    00630      * @param vertexIndex 頂点インデックス
    00631      * @return ボーンインデックス
    00632      */
    00633     virtual u_char getBoneIndex(int vertexIndex) const;
    00634
    00635     /**
    00636      * ボーンインデックス配列の取得
    00637      * @return ボーンインデックス配列
    00638      */
    00639     virtual const u_char* getBoneIndexArray() const;
    00640
    00641     //--------------------------------------------------------------------------
    00642     /**
    00643      * 頂点当たりウェイト数の取得
    00644      * @return 頂点あたりウェイト数
    00645      */
    00646     virtual int getWeightsPerVertex() const;
    00647
    00648     /**
    00649      * ウェイトが有効かどうか
    00650      * @return ウェイトが有効ならtrue
    00651      */
    00652     virtual bool hasWeight() const;
    00653
    00654     /**
    00655      * ウェイトの設定
    00656      * @param vertexIndex 頂点インデックス
    00657      * @param boneNumber ボーン番号
    00658      * @param weight ウェイト
    00659      */
    00660     virtual void setWeight(int vertexIndex, int boneNumber, float weight);
    00661
    00662     /**
    00663      * ウェイトの取得
    00664      * @param vertexIndex 頂点インデックス
    00665      * @param boneNumber ボーン番号
    00666      * @return ウェイト
    00667      */
    00668     virtual float getWeight(int vertexIndex, int boneNumber) const;
    00669
    00670     /**
    00671      * ウェイト配列の取得
    00672      * @return ウェイト配列
    00673      */
    00674     virtual const float* getWeightArray() const;
    00675
    00676     //--------------------------------------------------------------------------
    00677     /**
    00678      * デバイスオブジェクトの初期化
    00679      * @return 成功したらtrueを返す
    00680      */
    00681     virtual bool initializeGraphicsDeviceObjects(){ return true; }
    00682
    00683     /**
    00684      * デバイスオブジェクトの削除
    00685      */
    00686     virtual void deleteGraphicsDeviceObjects(){}
    00687
    00688     /**
    00689      * デバイスオブジェクトのリストア
    00690      * @return 成功したらtrueを返す
    00691      */
    00692     virtual bool restoreGraphicsDeviceObjects(){ return true; }
    00693
    00694     /**
    00695      * デバイスオブジェクトの無効化
    00696      */
    00697     virtual void invalidateGraphicsDeviceObjects(){}
    00698
    00699     //--------------------------------------------------------------------------
    00700     // RTTI
    00701     //--------------------------------------------------------------------------
    00702     /**
    00703      * メッシュかどうか
    00704      * @return メッシュならtrue
    00705      */
    00706     virtual bool isMesh() const{ return true; }
    00707
    00708     //--------------------------------------------------------------------------
    00709     /**
    00710      * 剛体メッシュかどうか
    00711      * @return 剛体メッシュならtrue
    00712      */
    00713     virtual bool isRigidMesh() const{ return false; }
    00714
    00715     /**
    00716      * 剛体メッシュへのキャスト
    00717      * @return 剛体メッシュ。型が違えばNULLを返す。
    00718      */
    00719     virtual RigidMesh* castRigidMesh() const{
    00720         if(isRigidMesh()){ return (RigidMesh*)this; }
    00721         return NULL;
    00722     }
    00723
    00724     //--------------------------------------------------------------------------
    00725     /**
    00726      * キャラクタメッシュかどうか
    00727      * @return キャラクタメッシュならtrue
    00728      */
    00729     virtual bool isCharacterMesh() const{ return false; }
    00730
    00731     /**
    00732      * キャラクタメッシュへのキャスト
    00733      * @return キャラクタメッシュ。型が違えばNULLを返す。
    00734      */
    00735     virtual CharacterMesh* castCharacterMesh() const{
    00736         if(isCharacterMesh()){ return (CharacterMesh*)this; }
    00737         return NULL;
    00738     }
    00739
    00740     //--------------------------------------------------------------------------
    00741 protected:
    00742     /**
    00743      * コンストラクタ
    00744      * @param name 名前
    00745      * @param scene シーン
    00746      */
    00747     Mesh(const String& name, Scene* scene);
    00748
    00749     /**
    00750      * デストラクタ
    00751      */
    00752     virtual ~Mesh();
    00753
    00754     /**
    00755      * メッシュの値コピー
    00756      * @param destination コピー先メッシュ
    00757      * @param copyMask コピーマスク
    00758      */
    00759     virtual void copyMeshValue(Mesh* destination, u_int copyMask) const;
    00760
    00761     //--------------------------------------------------------------------------
    00762     // バッファアクセス
    00763     //--------------------------------------------------------------------------
    00764     /**
    00765      * インデックスバッファの取得
    00766      * @return インデックスバッファ
    00767      */
    00768     virtual Direct3DIndexBuffer* getIndexBuffer();
    00769
    00770     /**
    00771      * 頂点記述の取得
    00772      * @return 頂点記述
    00773      */
    00774     virtual Direct3DVertexDeclaration* getVertexDeclaration();
    00775
    00776     /**
    00777      * 頂点サイズの取得
    00778      * @return 頂点サイズ
    00779      */
    00780     virtual int getVertexSize();
    00781
    00782     /**
    00783      * 頂点バッファの構築
    00784      * @return 頂点バッファ
    00785      */
    00786     virtual Direct3DVertexBuffer* getVertexBuffer();
    00787
    00788     //--------------------------------------------------------------------------
    00789     // キャラクタ変形
    00790     //--------------------------------------------------------------------------
    00791     /**
    00792      * キャラクタ変形
    00793      * @return キャラクタ変形を行ったらtrue
    00794      */
    00795     virtual bool characterDeform(){ return false; }
    00796
    00797     //--------------------------------------------------------------------------
    00798     // 変形バッファアクセス
    00799     //--------------------------------------------------------------------------
    00800     /**
    00801      * 変形頂点記述の取得
    00802      * @return 変形頂点記述
    00803      */
    00804     virtual Direct3DVertexDeclaration* getDeformedVertexDeclaration(){
    00805         Assert(false);
    00806         return NULL;
    00807     }
    00808
    00809     /**
    00810      * 変形頂点サイズの取得
    00811      * @return 変形頂点サイズ
    00812      */
    00813     virtual int getDeformedVertexSize(){
    00814         Assert(false);
    00815         return 0;
    00816     }
    00817
    00818     /**
    00819      * 変形頂点バッファの構築
    00820      * @return 変形頂点バッファ
    00821      */
    00822     virtual Direct3DVertexBuffer* getDeformedVertexBuffer(){
    00823         Assert(false);
    00824         return NULL;
    00825     }
    00826
    00827     //--------------------------------------------------------------------------
    00828     /**
    00829      * レンダリングテンポラリデータの設定
    00830      * @param renderingTemporaryData レンダリングテンポラリデータ
    00831      */
    00832     virtual void setRenderingTemporaryData(float renderingTemporaryData){
    00833         renderingTemporaryData_ = renderingTemporaryData;
    00834     }
    00835
    00836     /**
    00837      * レンダリングテンポラリデータの取得
    00838      */
    00839     virtual float getRenderingTemporaryData() const{
    00840         return renderingTemporaryData_;
    00841     }
    00842
    00843     //--------------------------------------------------------------------------
    00844     /**
    00845      * 親の設定
    00846      * @param parent 設定する親
    00847      */
    00848     virtual void setParent(Model* parent){
    00849         Assert(parent != NULL);
    00850         Assert(parent_ == NULL);
    00851         parent_ = parent;
    00852         globalEnabled_ = false;
    00853     }
    00854
    00855     /**
    00856      * 親の削除
    00857      * @param parent 削除する親
    00858      */
    00859     virtual void removeParent(Model* parent){
    00860         Assert(parent_ != NULL);
    00861         Assert(parent_ == parent);
    00862         parent_ = NULL;
    00863         globalEnabled_ = false;
    00864     }
    00865
    00866 protected:
    00867     //--------------------------------------------------------------------------
    00868     /**
    00869      * 走査
    00870      * @param parentMatrix 親行列
    00871      * @param parentEnabled 親が有効か
    00872      * @param parentScaled 親がスケールを使用しているか
    00873      * @param parentChanged 親に変更があったか
    00874      */
    00875     virtual void traverse(const Matrix34& parentMatrix, bool parentEnabled,
    00876         bool parentScaled, bool parentChanged);
    00877
    00878 private:
    00879     //--------------------------------------------------------------------------
    00880     // 親
    00881     Model* parent_;
    00882     // メッシュデータ
    00883     MeshData* meshData_;
    00884     // マテリアル
    00885     Material* material_;
    00886     // ワールドバウンディングスフィア
    00887     Sphere worldBoundingSphere_;
    00888     // ワールドバウンディングボックス
    00889     AxisAlignedBox worldBoundingBox_;
    00890     // レンダリングテンポラリデータ
    00891     float renderingTemporaryData_;
    00892     // 有効、無効フラグ
    00893     bool enabled_;
    00894     // グローバルでの有効無効フラグ
    00895     bool globalEnabled_;
    00896     // グローバルでのスケールフラグ
    00897     bool globalScaled_;
    00898
    00899     // プリミティブタイプ文字列テーブル
    00900     static const String primitiveTypeStringTable[];
    00901
    00902 };
    00903
    00904 //------------------------------------------------------------------------------
    00905 } // End of namespace Lamp
    00906 #endif // End of MESH_H_
    00907 //------------------------------------------------------------------------------
    00908