📄 splines.cpp
字号:
}
token = Com_Parse(text);
} while (1);
if ( !strcmp (token, "}") ) {
break;
}
} while (1);
Com_UngetToken();
Com_MatchToken( text, "}" );
}
void idCameraEvent::write(fileHandle_t file, const char *name) {
idStr s = va("\t%s {\n", name);
FS_Write(s.c_str(), s.length(), file);
s = va("\t\ttype %d\n", static_cast<int>(type));
FS_Write(s.c_str(), s.length(), file);
s = va("\t\tparam %s\n", paramStr.c_str());
FS_Write(s.c_str(), s.length(), file);
s = va("\t\ttime %d\n", time);
FS_Write(s.c_str(), s.length(), file);
s = "\t}\n";
FS_Write(s.c_str(), s.length(), file);
}
const char *idCameraPosition::positionStr[] = {
"Fixed",
"Interpolated",
"Spline",
};
const idVec3_t *idInterpolatedPosition::getPosition(long t) {
static idVec3_t interpolatedPos;
float velocity = getVelocity(t);
float timePassed = t - lastTime;
lastTime = t;
// convert to seconds
timePassed /= 1000;
float distToTravel = timePassed *= velocity;
idVec3_t temp = startPos;
temp -= endPos;
float distance = temp.Length();
distSoFar += distToTravel;
float percent = (float)(distSoFar) / distance;
if (percent > 1.0) {
percent = 1.0;
} else if (percent < 0.0) {
percent = 0.0;
}
// the following line does a straigt calc on percentage of time
// float percent = (float)(startTime + time - t) / time;
idVec3_t v1 = startPos;
idVec3_t v2 = endPos;
v1 *= (1.0 - percent);
v2 *= percent;
v1 += v2;
interpolatedPos = v1;
return &interpolatedPos;
}
void idCameraFOV::parse(const char *(*text) ) {
const char *token;
Com_MatchToken( text, "{" );
do {
token = Com_Parse( text );
if ( !token[0] ) {
break;
}
if ( !strcmp (token, "}") ) {
break;
}
// here we may have to jump over brush epairs ( only used in editor )
do {
// if token is not a brace, it is a key for a key/value pair
if ( !token[0] || !strcmp (token, "(") || !strcmp(token, "}")) {
break;
}
Com_UngetToken();
idStr key = Com_ParseOnLine(text);
const char *token = Com_Parse(text);
if (Q_stricmp(key.c_str(), "fov") == 0) {
fov = atof(token);
} else if (Q_stricmp(key.c_str(), "startFOV") == 0) {
startFOV = atof(token);
} else if (Q_stricmp(key.c_str(), "endFOV") == 0) {
endFOV = atof(token);
} else if (Q_stricmp(key.c_str(), "time") == 0) {
time = atoi(token);
}
token = Com_Parse(text);
} while (1);
if ( !strcmp (token, "}") ) {
break;
}
} while (1);
Com_UngetToken();
Com_MatchToken( text, "}" );
}
bool idCameraPosition::parseToken(const char *key, const char *(*text)) {
const char *token = Com_Parse(text);
if (Q_stricmp(key, "time") == 0) {
time = atol(token);
return true;
} else if (Q_stricmp(key, "type") == 0) {
type = static_cast<idCameraPosition::positionType>(atoi(token));
return true;
} else if (Q_stricmp(key, "velocity") == 0) {
long t = atol(token);
token = Com_Parse(text);
long d = atol(token);
token = Com_Parse(text);
float s = atof(token);
addVelocity(t, d, s);
return true;
} else if (Q_stricmp(key, "baseVelocity") == 0) {
baseVelocity = atof(token);
return true;
} else if (Q_stricmp(key, "name") == 0) {
name = token;
return true;
} else if (Q_stricmp(key, "time") == 0) {
time = atoi(token);
return true;
}
Com_UngetToken();
return false;
}
void idFixedPosition::parse(const char *(*text) ) {
const char *token;
Com_MatchToken( text, "{" );
do {
token = Com_Parse( text );
if ( !token[0] ) {
break;
}
if ( !strcmp (token, "}") ) {
break;
}
// here we may have to jump over brush epairs ( only used in editor )
do {
// if token is not a brace, it is a key for a key/value pair
if ( !token[0] || !strcmp (token, "(") || !strcmp(token, "}")) {
break;
}
Com_UngetToken();
idStr key = Com_ParseOnLine(text);
const char *token = Com_Parse(text);
if (Q_stricmp(key.c_str(), "pos") == 0) {
Com_UngetToken();
Com_Parse1DMatrix( text, 3, pos );
} else {
Com_UngetToken();
idCameraPosition::parseToken(key.c_str(), text);
}
token = Com_Parse(text);
} while (1);
if ( !strcmp (token, "}") ) {
break;
}
} while (1);
Com_UngetToken();
Com_MatchToken( text, "}" );
}
void idInterpolatedPosition::parse(const char *(*text) ) {
const char *token;
Com_MatchToken( text, "{" );
do {
token = Com_Parse( text );
if ( !token[0] ) {
break;
}
if ( !strcmp (token, "}") ) {
break;
}
// here we may have to jump over brush epairs ( only used in editor )
do {
// if token is not a brace, it is a key for a key/value pair
if ( !token[0] || !strcmp (token, "(") || !strcmp(token, "}")) {
break;
}
Com_UngetToken();
idStr key = Com_ParseOnLine(text);
const char *token = Com_Parse(text);
if (Q_stricmp(key.c_str(), "startPos") == 0) {
Com_UngetToken();
Com_Parse1DMatrix( text, 3, startPos );
} else if (Q_stricmp(key.c_str(), "endPos") == 0) {
Com_UngetToken();
Com_Parse1DMatrix( text, 3, endPos );
} else {
Com_UngetToken();
idCameraPosition::parseToken(key.c_str(), text);
}
token = Com_Parse(text);
} while (1);
if ( !strcmp (token, "}") ) {
break;
}
} while (1);
Com_UngetToken();
Com_MatchToken( text, "}" );
}
void idSplinePosition::parse(const char *(*text) ) {
const char *token;
Com_MatchToken( text, "{" );
do {
token = Com_Parse( text );
if ( !token[0] ) {
break;
}
if ( !strcmp (token, "}") ) {
break;
}
// here we may have to jump over brush epairs ( only used in editor )
do {
// if token is not a brace, it is a key for a key/value pair
if ( !token[0] || !strcmp (token, "(") || !strcmp(token, "}")) {
break;
}
Com_UngetToken();
idStr key = Com_ParseOnLine(text);
const char *token = Com_Parse(text);
if (Q_stricmp(key.c_str(), "target") == 0) {
target.parse(text);
} else {
Com_UngetToken();
idCameraPosition::parseToken(key.c_str(), text);
}
token = Com_Parse(text);
} while (1);
if ( !strcmp (token, "}") ) {
break;
}
} while (1);
Com_UngetToken();
Com_MatchToken( text, "}" );
}
void idCameraFOV::write(fileHandle_t file, const char *p) {
idStr s = va("\t%s {\n", p);
FS_Write(s.c_str(), s.length(), file);
s = va("\t\tfov %f\n", fov);
FS_Write(s.c_str(), s.length(), file);
s = va("\t\tstartFOV %f\n", startFOV);
FS_Write(s.c_str(), s.length(), file);
s = va("\t\tendFOV %f\n", endFOV);
FS_Write(s.c_str(), s.length(), file);
s = va("\t\ttime %i\n", time);
FS_Write(s.c_str(), s.length(), file);
s = "\t}\n";
FS_Write(s.c_str(), s.length(), file);
}
void idCameraPosition::write(fileHandle_t file, const char *p) {
idStr s = va("\t\ttime %i\n", time);
FS_Write(s.c_str(), s.length(), file);
s = va("\t\ttype %i\n", static_cast<int>(type));
FS_Write(s.c_str(), s.length(), file);
s = va("\t\tname %s\n", name.c_str());
FS_Write(s.c_str(), s.length(), file);
s = va("\t\tbaseVelocity %f\n", baseVelocity);
FS_Write(s.c_str(), s.length(), file);
for (int i = 0; i < velocities.Num(); i++) {
s = va("\t\tvelocity %i %i %f\n", velocities[i]->startTime, velocities[i]->time, velocities[i]->speed);
FS_Write(s.c_str(), s.length(), file);
}
}
void idFixedPosition::write(fileHandle_t file, const char *p) {
idStr s = va("\t%s {\n", p);
FS_Write(s.c_str(), s.length(), file);
idCameraPosition::write(file, p);
s = va("\t\tpos ( %f %f %f )\n", pos.x, pos.y, pos.z);
FS_Write(s.c_str(), s.length(), file);
s = "\t}\n";
FS_Write(s.c_str(), s.length(), file);
}
void idInterpolatedPosition::write(fileHandle_t file, const char *p) {
idStr s = va("\t%s {\n", p);
FS_Write(s.c_str(), s.length(), file);
idCameraPosition::write(file, p);
s = va("\t\tstartPos ( %f %f %f )\n", startPos.x, startPos.y, startPos.z);
FS_Write(s.c_str(), s.length(), file);
s = va("\t\tendPos ( %f %f %f )\n", endPos.x, endPos.y, endPos.z);
FS_Write(s.c_str(), s.length(), file);
s = "\t}\n";
FS_Write(s.c_str(), s.length(), file);
}
void idSplinePosition::write(fileHandle_t file, const char *p) {
idStr s = va("\t%s {\n", p);
FS_Write(s.c_str(), s.length(), file);
idCameraPosition::write(file, p);
target.write(file, "target");
s = "\t}\n";
FS_Write(s.c_str(), s.length(), file);
}
void idCameraDef::addTarget(const char *name, idCameraPosition::positionType type) {
const char *text = (name == NULL) ? va("target0%d", numTargets()+1) : name;
idCameraPosition *pos = newFromType(type);
if (pos) {
pos->setName(name);
targetPositions.Append(pos);
activeTarget = numTargets()-1;
if (activeTarget == 0) {
// first one
addEvent(idCameraEvent::EVENT_TARGET, name, 0);
}
}
}
idCameraDef camera;
extern "C" {
qboolean loadCamera(const char *name) {
camera.clear();
return static_cast<qboolean>(camera.load(name));
}
qboolean getCameraInfo(int time, float *origin, float*angles) {
idVec3_t dir, org;
org[0] = origin[0];
org[1] = origin[1];
org[2] = origin[2];
float fov = 90;
if (camera.getCameraInfo(time, org, dir, &fov)) {
origin[0] = org[0];
origin[1] = org[1];
origin[2] = org[2];
angles[1] = atan2 (dir[1], dir[0])*180/3.14159;
angles[0] = asin (dir[2])*180/3.14159;
return qtrue;
}
return qfalse;
}
void startCamera(int time) {
camera.startCamera(time);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -