// //--------------------------------------------------------------------------- // // Copyright(C) 2018 Marisa Kirisame // All rights reserved. // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with this program. If not, see http://www.gnu.org/licenses/ // //-------------------------------------------------------------------------- // #include "w_wad.h" #include "cmdlib.h" #include "r_data/models/models_ue1.h" float unpackuvert( uint32_t n, int c ) { switch( c ) { case 2: return ((int16_t)((n&0x7ff)<<5))/127.f; case 1: return ((int16_t)(((n>>11)&0x7ff)<<5))/127.f; case 0: return ((int16_t)(((n>>22)&0x3ff)<<6))/127.f; default: return 0.f; } } bool FUE1Model::Load( const char *filename, int lumpnum, const char *buffer, int length ) { mLumpNum = lumpnum; int lumpnum2; FMemLump lump2; const char *buffer2; FString realfilename = Wads.GetLumpFullName(lumpnum); if ( realfilename.IndexOf("_d.3d") == realfilename.Len()-5 ) { realfilename.Substitute("_d.3d","_a.3d"); lumpnum2 = Wads.CheckNumForFullName(realfilename); lump2 = Wads.ReadLump(lumpnum2); buffer2 = (char*)lump2.GetMem(); // map structures dhead = (d3dhead*)(buffer); dpolys = (d3dpoly*)(buffer+sizeof(d3dhead)); ahead = (a3dhead*)(buffer2); averts = (uint32_t*)(buffer2+sizeof(a3dhead)); } else { realfilename.Substitute("_a.3d","_d.3d"); lumpnum2 = Wads.CheckNumForFullName(realfilename); lump2 = Wads.ReadLump(lumpnum2); buffer2 = (char*)lump2.GetMem(); // map structures dhead = (d3dhead*)(buffer2); dpolys = (d3dpoly*)(buffer2+sizeof(d3dhead)); ahead = (a3dhead*)(buffer); averts = (uint32_t*)(buffer+sizeof(a3dhead)); } // set counters numVerts = dhead->numverts; numFrames = ahead->numframes; numPolys = dhead->numpolys; numGroups = 0; groupIndices.Reset(); uint8_t used[256] = {0}; for ( int i=0; i= numFrames) || (frame2 >= numFrames) ) return; renderer->SetInterpolation(inter); int vsize, fsize = 0, vofs = 0; for ( int i=0; isurfaceskinIDs[curMDLIndex][i].isValid() ) sskin = TexMan(curSpriteMDLFrame->surfaceskinIDs[curMDLIndex][i]); if ( !sskin ) { vofs += vsize; continue; } } renderer->SetMaterial(sskin,false,translation); mVBuf->SetupFrame(renderer,vofs+frame*fsize,vofs+frame2*fsize,vsize); renderer->DrawArrays(0,vsize); vofs += vsize; } renderer->SetInterpolation(0.f); } void FUE1Model::BuildVertexBuffer( FModelRenderer *renderer ) { if ( mVBuf != NULL ) return; int vsize = 0; for ( int i=0; iCreateVertexBuffer(false,numFrames==1); FModelVertex *vptr = mVBuf->LockVertexBuffer(vsize); int vidx = 0; for ( int i=0; iSet(V.Pos.X,V.Pos.Y,V.Pos.Z,C.S,C.T); vert->SetNormal(V.Normal.X,V.Normal.Y,V.Normal.Z); } } } } mVBuf->UnlockVertexBuffer(); } void FUE1Model::AddSkins( uint8_t *hitlist ) { for ( int i=0; isurfaceskinIDs[curMDLIndex][i].isValid() ) hitlist[curSpriteMDLFrame->surfaceskinIDs[curMDLIndex][i].GetIndex()] |= FTextureManager::HIT_Flat; } FUE1Model::~FUE1Model() { UnloadGeometry(); }