This commit is contained in:
Lauri Räsänen 2020-09-26 13:29:30 +03:00
parent 28cf51a6b6
commit 270fce7f9e
9 changed files with 385 additions and 356 deletions

1
.prettierignore Normal file
View file

@ -0,0 +1 @@
build/

20
.prettierrc Normal file
View file

@ -0,0 +1,20 @@
{
"arrowParens": "always",
"bracketSpacing": true,
"cursorOffset": -1,
"endOfLine": "lf",
"htmlWhitespaceSensitivity": "css",
"insertPragma": false,
"jsxBracketSameLine": false,
"jsxSingleQuote": false,
"printWidth": 140,
"proseWrap": "preserve",
"quoteProps": "as-needed",
"requirePragma": false,
"semi": true,
"singleQuote": false,
"tabWidth": 2,
"trailingComma": "es5",
"useTabs": false,
"vueIndentScriptAndStyle": false
}

View file

@ -1,9 +1,11 @@
## demo-interp ## demo-interp
An experiemental project for interpolating TF2 SourceTV demo files. An experiemental project for interpolating TF2 SourceTV demo files.
Normally a SourceTV demo has a Packet every 4 ticks, this fills out the ticks inbetween by interpolating between the Packets. Normally a SourceTV demo has a Packet every 4 ticks, this fills out the ticks inbetween by interpolating between the Packets.
This may be pointless but there is a visible difference when using `cl_interp` values lower than ~60ms (4 / 66 ticks/s). This may be pointless but there is a visible difference when using `cl_interp` values lower than ~60ms (4 / 66 ticks/s).
## usage ## usage
`yarn install` `yarn install`
`yarn build` `yarn build`
`cd test` `cd test`

View file

@ -12,7 +12,7 @@ function lerp(start, end, amount) {
} }
function circleLerp(start, end, amount) { function circleLerp(start, end, amount) {
var shortestAngle = ((((end - start) % 360) + 540) % 360) - 180; var shortestAngle = ((((end - start) % 360) + 540) % 360) - 180;
return start + (shortestAngle * amount) % 360; return start + ((shortestAngle * amount) % 360);
} }
function interpNumber(start, end, amount, lowValue, highValue) { function interpNumber(start, end, amount, lowValue, highValue) {
if (lowValue === 0 && highValue === 360) { if (lowValue === 0 && highValue === 360) {
@ -127,10 +127,7 @@ function interpEntity(start, end, amount) {
return start; return start;
} }
function incrementEntityTicks(entity, amount) { function incrementEntityTicks(entity, amount) {
var names = [ var names = ["m_nTickBase", "m_flSimulationTime"];
"m_nTickBase",
"m_flSimulationTime"
];
for (let prop of entity.props) { for (let prop of entity.props) {
if (names.includes(prop.definition.name)) { if (names.includes(prop.definition.name)) {
prop.value = prop.value + amount; prop.value = prop.value + amount;
@ -194,7 +191,7 @@ class InterpTransformer extends Parser_1.Parser {
for (let e of p.entities) { for (let e of p.entities) {
if (p.removedEntities.includes(e.entityIndex)) { if (p.removedEntities.includes(e.entityIndex)) {
//console.log("packet includes removed ent"); //console.log("packet includes removed ent");
delete (lastKnownProps[`${e.entityIndex}:${e.serverClass.id}`]); delete lastKnownProps[`${e.entityIndex}:${e.serverClass.id}`];
} }
// Store from entity // Store from entity
for (const prop of e.props) { for (const prop of e.props) {
@ -233,7 +230,7 @@ class InterpTransformer extends Parser_1.Parser {
for (const index of newPacket.removedEntities) { for (const index of newPacket.removedEntities) {
for (let propIndex = Object.keys(lastKnownProps).length - 1; propIndex > 0; propIndex--) { for (let propIndex = Object.keys(lastKnownProps).length - 1; propIndex > 0; propIndex--) {
if (Object.keys(lastKnownProps)[propIndex].startsWith(index.toString() + ":")) { if (Object.keys(lastKnownProps)[propIndex].startsWith(index.toString() + ":")) {
delete (lastKnownProps[Object.keys(lastKnownProps)[propIndex]]); delete lastKnownProps[Object.keys(lastKnownProps)[propIndex]];
} }
} }
} }
@ -318,7 +315,7 @@ class InterpTransformer extends Parser_1.Parser {
// 0 0.25 1.0 0.25 // 0 0.25 1.0 0.25
// 0.25 0.5 1.0 1/3 // 0.25 0.5 1.0 1/3
// 0.5 0.75 1.0 0.5 // 0.5 0.75 1.0 0.5
var interp = 0.25 * (1 / (1 - (0.25 * i))); var interp = 0.25 * (1 / (1 - 0.25 * i));
entity = interpEntity(entity, newEntity, interp); entity = interpEntity(entity, newEntity, interp);
} }
} }

File diff suppressed because one or more lines are too long

View file

@ -11,6 +11,7 @@
}, },
"scripts": { "scripts": {
"postinstall": "patch-package", "postinstall": "patch-package",
"build": "tsc" "build": "tsc",
"format": "prettier --write ."
} }
} }

View file

@ -1,10 +1,10 @@
import { BitStream } from 'bit-buffer'; import { BitStream } from "bit-buffer";
import { readFileSync, writeFileSync } from 'fs'; import { readFileSync, writeFileSync } from "fs";
import { DynamicBitStream } from '@demostf/demo.js/build/DynamicBitStream'; import { DynamicBitStream } from "@demostf/demo.js/build/DynamicBitStream";
import { Message, MessageType, PacketMessage } from '@demostf/demo.js/build/Data/Message'; import { Message, MessageType, PacketMessage } from "@demostf/demo.js/build/Data/Message";
import { Parser } from '@demostf/demo.js/build/Parser'; import { Parser } from "@demostf/demo.js/build/Parser";
import { Encoder } from '@demostf/demo.js/build/Encoder'; import { Encoder } from "@demostf/demo.js/build/Encoder";
import { PacketEntity } from '@demostf/demo.js/build/Data/PacketEntity'; import { PacketEntity } from "@demostf/demo.js/build/Data/PacketEntity";
function lerp(start: number, end: number, amount: number) { function lerp(start: number, end: number, amount: number) {
return start + (end - start) * amount; return start + (end - start) * amount;
@ -12,7 +12,7 @@ function lerp(start: number, end: number, amount: number) {
function circleLerp(start: number, end: number, amount: number) { function circleLerp(start: number, end: number, amount: number) {
var shortestAngle = ((((end - start) % 360) + 540) % 360) - 180; var shortestAngle = ((((end - start) % 360) + 540) % 360) - 180;
return start + (shortestAngle * amount) % 360; return start + ((shortestAngle * amount) % 360);
} }
function interpNumber(start: number, end: number, amount: number, lowValue: number, highValue: number) { function interpNumber(start: number, end: number, amount: number, lowValue: number, highValue: number) {
@ -94,7 +94,7 @@ const propNames = [
]; ];
const vecKeys = ["x", "y", "z"]; const vecKeys = ["x", "y", "z"];
const EF_NOINTERP = 8 const EF_NOINTERP = 8;
function interpEntity(start: PacketEntity, end: PacketEntity, amount: number): PacketEntity { function interpEntity(start: PacketEntity, end: PacketEntity, amount: number): PacketEntity {
for (let prop1 of start.props) { for (let prop1 of start.props) {
@ -105,7 +105,13 @@ function interpEntity(start: PacketEntity, end: PacketEntity, amount: number): P
if (prop1.definition.fullName !== prop2.definition.fullName) continue; if (prop1.definition.fullName !== prop2.definition.fullName) continue;
if (typeof prop1.value === "number") { if (typeof prop1.value === "number") {
prop1.value = interpNumber(prop1.value as number, prop2.value as number, amount, prop1.definition.lowValue, prop1.definition.highValue); prop1.value = interpNumber(
prop1.value as number,
prop2.value as number,
amount,
prop1.definition.lowValue,
prop1.definition.highValue
);
break; break;
} }
@ -130,7 +136,13 @@ function interpEntity(start: PacketEntity, end: PacketEntity, amount: number): P
if (cont) continue; if (cont) continue;
for (const key of vecKeys) { for (const key of vecKeys) {
prop1.value[key] = interpNumber(prop1.value[key] as number, prop2.value[key] as number, amount, prop1.definition.lowValue, prop1.definition.highValue); prop1.value[key] = interpNumber(
prop1.value[key] as number,
prop2.value[key] as number,
amount,
prop1.definition.lowValue,
prop1.definition.highValue
);
} }
break; break;
} }
@ -141,10 +153,7 @@ function interpEntity(start: PacketEntity, end: PacketEntity, amount: number): P
} }
function incrementEntityTicks(entity: PacketEntity, amount: number): PacketEntity { function incrementEntityTicks(entity: PacketEntity, amount: number): PacketEntity {
var names = [ var names = ["m_nTickBase", "m_flSimulationTime"];
"m_nTickBase",
"m_flSimulationTime"
];
for (let prop of entity.props) { for (let prop of entity.props) {
if (names.includes(prop.definition.name)) { if (names.includes(prop.definition.name)) {
prop.value = (prop.value as number) + amount; prop.value = (prop.value as number) + amount;
@ -221,7 +230,7 @@ class InterpTransformer extends Parser {
for (let e of p.entities as PacketEntity[]) { for (let e of p.entities as PacketEntity[]) {
if (p.removedEntities.includes(e.entityIndex)) { if (p.removedEntities.includes(e.entityIndex)) {
//console.log("packet includes removed ent"); //console.log("packet includes removed ent");
delete (lastKnownProps[`${e.entityIndex}:${e.serverClass.id}`]); delete lastKnownProps[`${e.entityIndex}:${e.serverClass.id}`];
} }
// Store from entity // Store from entity
@ -257,7 +266,6 @@ class InterpTransformer extends Parser {
// packetEntities // packetEntities
for (let entity of packet.entities as PacketEntity[]) { for (let entity of packet.entities as PacketEntity[]) {
// Loop through new message and interp // Loop through new message and interp
for (let newPacket of message.packets) { for (let newPacket of message.packets) {
if (newPacket.packetType !== "packetEntities") { if (newPacket.packetType !== "packetEntities") {
@ -267,7 +275,7 @@ class InterpTransformer extends Parser {
for (const index of newPacket.removedEntities) { for (const index of newPacket.removedEntities) {
for (let propIndex = Object.keys(lastKnownProps).length - 1; propIndex > 0; propIndex--) { for (let propIndex = Object.keys(lastKnownProps).length - 1; propIndex > 0; propIndex--) {
if (Object.keys(lastKnownProps)[propIndex].startsWith(index.toString() + ":")) { if (Object.keys(lastKnownProps)[propIndex].startsWith(index.toString() + ":")) {
delete (lastKnownProps[Object.keys(lastKnownProps)[propIndex]]); delete lastKnownProps[Object.keys(lastKnownProps)[propIndex]];
} }
} }
} }
@ -364,7 +372,7 @@ class InterpTransformer extends Parser {
// 0 0.25 1.0 0.25 // 0 0.25 1.0 0.25
// 0.25 0.5 1.0 1/3 // 0.25 0.5 1.0 1/3
// 0.5 0.75 1.0 0.5 // 0.5 0.75 1.0 0.5
var interp = 0.25 * (1 / (1 - (0.25 * i))); var interp = 0.25 * (1 / (1 - 0.25 * i));
entity = interpEntity(entity, newEntity, interp); entity = interpEntity(entity, newEntity, interp);
} }

View file

@ -1,3 +1,3 @@
var interp = require('../build/index.js').interp; var interp = require("../build/index.js").interp;
interp('test.dem', 'test_out.dem'); interp("test.dem", "test_out.dem");