171 DefMatDesc->Reset(polycount,vertcount,passcount);
277 if (_TempTransformedVertexBuffer.Length() <
VertexCount) _TempTransformedVertexBuffer.Resize(
VertexCount);
278 Vector4* transf_ptr=&(_TempTransformedVertexBuffer[0]);
303#if (!OPTIMIZE_PLANEEQ_RAM)
317 CurMatDesc->Make_Color_Array_Unique(array_index);
375 int i1=*(
int*)&l1[0];
376 i1=37*i1+*(
int*)&l1[1];
377 i1=37*i1+*(
int*)&l1[2];
378 int i2=*(
int*)&l2[0];
379 i2=37*i2+*(
int*)&l2[1];
380 i2=37*i2+*(
int*)&l2[2];
394 unsigned i=*(
unsigned*)&
loc1[0]^*(
unsigned*)&s.
loc1[0];
395 i|=*(
unsigned*)&
loc1[1]^*(
unsigned*)&s.
loc1[1];
396 i|=*(
unsigned*)&
loc1[2]^*(
unsigned*)&s.
loc1[2];
397 i|=*(
unsigned*)&
loc2[0]^*(
unsigned*)&s.
loc2[0];
398 i|=*(
unsigned*)&
loc2[1]^*(
unsigned*)&s.
loc2[1];
399 i|=*(
unsigned*)&
loc2[2]^*(
unsigned*)&s.
loc2[2];
408 const unsigned char* buffer=(
const unsigned char*)&location;
410 for (
unsigned int a=0;a<
sizeof(
Vector3);++a) {
411 hval+=37*hval+buffer[a];
420 const unsigned char* buffer=(
const unsigned char*)&side;
423 hval+=37*hval+buffer[a];
463 for (
int pass=0;pass<mmc->Get_Pass_Count();++pass) {
465 if (mmc->Has_Texture_Array(pass,stage)) {
468 else TextureArray[pass][stage]=
NULL;
471 if (mmc->Has_Material_Array(pass)) {
474 else MaterialArray[pass]=
NULL;
476 if (mmc->Has_Shader_Array(pass)) {
479 else ShaderArray[pass]=
NULL;
493 ArraySize=that.ArraySize;
495 for (
int pass=0;pass<mmc->Get_Pass_Count();++pass) {
497 if (that.TextureArray[pass][stage]) {
499 for (
unsigned i=0;i<PolygonCount;++i) {
500 TextureArray[pass][stage][i]=that.TextureArray[pass][stage][i];
501 TextureArray[pass][stage][i]->
Add_Ref();
504 else TextureArray[pass][stage]=
NULL;
507 if (that.MaterialArray[pass]) {
509 for (
unsigned i=0;i<PolygonCount;++i) {
510 MaterialArray[pass][i]=that.MaterialArray[pass][i];
511 MaterialArray[pass][i]->
Add_Ref();
514 else MaterialArray[pass]=
NULL;
516 if (that.ShaderArray[pass]) {
518 for (
unsigned i=0;i<PolygonCount;++i) {
519 ShaderArray[pass][i]=that.ShaderArray[pass][i];
522 else ShaderArray[pass]=
NULL;
535 delete[] PolygonArray;
537 for (
int pass=0;pass<mmc->Get_Pass_Count();++pass) {
539 if (TextureArray[pass][stage]) {
541 for (
unsigned i=0;i<PolygonCount;++i) {
544 delete[] TextureArray[pass][stage];
548 if (MaterialArray[pass]) {
549 for (
unsigned i=0;i<PolygonCount;++i) {
552 delete[] MaterialArray[pass];
555 delete[] ShaderArray[pass];
571 WWASSERT(vidx1!=vidx2 && vidx1!=vidx3 && vidx2!=vidx3);
572Vector3 loc1=mmc->Get_Vertex_Array()[vidx1];
573Vector3 loc2=mmc->Get_Vertex_Array()[vidx2];
574Vector3 loc3=mmc->Get_Vertex_Array()[vidx3];
575WWASSERT(loc1==loc2 || loc1==loc3 || loc2==loc3);
581 PolygonArray[PolygonCount]=
TriIndex(vidx1,vidx2,vidx3);
582 for (
int pass=0;pass<mmc->Get_Pass_Count();++pass) {
583 if (mmc->Has_Shader_Array(pass)) {
584 ShaderArray[pass][PolygonCount]=mmc->Get_Shader(polygon_index,pass);
586 if (mmc->Has_Material_Array(pass)) {
588 MaterialArray[pass][PolygonCount]=mmc->Get_Material(mmc->Get_Polygon_Array()[polygon_index][0],pass);
591 if (mmc->Has_Texture_Array(pass,stage)) {
592 TextureArray[pass][stage][PolygonCount]=mmc->Get_Texture(polygon_index,pass,stage);
608 if (PolygonCount==ArraySize)
return;
612 memcpy(new_polygon_array,PolygonArray,PolygonCount*
sizeof(
TriIndex));
613 delete[] PolygonArray;
614 PolygonArray=new_polygon_array;
616 for (
int pass=0;pass<mmc->Get_Pass_Count();++pass) {
618 if (TextureArray[pass][stage]) {
621 memcpy(new_texture_array,TextureArray[pass][stage],PolygonCount*
sizeof(
TextureClass*));
622 delete[] TextureArray[pass][stage];
623 TextureArray[pass][stage]=new_texture_array;
627 if (MaterialArray[pass]) {
631 delete[] MaterialArray[pass];
632 MaterialArray[pass]=new_material_array;
635 if (ShaderArray[pass]) {
638 memcpy(new_shader_array,ShaderArray[pass],PolygonCount*
sizeof(
ShaderClass));
639 delete[] ShaderArray[pass];
640 ShaderArray[pass]=new_shader_array;
643 ArraySize=PolygonCount;
668 for (
unsigned i=0;i<vertex_count;++i) {
679 for (i=0;i<polygon_count;++i) {
684 if (duplicates[0] && duplicates[1]) {
685 TriangleSide tri(locations[polygon_indices[i][0]],locations[polygon_indices[i][1]]);
688 unsigned idx1=side_index.
vidx1;
689 unsigned idx2=side_index.
vidx2;
690 unsigned idx3=polygon_indices[i][0];
691 unsigned idx4=polygon_indices[i][1];
692 bool diff=!(idx1^idx3)|!(idx1^idx4)|!(idx2^idx3)|!(idx2^idx4);
695 GapFiller->Add_Polygon(i,idx4,idx2,idx1);
701 side_index.
vidx1=polygon_indices[i][0];
702 side_index.
vidx2=polygon_indices[i][1];
707 if (duplicates[1] && duplicates[2]) {
708 TriangleSide tri(locations[polygon_indices[i][1]],locations[polygon_indices[i][2]]);
711 unsigned idx1=side_index.
vidx1;
712 unsigned idx2=side_index.
vidx2;
713 unsigned idx3=polygon_indices[i][1];
714 unsigned idx4=polygon_indices[i][2];
715 bool diff=!(idx1^idx3)|!(idx1^idx4)|!(idx2^idx3)|!(idx2^idx4);
718 GapFiller->Add_Polygon(i,idx4,idx2,idx1);
724 side_index.
vidx1=polygon_indices[i][1];
725 side_index.
vidx2=polygon_indices[i][2];
730 if (duplicates[2] && duplicates[0]) {
731 TriangleSide tri(locations[polygon_indices[i][2]],locations[polygon_indices[i][0]]);
734 unsigned idx1=side_index.
vidx1;
735 unsigned idx2=side_index.
vidx2;
736 unsigned idx3=polygon_indices[i][2];
737 unsigned idx4=polygon_indices[i][0];
738 bool diff=!(idx1^idx3)|!(idx1^idx4)|!(idx2^idx3)|!(idx2^idx4);
741 GapFiller->Add_Polygon(i,idx4,idx2,idx1);
747 side_index.
vidx1=polygon_indices[i][2];
748 side_index.
vidx2=polygon_indices[i][0];
void Set_Vertex_Locations(Vector2 *vertices, int count)
void Render_Triangles(const unsigned long *indices, int index_count)
void Change_Polygon_Renderer_Texture(DX8PolygonRendererList &polygon_renderer_list, TextureClass *texture, TextureClass *new_texture, unsigned pass, unsigned stage)
void Change_Polygon_Renderer_Material(DX8PolygonRendererList &polygon_renderer_list, VertexMaterialClass *vmat, VertexMaterialClass *new_vmat, unsigned pass)
DX8TextureCategoryClass * Get_Texture_Category()
DX8FVFCategoryContainer * Get_Container(void)
static const DX8Caps * Get_Current_Caps()
void Add_Polygon(unsigned polygon_index, unsigned vidx1, unsigned vidx2, unsigned vidx3)
GapFillerClass(MeshModelClass *mmc)
static unsigned int Get_Hash_Value(const Key &k)
void Reset_Geometry(int polycount, int vertcount)
ShareBufferClass< Vector3 > * Vertex
void get_deformed_screenspace_vertices(Vector4 *dst_vert, const RenderInfoClass &rinfo, const Matrix3D &mesh_tm, const HTreeClass *htree)
ShareBufferClass< Vector4 > * PlaneEq
int Get_Vertex_Count(void) const
const TriIndex * Get_Polygon_Array(void)
ShareBufferClass< Vector3 > * VertexNorm
MeshGeometryClass & operator=(const MeshGeometryClass &that)
ShareBufferClass< TriIndex > * Poly
Vector3 * Get_Vertex_Array(void)
void Set_Flag(FlagsType flag, bool onoff)
int Get_Polygon_Count(void) const
int Get_Flag(FlagsType flag)
void Set_Texture(int pidx, TextureClass *tex, int pass=0, int stage=0)
MeshModelClass & operator=(const MeshModelClass &that)
MeshMatDescClass * DefMatDesc
GapFillerClass * GapFiller
TextureClass * Peek_Texture(int pidx, int pass=0, int stage=0) const
void Make_UV_Array_Unique(int pass=0, int stage=0)
void compute_static_sort_levels(void)
void Set_Single_Texture(TextureClass *tex, int pass=0, int stage=0)
void Set_Material(int vidx, VertexMaterialClass *vmat, int pass=0)
void Make_Color_Array_Unique(int array_index=0)
bool Needs_Vertex_Normals(void)
MaterialInfoClass * MatInfo
void Init_For_NPatch_Rendering()
void Reset(int polycount, int vertcount, int passcount)
void Enable_Alternate_Material_Description(bool onoff)
VertexMaterialClass * Peek_Material(int vidx, int pass=0) const
bool Has_Material_Array(int pass) const
void Register_For_Rendering()
int Get_Pass_Count(void) const
bool Has_Texture_Array(int pass, int stage) const
DX8PolygonRendererList PolygonRendererList
bool Is_Alternate_Material_Description_Enabled(void)
DX8FVFCategoryContainer * Peek_FVF_Category_Container()
MeshMatDescClass * AlternateMatDesc
void Shadow_Render(SpecialRenderInfoClass &rinfo, const Matrix3D &tm, const HTreeClass *htree)
void Set_Single_Material(VertexMaterialClass *vmat, int pass=0)
MeshMatDescClass * CurMatDesc
friend class DX8PolygonRendererClass
void modify_for_overbright(void)
void Replace_Texture(TextureClass *texture, TextureClass *new_texture)
VertexMaterialClass * Peek_Single_Material(int pass=0) const
void Replace_VertexMaterial(VertexMaterialClass *vmat, VertexMaterialClass *new_vmat)
void Make_Geometry_Unique()
void clone_materials(const MeshModelClass &srcmesh)
TextureClass * Peek_Single_Texture(int pass=0, int stage=0) const
BWRenderClass * BWRenderer
static bool Is_Overbright_Modify_On_Load_Enabled(void)
static NPatchesGapFillingModeEnum Get_NPatches_Gap_Filling_Mode()
static unsigned Get_NPatches_Level()
static bool Is_Munge_Sort_On_Load_Enabled(void)
@ NPATCHES_GAP_FILLING_DISABLED
@ NPATCHES_GAP_FILLING_FORCE
DX8MeshRendererClass TheDX8MeshRenderer
HashTemplateClass< TriangleSide, SideIndexInfo > SideHash
HashTemplateClass< Vector3, unsigned > LocationHash
HashTemplateClass< Vector3, unsigned > DuplicateLocationHash
#define REF_PTR_RELEASE(x)
#define REF_PTR_SET(dst, src)
TriangleSide(const Vector3 &l1, const Vector3 &l2)
bool operator==(const TriangleSide &s)