DB/ItemDisplayInfo/GeosRenderPrep
Jump to navigation
Jump to search
void CCharacterComponent::GeosRenderPrep(CCharacterComponent *characterComponent) { // [COLLAPSED LOCAL DECLARATIONS. PRESS KEYPAD CTRL-"+" TO EXPAND] // "characterComponent->componentData.model2" simplified to "ourModel" for (vastly) shorter code // SHIRT = item_ids[2] // CHEST = item_ids[3] // BELT = item_ids[4] // PANTS = item_ids[5] // BOOTS = item_ids[6] // GLOVES = item_ids[8] // TABARD = item_ids[9] // CLOAK = field_6C0 // Lookup something (if class is not DK) booleanOfQuestionableUsefulness = false; if ( characterComponent->componentData.class_ != 6 ) { booleanOfQuestionableUsefulness = true; // ComponentGetSectionsRecord matches against CharSections.db2. // parameters: UNKNOWN, raceID, genderID, baseSection, variationIndex, colorIndex // since baseSection is 1, it is referring to the face, so variationIndex is really the 'type of face', and colorIndex is the skin color (so the face has matching skin color)' // what -exactly- v3 is is a bit of a mystery to me. Could be row ID from the DBC v3 = ComponentGetSectionsRecord( (__int64)&s_chrVarArray, characterComponent->componentData.race, characterComponent->componentData.gender, 1, characterComponent->componentData.face, characterComponent->componentData.skinColor, 0); if ( v3 ) { booleanOfQuestionableUsefulness = (*(_BYTE *)(v3 + 28) & 4) == 0; } } // Disable all geosets from 0 to 2200 CM2Model::SetGeometryVisible(ourModel, 0, 2200, 0); // Enable geoset 0, the skin CM2Model::SetGeometryVisible(ourModel, 0, 0, 1); // Enable default geosets for that model (i.e. fill in all the holes that there would be on a model with no armor on) if ( booleanOfQuestionableUsefulness ) { v4 = 0; // Counter variable do { CM2Model::SetGeometryVisible(ourModel, characterComponent->componentData.submeshIds[v4], characterComponent->componentData.submeshIds[v4], 1); ++v4; } while ( (_DWORD)v4 != 21 ); } // If Class is DK (or Race has eye glow?), enable special eyes else { v5 = 0; // Counter variable do { if ( (_DWORD)v5 == 17 ) { v6 = 1703; v7 = 1703; } else { v6 = characterComponent->componentData.submeshIds[v5]; v7 = characterComponent->componentData.submeshIds[v5]; } CM2Model::SetGeometryVisible(ourModel, v6, v7, 1); ++v5; } while ( (_DWORD)v5 != 21 ); } // TAIL is checked here? 'GetConditionalGeoset' probably checks racial conditions or something. CM2Model::SetGeometryVisible(ourModel, 1900, 1999, 0); v8 = GetConditionalGeoset(&characterComponent->componentData, (COMP_GEOSET)19); v9 = v8 + 1900; if ( (signed int)v8 <= 0 ) { v9 = 1901; } CM2Model::SetGeometryVisible(ourModel, v9, v9, 1); // GLOVES (8) v10 = characterComponent->item_ids[GLOVES]; if ( v10 && g_itemDisplayInfoDB->GetRecord(v10) && g_itemDisplayInfoDB->GetRecord(v10)->m_geosetGroup[0] ) { CM2Model::SetGeometryVisible(ourModel, 400, 499, 0); CM2Model::SetGeometryVisible( ourModel, g_itemDisplayInfoDB->GetRecord(v10)->m_geosetGroup[0] + 401, g_itemDisplayInfoDB->GetRecord(v10)->m_geosetGroup[0] + 401, 1); } else { // if no glove geoset, CHEST (3) - m_geosetGroup[0] modifies 801 v14 = characterComponent->item_ids[CHEST]; if ( v14 ) { v15 = g_itemDisplayInfoDB->GetRecord(v14); if ( v15 ) { v16 = v15->m_geosetGroup[0]; if ( v16 ) { CM2Model::SetGeometryVisible(ourModel, v16 + 801, v16 + 801, 1); } } } } bool valid = true; for ( int v13 = 65; v13 <= 70; ++v13 ) { if ( *(&characterComponent->field_0 + v13) != 0 ) { valid = false; } } if (valid) // (CONDITIONALLY) SHIRT (2) - m_geosetGroup[0] modifies 801 v18 = characterComponent->item_ids[SHIRT]; if ( v18 ) { v19 = g_itemDisplayInfoDB->GetRecord(v18); if ( v19 ) { v20 = v19->m_geosetGroup[0]; if ( v20 ) { CM2Model::SetGeometryVisible(ourModel, v20 + 801, v20 + 801, 1); } } } } // BELT (4) - m_geosetGroup[0] modifies a truth value used later to test whether to apply the tabard geoset (only if m_flags & 0x200) hasBulkyBeltFlag = 0; v21 = characterComponent->item_ids[BELT]; if ( v21 ) { v23 = g_itemDisplayInfoDB->GetRecord(v21); if ( v23 ) { if ( v23->m_geosetGroup[0] ) { hasBulkyBeltFlag = ((unsigned int)v23->m_flags >> 9) & 1; } } } v24 = characterComponent->item_ids[CHEST]; v29 = characterComponent->item_ids[PANTS]; // CHEST (3) - m_geosetGroup[2] modifies 1301 if ( v24 && g_itemDisplayInfoDB->GetRecord(v24) && g_itemDisplayInfoDB->GetRecord(v24)->m_geosetGroup[2] ) { dressPants = false; dressChestpiece = true; CM2Model::SetGeometryVisible(ourModel, g_itemDisplayInfoDB->GetRecord(v24)->m_geosetGroup[2] + 1301, g_itemDisplayInfoDB->GetRecord(v24)->m_geosetGroup[2] + 1301, 1); } // (CONDITIONALLY) PANTS (5) - m_geosetGroup[2] modifies 1301 (only if CHEST's m_geosetGroup[2] is 0) // FIELD 20 CHECK (&0x08 == 0) else if ( v29 && g_itemDisplayInfoDB->GetRecord(v29) && g_itemDisplayInfoDB->GetRecord(v29)->m_geosetGroup[2] && (characterComponent->field_20 & 8 == 0) ) { dressPants = true; dressChestpiece = false; CM2Model::SetGeometryVisible(ourModel, g_itemDisplayInfoDB->GetRecord(v29)->m_geosetGroup[2] + 1301, g_itemDisplayInfoDB->GetRecord(v29)->m_geosetGroup[2] + 1301, 1); } else { dressPants = false; dressChestpiece = false; // (CONDITIONALLY) BOOTS (6) - m_geosetGroup[0] modifies 501 (only if CHEST's m_geosetGroup[2] is 0 and PANTS' m_geosetGroup[2] is 0) v31 = characterComponent->item_ids[BOOTS]; if ( v31 && g_itemDisplayInfoDB->GetRecord(v31) && g_itemDisplayInfoDB->GetRecord(v31)->m_geosetGroup[0] ) { CM2Model::SetGeometryVisible(ourModel, g_itemDisplayInfoDB->GetRecord(v31)->m_geosetGroup[0] + 501, g_itemDisplayInfoDB->GetRecord(v31)->m_geosetGroup[0] + 501, 1); } else { // (CONDITIONALLY) PANTS (5) - m_geosetGroup[1] modifies 901 (only if CHEST's m_geosetGroup[2] is 0 and PANTS' m_geosetGroup[2] is 0 and BOOTS' m_geosetGroup[0] is 0 and field_20 & 0x08 != 0) v34 = characterComponent->item_ids[PANTS]; // FIELD 20 CHECK (&0x08 == 0) if ( v34 && g_itemDisplayInfoDB->GetRecord(v34) && g_itemDisplayInfoDB->GetRecord(v34)->m_geosetGroup[1] && (characterComponent->field_20 & 8 == 0) ) { v38 = v36 + 901; } // else, else, else: 901 is set (901 is default set then) else { v38 = 901; } CM2Model::SetGeometryVisible(ourModel, v38, v38, 1); } } // BOOTS (6) - m_geosetGroup[1] modifies 2000 (yes, 2000) and has some fun conditionals v40 = characterComponent->item_ids[BOOTS]; // If you are wearing BOOTS if ( v40 ) { v41 = g_itemDisplayInfoDB->GetRecord(v40); // If your BOOTS' m_geosetGroup[1] is 0 if ( !v41 || !v41->m_geosetGroup[1] ) { v44 = 2002; v45 = 2002; } // If your BOOTS' m_geosetGroup[1] is non-zero else { v44 = v41->m_geosetGroup[1] + 2000; v45 = v41->m_geosetGroup[1] + 2000; } } // If you are not wearing BOOTS else { v44 = 2001; v45 = 2001; } CM2Model::SetGeometryVisible(ourModel, v44, v45, 1); // (CONDITIONALLY) TABARD (9) - m_geosetGroup[0] modifies 1201 (if not wearing a dress and m_flags & 0x200 is 0 for your BELT) showsTabard = false; hasDress = (dressChestpiece | dressPants); if ( !hasDress && !hasBulkyBeltFlag ) { v49 = characterComponent->item_ids[TABARD]; if ( v49 ) { v50 = g_itemDisplayInfoDB->GetRecord(v49); if ( v50 ) { v51 = v50->m_geosetGroup[0]; if ( v51 ) { showsTabard = true; CM2Model::SetGeometryVisible(ourModel, v51 + 1201, v51 + 1201, 1); } } } } // FIELD 20 CHECK (&0x20 == 0) - result is tabard geoset hidden if ( characterComponent->field_20 & 0x20 == 0 ) { CM2Model::SetGeometryVisible(ourModel, 1201, 1201, 1) } // FIELD 20 CHECK (&0x20 == 0) - result is tabard geoset shown if hasDress is false if ( (characterComponent->field_20 & 0x20 == 0) && !hasDress ) { CM2Model::SetGeometryVisible(ourModel, 1202, 1202, 1); showsTabard = true; } else { if ( !showsTabard && !dressChestpiece ) { // (CONDITIONALLY) CHEST (3) - m_geosetGroup[1] modifies 1001 if (characterComponent->item_ids[CHEST] && g_itemDisplayInfoDB->GetRecord(characterComponent->item_ids[CHEST]) && g_itemDisplayInfoDB->GetRecord(characterComponent->item_ids[CHEST])->m_geosetGroup[1]) { CM2Model::SetGeometryVisible(ourModel, g_itemDisplayInfoDB->GetRecord(characterComponent->item_ids[CHEST])->m_geosetGroup[1] + 1001, g_itemDisplayInfoDB->GetRecord(characterComponent->item_ids[CHEST])->m_geosetGroup[1] + 1001, 1); showsTabard = false; } // (CONDITIONALLY) SHIRT (2) - m_geosetGroup[1] modifies 1001 else if (characterComponent->item_ids[SHIRT] && g_itemDisplayInfoDB->GetRecord(characterComponent->item_ids[SHIRT]) && g_itemDisplayInfoDB->GetRecord(characterComponent->item_ids[SHIRT])->m_geosetGroup[1]) { CM2Model::SetGeometryVisible(ourModel, g_itemDisplayInfoDB->GetRecord(characterComponent->item_ids[SHIRT])->m_geosetGroup[1] + 1001, g_itemDisplayInfoDB->GetRecord(characterComponent->item_ids[SHIRT])->m_geosetGroup[1] + 1001, 1); showsTabard = false; } } } // FIELD 20 CHECK (&0x08 == 0) if ( !dressChestpiece && (characterComponent->field_20 & 8 == 0) ) { // (CONDITIONALLY) PANTS (5) - m_geosetGroup[0] modifies 1101 (if m_geosetGroup[0] > 2, it wipes all geosets from 1300 to 1399 and then sets 1101. if it is less than or equal to 2 and if a tabard is shown, it sets 1101.) v58 = characterComponent->item_ids[PANTS]; if ( v58 ) { v59 = g_itemDisplayInfoDB->GetRecord(v58); if ( v59 ) { v60 = v59->m_geosetGroup[0]; if ( v60 ) { if ( v60 > 2 ) { CM2Model::SetGeometryVisible(ourModel, 1300, 1399, 0); CM2Model::SetGeometryVisible(ourModel, v60 + 1101, v60 + 1101, 1); } else if ( showsTabard ) { CM2Model::SetGeometryVisible(ourModel, v60 + 1101, v60 + 1101, 1); } } } } } // CLOAK (?) - m_geosetGroup[0] modifies 1501 // FIELD 6C0 CHECK (it's an itemID?) v61 = characterComponent->field_6C0; if ( v61 ) { v62 = g_itemDisplayInfoDB->GetRecord(v61); if ( v62 ) { if ( v62->m_geosetGroup[0] ) { CM2Model::SetGeometryVisible(ourModel, 1500, 1599, 0); CM2Model::SetGeometryVisible(ourModel, v62->m_geosetGroup[0] + 1501, v62->m_geosetGroup[0] + 1501, 1); } } } // BELT (4) - m_geosetGroup[0] modifies 1801 v64 = characterComponent->item_ids[BELT]; if ( v64 ) { v65 = g_itemDisplayInfoDB->GetRecord(v64); if ( v65 ) { if ( v65->m_geosetGroup[0] ) { CM2Model::SetGeometryVisible(ourModel, 1800, 1899, 0); CM2Model::SetGeometryVisible(ourModel, v65->m_geosetGroup[0] + 1801, v65->m_geosetGroup[0] + 1801, 1); } } } // FIELD 20 CHECK (&0x10 != 0) if ( characterComponent->field_20 & 0x10 != ) { // If you aren't wearing PANTS, you have a tabard, and you don't have a dress (a dress from CHEST presumably, since you aren't wearing PANTS), enable 1401 if ( showsTabard && !characterComponent->item_ids[PANTS] && !hasDress ) { v67 = 1401; v68 = 1401; v69 = 1; } else { v67 = 1400; v68 = 1499; v69 = 0; } CM2Model::SetGeometryVisible(ourModel, v67, v68, v69); } // Remove unneeded edges and vertices due to the enabled geosets CM2Model::OptimizeVisibleGeometry(ourModel); // FIELD 20 MODIFICATION (&=0xFD) characterComponent->field_20 &= 0xFD; }