Skip to content

Commit

Permalink
Merge remote-tracking branch 'refs/remotes/gdkchan/master'
Browse files Browse the repository at this point in the history
  • Loading branch information
smb123w64gb committed Nov 28, 2016
2 parents 0032619 + ea81246 commit d738e92
Show file tree
Hide file tree
Showing 11 changed files with 305 additions and 20 deletions.
176 changes: 176 additions & 0 deletions Ohana3DS Rebirth/Ohana/Animations/GfMotion.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,176 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

namespace Ohana3DS_Rebirth.Ohana.Animations
{
class GfMotion
{
public static List<RenderBase.OSkeletalAnimation> load(Stream data)
{
List<RenderBase.OSkeletalAnimation> output = new List<RenderBase.OSkeletalAnimation>();

BinaryReader input = new BinaryReader(data);

uint animCount = input.ReadUInt32();

for (int anm = 0; anm < animCount; anm++)
{
data.Seek(4 + anm * 4, SeekOrigin.Begin);

uint animAddr = input.ReadUInt32();
if (animAddr == 0) continue;

data.Seek(animAddr + 4, SeekOrigin.Begin);

output.Add(loadAnim(input, anm));
}

data.Close();

return output;
}

public static RenderBase.OSkeletalAnimation loadAnim(BinaryReader input, int anm = 0)
{
Stream data = input.BaseStream;

RenderBase.OSkeletalAnimation anim = new RenderBase.OSkeletalAnimation();
anim.name = "anim_" + anm;
anim.frameSize = 1;

uint unkFlags = input.ReadUInt32();
uint unkCount = input.ReadUInt32();
data.Seek(0x24 + unkCount * 0xc, SeekOrigin.Current);

uint boneNamesCount = input.ReadUInt32();
uint boneNamesLength = input.ReadUInt32();

long boneNamesStart = data.Position;

string[] boneNames = new string[boneNamesCount];

for (int b = 0; b < boneNamesCount; b++)
{
boneNames[b] = IOUtils.readStringWithLength(input, input.ReadByte());
}

data.Seek(boneNamesStart + boneNamesLength, SeekOrigin.Begin);

byte bbone = 0;

for (int b = 0; b < boneNames.Length; b++)
{
uint flags = input.ReadUInt32();
uint frameLength = input.ReadUInt32();
long frameStart = data.Position;

RenderBase.OSkeletalAnimationBone bone = new RenderBase.OSkeletalAnimationBone();

bone.name = boneNames[b];
bone.isAxisAngle = flags >> 31 == 0;

for (int axis = 0; axis < 9; axis++)
{
bool axisExists = ((flags >> (2 + axis * 3)) & 1) != 0;
bool axisConst = ((flags >> (axis * 3)) & 3) == 3;

bool mul2 = axis > 2 && axis < 6 && (flags >> 31) == 0;

if (axisConst) addFrame(bone, mul2, axis, input.ReadSingle());
if (!axisExists) continue;

uint keyFramesCount = input.ReadUInt32();

byte[] keyFrames = new byte[keyFramesCount];

for (int n = 0; n < keyFramesCount; n++) { keyFrames[n] = input.ReadByte(); if (keyFrames[n] > bbone) bbone = keyFrames[n]; }
while ((data.Position & 3) != 0) input.ReadByte();

float valueScale = input.ReadSingle();
float valueOffset = input.ReadSingle();
float slopeScale = input.ReadSingle();
float slopeOffset = input.ReadSingle();

for (int i = 0; i < keyFramesCount; i++)
{
ushort qvalue = input.ReadUInt16();
ushort qslope = input.ReadUInt16();

float value = valueOffset + (qvalue / (float)0xffff) * valueScale;
float slope = slopeOffset + (qslope / (float)0xffff) * slopeScale;

addFrame(bone, mul2, axis, value, keyFrames[i], slope);
}
}

anim.bone.Add(bone);
}

foreach (var b in anim.bone)
{
b.scaleX.interpolation = RenderBase.OInterpolationMode.hermite;
b.scaleY.interpolation = RenderBase.OInterpolationMode.hermite;
b.scaleZ.interpolation = RenderBase.OInterpolationMode.hermite;

b.rotationX.interpolation = RenderBase.OInterpolationMode.hermite;
b.rotationY.interpolation = RenderBase.OInterpolationMode.hermite;
b.rotationZ.interpolation = RenderBase.OInterpolationMode.hermite;

b.translationX.interpolation = RenderBase.OInterpolationMode.hermite;
b.translationY.interpolation = RenderBase.OInterpolationMode.hermite;
b.translationZ.interpolation = RenderBase.OInterpolationMode.hermite;

b.scaleX.exists = b.scaleX.keyFrames.Count > 0;
b.scaleY.exists = b.scaleY.keyFrames.Count > 0;
b.scaleZ.exists = b.scaleZ.keyFrames.Count > 0;

b.rotationX.exists = b.rotationX.keyFrames.Count > 0;
b.rotationY.exists = b.rotationY.keyFrames.Count > 0;
b.rotationZ.exists = b.rotationZ.keyFrames.Count > 0;

b.translationX.exists = b.translationX.keyFrames.Count > 0;
b.translationY.exists = b.translationY.keyFrames.Count > 0;
b.translationZ.exists = b.translationZ.keyFrames.Count > 0;
}

if (bbone > 0) anim.frameSize = bbone;

return anim;
}

private static void addFrame(
RenderBase.OSkeletalAnimationBone bone,
bool mul2,
int axis,
float val,
float frame = 0,
float slope = 0)
{
RenderBase.OAnimationKeyFrame frm = new RenderBase.OAnimationKeyFrame();

if (mul2) val *= 2;

frm.frame = frame;
frm.inSlope = slope;
frm.outSlope = slope;
frm.value = val;

switch (axis)
{
case 0: bone.scaleX.keyFrames.Add(frm); break;
case 1: bone.scaleY.keyFrames.Add(frm); break;
case 2: bone.scaleZ.keyFrames.Add(frm); break;

case 3: bone.rotationX.keyFrames.Add(frm); break;
case 4: bone.rotationY.keyFrames.Add(frm); break;
case 5: bone.rotationZ.keyFrames.Add(frm); break;

case 6: bone.translationX.keyFrames.Add(frm); break;
case 7: bone.translationY.keyFrames.Add(frm); break;
case 8: bone.translationZ.keyFrames.Add(frm); break;
}
}
}
}
2 changes: 2 additions & 0 deletions Ohana3DS Rebirth/Ohana/FileIO.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
using Ohana3DS_Rebirth.Ohana.Textures;
using Ohana3DS_Rebirth.Ohana.Compressions;
using Ohana3DS_Rebirth.Ohana.Containers;
using Ohana3DS_Rebirth.Ohana.Animations;

namespace Ohana3DS_Rebirth.Ohana
{
Expand Down Expand Up @@ -62,6 +63,7 @@ public static file load(Stream data)
switch (peek(input))
{
case 0x00010000: return new file { data = GfModel.load(data), type = formatType.model };
case 0x00060000: return new file { data = GfMotion.loadAnim(input), type = formatType.anims };
case 0x15041213: return new file { data = GfTexture.load(data), type = formatType.image };
case 0x15122117:
RenderBase.OModelGroup mdls = new RenderBase.OModelGroup();
Expand Down
2 changes: 2 additions & 0 deletions Ohana3DS Rebirth/Ohana/Models/BCH.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1547,6 +1547,8 @@ public static RenderBase.OModelGroup load(MemoryStream data)
boneMatrix.M33 = input.ReadSingle();
boneMatrix.M43 = input.ReadSingle();

bone.invTransform = boneMatrix;

bone.name = readString(input);

uint metaDataPointerOffset = input.ReadUInt32();
Expand Down
13 changes: 7 additions & 6 deletions Ohana3DS Rebirth/Ohana/Models/GenericFormats/DAE.cs
Original file line number Diff line number Diff line change
Expand Up @@ -127,10 +127,10 @@ public class daeColor
public void set(Color col)
{
color = string.Format(
"{0} {1} {2} {3}",
getString(col.R / 255f),
getString(col.G / 255f),
getString(col.B / 255f),
"{0} {1} {2} {3}",
getString(col.R / 255f),
getString(col.G / 255f),
getString(col.B / 255f),
getString(col.A / 255f));
}

Expand Down Expand Up @@ -880,7 +880,7 @@ public static void export(RenderBase.OModelGroup model, string fileName, int mod
controller.skin.src.Add(joints);

daeSource bindPoses = new daeSource();
bindPoses.id = meshName +"_ctrl_inv_bind_poses_id";
bindPoses.id = meshName + "_ctrl_inv_bind_poses_id";
bindPoses.float_array = new daeFloatArray();
bindPoses.float_array.id = meshName + "_ctrl_inv_bind_poses_array_id";
bindPoses.float_array.count = (uint)(mdl.skeleton.Count * 16);
Expand Down Expand Up @@ -991,7 +991,8 @@ public static void export(RenderBase.OModelGroup model, string fileName, int mod
scene.url = "#" + vs.id;
dae.scene.Add(scene);

XmlWriterSettings settings = new XmlWriterSettings {
XmlWriterSettings settings = new XmlWriterSettings
{
Encoding = Encoding.UTF8,
Indent = true,
IndentChars = "\t"
Expand Down
6 changes: 6 additions & 0 deletions Ohana3DS Rebirth/Ohana/Models/GenericFormats/SMD.cs
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,12 @@ public static void export(RenderBase.OModelGroup model, string fileName, int mod
if (b.rotationX.exists) newBone.rotation.x = AnimationUtils.getKey(b.rotationX, frame);
if (b.rotationY.exists) newBone.rotation.y = AnimationUtils.getKey(b.rotationY, frame);
if (b.rotationZ.exists) newBone.rotation.z = AnimationUtils.getKey(b.rotationZ, frame);

if (b.isAxisAngle)
{
RenderBase.OVector4 q = new RenderBase.OVector4(newBone.rotation.normalize(), newBone.rotation.length());
newBone.rotation = q.toEuler();
}
}

break;
Expand Down
12 changes: 10 additions & 2 deletions Ohana3DS Rebirth/Ohana/Models/PocketMonsters/CM.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using Ohana3DS_Rebirth.Ohana.Containers;

using Ohana3DS_Rebirth.Ohana.Animations;
using Ohana3DS_Rebirth.Ohana.Containers;
using System.Collections.Generic;
using System.IO;

namespace Ohana3DS_Rebirth.Ohana.Models.PocketMonsters
Expand All @@ -18,6 +19,13 @@ public static RenderBase.OModelGroup load(Stream data)
OContainer container = PkmnContainer.load(data);
models = GfModel.load(new MemoryStream(container.content[0].data));

List<RenderBase.OSkeletalAnimation> anms = GfMotion.load(new MemoryStream(container.content[1].data));

foreach (RenderBase.OSkeletalAnimation anm in anms)
{
models.skeletalAnimation.list.Add(anm);
}

return models;
}
}
Expand Down
4 changes: 2 additions & 2 deletions Ohana3DS Rebirth/Ohana/Models/PocketMonsters/GfModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,6 @@ public static RenderBase.OModelGroup load(Stream data)
switch (sect)
{
case MODEL_SECT:


RenderBase.OModel mdl = loadModel(data, true);
mdl.name = name;

Expand Down Expand Up @@ -164,6 +162,8 @@ public static RenderBase.OModel loadModel(Stream data, bool keepOpen = false)
input.ReadSingle(),
input.ReadSingle());

bone.absoluteScale = new RenderBase.OVector3(bone.scale);

mdl.skeleton.Add(bone);
boneNames.Add(boneName);
}
Expand Down
18 changes: 15 additions & 3 deletions Ohana3DS Rebirth/Ohana/Models/PocketMonsters/PC.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
using System.IO;
using Ohana3DS_Rebirth.Ohana.Containers;

using Ohana3DS_Rebirth.Ohana.Containers;
using System;
using System.Diagnostics;
using System.IO;

namespace Ohana3DS_Rebirth.Ohana.Models.PocketMonsters
{
Expand All @@ -19,13 +21,23 @@ public static RenderBase.OModelGroup load(Stream data)

foreach (OContainer.fileEntry file in container.content)
{
FileIO.file loaded = FileIO.load(new MemoryStream(file.data));
FileIO.file loaded = new FileIO.file();

try
{
loaded = FileIO.load(new MemoryStream(file.data));
}
catch (Exception e)
{
Debug.WriteLine(string.Format("Error opening file:\n{0}\n{1}", e.Message, e.StackTrace));
}

if (loaded.data == null) continue;

switch (loaded.type)
{
case FileIO.formatType.model: models.merge((RenderBase.OModelGroup)loaded.data); break;
case FileIO.formatType.anims: models.skeletalAnimation.list.Add((RenderBase.OSkeletalAnimation)loaded.data); break;
case FileIO.formatType.image: models.texture.Add((RenderBase.OTexture)loaded.data); break;
}
}
Expand Down
Loading

0 comments on commit d738e92

Please sign in to comment.