void Spinner::RenderSetup() { if (!m_d.m_fVisible) return; RenderDevice * const pd3dDevice = g_pplayer->m_pin3d.m_pd3dPrimaryDevice; const float height = m_ptable->GetSurfaceHeight(m_d.m_szSurface, m_d.m_vCenter.x, m_d.m_vCenter.y)*m_ptable->m_BG_scalez[m_ptable->m_BG_current_set]; m_posZ = height + m_d.m_height; if (bracketIndexBuffer) bracketIndexBuffer->release(); bracketIndexBuffer = pd3dDevice->CreateAndFillIndexBuffer(spinnerBracketNumFaces, spinnerBracketIndices); if (bracketVertexBuffer) bracketVertexBuffer->release(); pd3dDevice->CreateVertexBuffer(spinnerBracketNumVertices, 0, MY_D3DFVF_NOTEX2_VERTEX, &bracketVertexBuffer); fullMatrix.RotateZMatrix(ANGTORAD(m_d.m_rotation)); Vertex3D_NoTex2 *buf; bracketVertexBuffer->lock(0, 0, (void**)&buf, VertexBuffer::WRITEONLY); for (int i = 0; i < spinnerBracketNumVertices; i++) { Vertex3Ds vert(spinnerBracket[i].x, spinnerBracket[i].y, spinnerBracket[i].z); vert = fullMatrix.MultiplyVector(vert); buf[i].x = vert.x*m_d.m_length + m_d.m_vCenter.x; buf[i].y = vert.y*m_d.m_length + m_d.m_vCenter.y; buf[i].z = vert.z*m_d.m_length*m_ptable->m_BG_scalez[m_ptable->m_BG_current_set] + m_posZ; vert = Vertex3Ds(spinnerBracket[i].nx, spinnerBracket[i].ny, spinnerBracket[i].nz); vert = fullMatrix.MultiplyVectorNoTranslate(vert); buf[i].nx = vert.x; buf[i].ny = vert.y; buf[i].nz = vert.z; buf[i].tu = spinnerBracket[i].tu; buf[i].tv = spinnerBracket[i].tv; } bracketVertexBuffer->unlock(); if (plateIndexBuffer) plateIndexBuffer->release(); plateIndexBuffer = pd3dDevice->CreateAndFillIndexBuffer(spinnerPlateNumFaces, spinnerPlateIndices); if (plateVertexBuffer) plateVertexBuffer->release(); pd3dDevice->CreateVertexBuffer(spinnerPlateNumVertices, USAGE_DYNAMIC, MY_D3DFVF_NOTEX2_VERTEX, &plateVertexBuffer); vertexBuffer_spinneranimangle = -FLT_MAX; UpdatePlate(NULL); }
void Spinner::UpdatePlate(Vertex3D_NoTex2 * const vertBuffer) { // early out in case still same rotation if (m_phitspinner->m_spinnerMover.m_angle == vertexBuffer_spinneranimangle) return; vertexBuffer_spinneranimangle = m_phitspinner->m_spinnerMover.m_angle; Matrix3D _fullMatrix; Matrix3D rotzMat, rotxMat; _fullMatrix.SetIdentity(); rotxMat.RotateXMatrix(-m_phitspinner->m_spinnerMover.m_angle); rotxMat.Multiply(_fullMatrix, _fullMatrix); rotzMat.RotateZMatrix(ANGTORAD(m_d.m_rotation)); rotzMat.Multiply(_fullMatrix, _fullMatrix); Vertex3D_NoTex2 *buf; if (vertBuffer == NULL) plateVertexBuffer->lock(0, 0, (void**)&buf, VertexBuffer::DISCARDCONTENTS); else buf = vertBuffer; for (int i = 0; i < spinnerPlateNumVertices; i++) { Vertex3Ds vert(spinnerPlate[i].x, spinnerPlate[i].y, spinnerPlate[i].z); vert = _fullMatrix.MultiplyVector(vert); buf[i].x = vert.x*m_d.m_length + m_d.m_vCenter.x; buf[i].y = vert.y*m_d.m_length + m_d.m_vCenter.y; buf[i].z = vert.z*m_d.m_length*m_ptable->m_BG_scalez[m_ptable->m_BG_current_set] + m_posZ; vert = Vertex3Ds(spinnerPlate[i].nx, spinnerPlate[i].ny, spinnerPlate[i].nz); vert = _fullMatrix.MultiplyVectorNoTranslate(vert); buf[i].nx = vert.x; buf[i].ny = vert.y; buf[i].nz = vert.z; buf[i].tu = spinnerPlate[i].tu; buf[i].tv = spinnerPlate[i].tv; } if (vertBuffer == NULL) plateVertexBuffer->unlock(); }
Vertex3Ds RotateAround(const Vertex3Ds &pvAxis, const Vertex2D &pvPoint, const float angle) { const float rsin = sinf(angle); const float rcos = cosf(angle); // Matrix for rotating around an arbitrary vector float matrix[3][2]; matrix[0][0] = pvAxis.x*pvAxis.x + rcos*(1.0f - pvAxis.x*pvAxis.x); matrix[1][0] = pvAxis.x*pvAxis.y*(1.0f - rcos) - pvAxis.z*rsin; matrix[2][0] = pvAxis.z*pvAxis.x*(1.0f - rcos) + pvAxis.y*rsin; matrix[0][1] = pvAxis.x*pvAxis.y*(1.0f - rcos) + pvAxis.z*rsin; matrix[1][1] = pvAxis.y*pvAxis.y + rcos*(1.0f - pvAxis.y*pvAxis.y); matrix[2][1] = pvAxis.y*pvAxis.z*(1.0f - rcos) - pvAxis.x*rsin; return Vertex3Ds(matrix[0][0] * pvPoint.x + matrix[0][1] * pvPoint.y, matrix[1][0] * pvPoint.x + matrix[1][1] * pvPoint.y, matrix[2][0] * pvPoint.x + matrix[2][1] * pvPoint.y); }
void Bumper::GenerateBaseMesh(Vertex3D_NoTex2 *buf) { const float scalexy = m_d.m_radius*1.7f; for (int i = 0; i < bumperBaseNumVertices; i++) { Vertex3Ds vert(bumperBase[i].x, bumperBase[i].y, bumperBase[i].z); vert = m_fullMatrix.MultiplyVector(vert); buf[i].x = vert.x*scalexy + m_d.m_vCenter.x; buf[i].y = vert.y*scalexy + m_d.m_vCenter.y; buf[i].z = (vert.z * m_d.m_heightScale)*m_ptable->m_BG_scalez[m_ptable->m_BG_current_set] + m_baseHeight; vert = Vertex3Ds(bumperBase[i].nx, bumperBase[i].ny, bumperBase[i].nz); vert = m_fullMatrix.MultiplyVectorNoTranslate(vert); buf[i].nx = vert.x; buf[i].ny = vert.y; buf[i].nz = vert.z; buf[i].tu = bumperBase[i].tu; buf[i].tv = bumperBase[i].tv; } }
void Bumper::GenerateSocketMesh(Vertex3D_NoTex2 *buf) { const float scalexy = m_d.m_radius*2.0f; for (int i = 0; i < bumperSocketNumVertices; i++) { Vertex3Ds vert(bumperSocket[i].x, bumperSocket[i].y, bumperSocket[i].z); vert = m_fullMatrix.MultiplyVector(vert); buf[i].x = vert.x*scalexy + m_d.m_vCenter.x; buf[i].y = vert.y*scalexy + m_d.m_vCenter.y; // scale z by 0.6 to make the skirt a bit more flat buf[i].z = (0.6f*vert.z*m_d.m_heightScale)*m_ptable->m_BG_scalez[m_ptable->m_BG_current_set] + m_baseHeight; vert = Vertex3Ds(bumperSocket[i].nx, bumperSocket[i].ny, bumperSocket[i].nz); vert = m_fullMatrix.MultiplyVectorNoTranslate(vert); buf[i].nx = vert.x; buf[i].ny = vert.y; buf[i].nz = vert.z; buf[i].tu = bumperSocket[i].tu; buf[i].tv = bumperSocket[i].tv; } }
void Spinner::ExportMesh(FILE *f) { char name[MAX_PATH]; char subObjName[MAX_PATH]; WideCharToMultiByte(CP_ACP, 0, m_wzName, -1, name, MAX_PATH, NULL, NULL); std::vector<Vertex3D_NoTex2> transformedVertices; vector<HitObject*> dummyHitObj; const float height = m_ptable->GetSurfaceHeight(m_d.m_szSurface, m_d.m_vCenter.x, m_d.m_vCenter.y)*m_ptable->m_BG_scalez[m_ptable->m_BG_current_set]; m_posZ = height + m_d.m_height; GetHitShapes(dummyHitObj); if (m_d.m_fShowBracket) { strcpy_s(subObjName, name); strcat_s(subObjName, "Bracket"); WaveFrontObj_WriteObjectName(f, subObjName); fullMatrix.RotateZMatrix(ANGTORAD(m_d.m_rotation)); transformedVertices.resize(spinnerBracketNumVertices); for (int i = 0; i < spinnerBracketNumVertices; i++) { Vertex3Ds vert(spinnerBracket[i].x, spinnerBracket[i].y, spinnerBracket[i].z); vert = fullMatrix.MultiplyVector(vert); transformedVertices[i].x = vert.x*m_d.m_length + m_d.m_vCenter.x; transformedVertices[i].y = vert.y*m_d.m_length + m_d.m_vCenter.y; transformedVertices[i].z = vert.z*m_d.m_length*m_ptable->m_BG_scalez[m_ptable->m_BG_current_set] + m_posZ; vert = Vertex3Ds(spinnerBracket[i].nx, spinnerBracket[i].ny, spinnerBracket[i].nz); vert = fullMatrix.MultiplyVectorNoTranslate(vert); transformedVertices[i].nx = vert.x; transformedVertices[i].ny = vert.y; transformedVertices[i].nz = vert.z; transformedVertices[i].tu = spinnerBracket[i].tu; transformedVertices[i].tv = spinnerBracket[i].tv; } WaveFrontObj_WriteVertexInfo(f, transformedVertices.data(), spinnerBracketNumVertices); const Material * mat = m_ptable->GetMaterial(m_d.m_szMaterial); WaveFrontObj_WriteMaterial(m_d.m_szMaterial, NULL, mat); WaveFrontObj_UseTexture(f, m_d.m_szMaterial); WaveFrontObj_WriteFaceInfoList(f, spinnerBracketIndices, spinnerBracketNumFaces); WaveFrontObj_UpdateFaceOffset(spinnerBracketNumVertices); transformedVertices.clear(); } transformedVertices.resize(spinnerPlateNumVertices); vertexBuffer_spinneranimangle = -FLT_MAX; UpdatePlate(transformedVertices.data()); strcpy_s(subObjName, name); strcat_s(subObjName, "Plate"); WaveFrontObj_WriteObjectName(f, subObjName); WaveFrontObj_WriteVertexInfo(f, transformedVertices.data(), spinnerPlateNumVertices); WaveFrontObj_WriteFaceInfoList(f, spinnerPlateIndices, spinnerPlateNumFaces); WaveFrontObj_UpdateFaceOffset(spinnerPlateNumVertices); transformedVertices.clear(); }