Almost there object casting
This commit is contained in:
parent
122bd2bfa7
commit
1532a2750c
|
@ -119,6 +119,8 @@ public class LightMapper
|
|||
|
||||
var vertices = new List<Vector3>();
|
||||
var indices = new List<int>();
|
||||
|
||||
// Worldrep mesh
|
||||
foreach (var cell in worldRep.Cells)
|
||||
{
|
||||
var numPolys = cell.PolyCount;
|
||||
|
@ -169,6 +171,102 @@ public class LightMapper
|
|||
}
|
||||
}
|
||||
|
||||
// Object meshes??
|
||||
// TODO: Should this throw?
|
||||
if (!_mission.TryGetChunk<BrList>("BRLIST", out var brList))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
foreach (var brush in brList.Brushes)
|
||||
{
|
||||
if (brush.media != BrList.Brush.Media.Object)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var id = (int)brush.brushInfo;
|
||||
var modelNameProp = _hierarchy.GetProperty<PropLabel>(id, "P$ModelName");
|
||||
var scaleProp = _hierarchy.GetProperty<PropVector>(id, "P$Scale");
|
||||
var renderTypeProp = _hierarchy.GetProperty<PropRenderType>(id, "P$RenderTyp");
|
||||
var jointPosProp = _hierarchy.GetProperty<PropJointPos>(id, "P$JointPos");
|
||||
var immobileProp = _hierarchy.GetProperty<PropBool>(id, "P$Immobile");
|
||||
var staticShadowProp = _hierarchy.GetProperty<PropBool>(id, "P$StatShad");
|
||||
|
||||
var joints = jointPosProp?.Positions ?? [0, 0, 0, 0, 0, 0];
|
||||
var castsShadows = (immobileProp?.value ?? false) || (staticShadowProp?.value ?? false);
|
||||
var renderMode = renderTypeProp?.mode ?? PropRenderType.Mode.Normal;
|
||||
|
||||
// TODO: Check which rendermodes cast shadows :)
|
||||
if (modelNameProp == null || !castsShadows || renderMode != PropRenderType.Mode.Normal)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// Let's try and place an object :)
|
||||
var modelName = modelNameProp.value.ToLower() + ".bin";
|
||||
var modelPath = _campaign.GetResourcePath(ResourceType.Object, modelName);
|
||||
if (modelPath == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// TODO: Handle failing to find model more gracefully
|
||||
var pos = brush.position;
|
||||
var rot = brush.angle;
|
||||
var scale = scaleProp?.value ?? Vector3.One;
|
||||
var model = new ModelFile(modelPath);
|
||||
pos -= model.Header.Center;
|
||||
|
||||
// for each object modify the vertices
|
||||
// TODO: Something about the transform is fucky
|
||||
foreach (var subObj in model.Objects)
|
||||
{
|
||||
Console.WriteLine($"ID: {subObj.Joint}, l: {joints.Length}");
|
||||
var jointTrans = Matrix4x4.Identity;
|
||||
if (subObj.Joint != -1)
|
||||
{
|
||||
var ang = float.DegreesToRadians(joints[subObj.Joint]);
|
||||
var jointRot = Matrix4x4.CreateFromYawPitchRoll(0, ang, 0);
|
||||
var objTrans = subObj.Transform;
|
||||
jointTrans = jointRot * objTrans;
|
||||
}
|
||||
var scalePart = Matrix4x4.CreateScale(scale);
|
||||
var rotPart = Matrix4x4.CreateFromYawPitchRoll(float.DegreesToRadians(rot.X),
|
||||
float.DegreesToRadians(rot.Y), float.DegreesToRadians(rot.Z));
|
||||
var transPart = Matrix4x4.CreateTranslation(pos);
|
||||
var transform = jointTrans * scalePart * rotPart * transPart;
|
||||
|
||||
var start = subObj.PointIdx;
|
||||
var end = start + subObj.PointCount;
|
||||
for (var i = start; i < end; i++)
|
||||
{
|
||||
var v = model.Vertices[i];
|
||||
model.Vertices[i] = Vector3.Transform(v, transform);
|
||||
|
||||
Console.WriteLine($"Raw: {v}, Pos: {model.Vertices[i]}");
|
||||
}
|
||||
}
|
||||
|
||||
// for each polygon slam it's vertices and indices :)
|
||||
foreach (var poly in model.Polygons)
|
||||
{
|
||||
var indexOffset = vertices.Count;
|
||||
foreach (var idx in poly.VertexIndices)
|
||||
{
|
||||
vertices.Add(model.Vertices[idx]);
|
||||
}
|
||||
|
||||
for (int i = 1; i < poly.VertexCount - 1; i++)
|
||||
{
|
||||
indices.Add(indexOffset);
|
||||
indices.Add(indexOffset + i);
|
||||
indices.Add(indexOffset + i + 1);
|
||||
_triangleTypeMap.Add(SurfaceType.Solid);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var rt = new Raytracer();
|
||||
rt.AddMesh(new TriangleMesh([.. vertices], [.. indices]));
|
||||
rt.CommitScene();
|
||||
|
|
Loading…
Reference in New Issue