1
0
mirror of synced 2025-03-02 00:20:37 +01:00

Some speed improvements

This commit is contained in:
KillzXGaming 2019-05-28 20:02:58 -04:00
parent f9ccce42df
commit cb6cc251bd
4 changed files with 46 additions and 45 deletions

Binary file not shown.

View File

@ -36,21 +36,25 @@ namespace FirstPlugin
int vbo_position; int vbo_position;
int ibo_elements; int ibo_elements;
private List<FMDL> _models = new List<FMDL>();
public List<FMDL> models public List<FMDL> models
{ {
get get
{ {
List<FMDL> fmdls = new List<FMDL>(); return _models;
foreach (var node in ResFileNode.Nodes) }
}
private void UpdateModelList()
{
foreach (var node in ResFileNode.Nodes)
{
if (node is BFRESGroupNode &&
((BFRESGroupNode)node).Type == BRESGroupType.Models)
{ {
if (node is BFRESGroupNode && foreach (FMDL mdl in ((BFRESGroupNode)node).Nodes)
((BFRESGroupNode)node).Type == BRESGroupType.Models) _models.Add(mdl);
{
foreach (FMDL mdl in ((BFRESGroupNode)node).Nodes)
fmdls.Add(mdl);
}
} }
return fmdls;
} }
} }
@ -84,11 +88,11 @@ namespace FirstPlugin
private void TransformBones() private void TransformBones()
{ {
foreach (var model in models) for (int mdl = 0; mdl < models.Count; mdl++)
{ {
foreach (var bone in model.Skeleton.bones) for (int b = 0; b < models[mdl].Skeleton.bones.Count; b++)
{ {
bone.ModelMatrix = ModelTransform; models[mdl].Skeleton.bones[b].ModelMatrix = ModelTransform;
} }
} }
} }
@ -200,11 +204,11 @@ namespace FirstPlugin
public void CenterCamera(GL_ControlModern control) public void CenterCamera(GL_ControlModern control)
{ {
var spheres = new List<Vector4>(); var spheres = new List<Vector4>();
foreach (var mdl in models) for (int mdl = 0; mdl < models.Count; mdl++)
{ {
foreach (FSHP shp in mdl.shapes) for (int shp = 0; shp < models[mdl].shapes.Count; shp++)
{ {
var vertexPositions = shp.vertices.Select(x => x.pos).Distinct(); var vertexPositions = models[mdl].shapes[shp].vertices.Select(x => x.pos).Distinct();
spheres.Add(control.GenerateBoundingSphere(vertexPositions)); spheres.Add(control.GenerateBoundingSphere(vertexPositions));
} }
} }
@ -265,9 +269,6 @@ namespace FirstPlugin
if (models.Count > 0) if (models.Count > 0)
{ {
// if (models[0].Parent.Parent.IsSelected)
// CenterCamera(control);
if (models[0].shapes.Count > 0) if (models[0].shapes.Count > 0)
{ {
if (models[0].shapes[0].GetMaterial().shaderassign.ShaderModel == "uking_mat") if (models[0].shapes[0].GetMaterial().shaderassign.ShaderModel == "uking_mat")
@ -353,28 +354,28 @@ namespace FirstPlugin
private void DrawModels(SF.Shader shader, GL_ControlModern control) private void DrawModels(SF.Shader shader, GL_ControlModern control)
{ {
shader.EnableVertexAttributes(); shader.EnableVertexAttributes();
foreach (FMDL mdl in models) for (int m = 0; m < models.Count; m++)
{ {
if (mdl.Checked) if (models[m].Checked)
{ {
List<FSHP> opaque = new List<FSHP>(); List<FSHP> opaque = new List<FSHP>();
List<FSHP> transparent = new List<FSHP>(); List<FSHP> transparent = new List<FSHP>();
foreach (FSHP m in mdl.depthSortedMeshes) for (int shp = 0; shp < models[m].shapes.Count; shp++)
{ {
if (m.GetMaterial().isTransparent) if (models[m].shapes[shp].GetMaterial().isTransparent)
transparent.Add(m); transparent.Add(models[m].shapes[shp]);
else else
opaque.Add(m); opaque.Add(models[m].shapes[shp]);
} }
for (int shp = 0; shp < models[m].shapes.Count; shp++)
foreach (FSHP shp in mdl.shapes)
{ {
DrawModel(shp, mdl, shader, mdl.IsSelected); DrawModel(models[m].shapes[shp], models[m], shader, models[m].IsSelected);
} }
} }
} }
shader.DisableVertexAttributes(); shader.DisableVertexAttributes();
} }
@ -472,8 +473,10 @@ namespace FirstPlugin
LoadPBRMaps(shader); LoadPBRMaps(shader);
foreach (MatTexture matex in mat.TextureMaps) for (int t = 0; t < mat.TextureMaps.Count; t++)
{ {
MatTexture matex = (MatTexture)mat.TextureMaps[t];
if (matex.Type == MatTexture.TextureType.Diffuse) if (matex.Type == MatTexture.TextureType.Diffuse)
TextureUniform(shader, mat, mat.HasDiffuseMap, "DiffuseMap", matex); TextureUniform(shader, mat, mat.HasDiffuseMap, "DiffuseMap", matex);
else if (matex.Type == MatTexture.TextureType.Normal) else if (matex.Type == MatTexture.TextureType.Normal)
@ -547,7 +550,6 @@ namespace FirstPlugin
{ {
foreach (var ftexContainer in PluginRuntime.ftexContainers) foreach (var ftexContainer in PluginRuntime.ftexContainers)
{ {
if (ftexContainer.ResourceNodes.ContainsKey(activeTex)) if (ftexContainer.ResourceNodes.ContainsKey(activeTex))
{ {
FTEX ftex = (FTEX)ftexContainer.ResourceNodes[activeTex]; FTEX ftex = (FTEX)ftexContainer.ResourceNodes[activeTex];
@ -686,6 +688,8 @@ namespace FirstPlugin
if (!Runtime.OpenTKInitialized) if (!Runtime.OpenTKInitialized)
return; return;
UpdateModelList();
STProgressBar progressBar = new STProgressBar(); STProgressBar progressBar = new STProgressBar();
progressBar.Task = "Updating Vertex Data..."; progressBar.Task = "Updating Vertex Data...";
progressBar.Value = 0; progressBar.Value = 0;
@ -705,34 +709,31 @@ namespace FirstPlugin
int TotalShapeCount = models.Sum(b => b.shapes.Count); int TotalShapeCount = models.Sum(b => b.shapes.Count);
int curShape = 0;
int value = 0; int value = 0;
foreach (FMDL mdl in models) for (int m = 0; m < models.Count; m++)
{ {
//Reset min/max //Reset min/max
mdl.MaxPosition = new Vector3(0); models[m].MaxPosition = new Vector3(0);
mdl.MinPosition = new Vector3(0); models[m].MinPosition = new Vector3(0);
foreach (FSHP m in mdl.shapes) for (int shp = 0; shp < models[m].shapes.Count; shp++)
{ {
progressBar.Task = "Updating Shape... " + m.Text; progressBar.Task = "Updating Shape... " + models[m].shapes[shp].Text;
value = ((curShape * 100) / TotalShapeCount); value = ((shp * 100) / TotalShapeCount);
progressBar.Value = value; progressBar.Value = value;
progressBar.Refresh(); progressBar.Refresh();
m.Offset = poffset * 4; models[m].shapes[shp].Offset = poffset * 4;
List<DisplayVertex> pv = m.CreateDisplayVertices(mdl); List<DisplayVertex> pv = models[m].shapes[shp].CreateDisplayVertices(models[m]);
Vs.AddRange(pv); Vs.AddRange(pv);
for (int i = 0; i < m.lodMeshes[m.DisplayLODIndex].displayFaceSize; i++) for (int i = 0; i < models[m].shapes[shp].lodMeshes[models[m].shapes[shp].DisplayLODIndex].displayFaceSize; i++)
{ {
Ds.Add(m.display[i] + voffset); Ds.Add(models[m].shapes[shp].display[i] + voffset);
} }
poffset += m.lodMeshes[m.DisplayLODIndex].displayFaceSize; poffset += models[m].shapes[shp].lodMeshes[models[m].shapes[shp].DisplayLODIndex].displayFaceSize;
voffset += pv.Count; voffset += pv.Count;
curShape++;
} }
} }
@ -807,8 +808,8 @@ namespace FirstPlugin
{ {
AglShaderTurbo aglShader = new AglShaderTurbo(); AglShaderTurbo aglShader = new AglShaderTurbo();
foreach (var renderInfo in mat.renderinfo) for (int i = 0; i < mat.renderinfo.Count; i++)
aglShader.LoadRenderInfo(renderInfo); aglShader.LoadRenderInfo(mat.renderinfo[i]);
// aglShader.LoadRenderPass(mat, shader); // aglShader.LoadRenderPass(mat, shader);
} }