Dobrý den, mám jeden problém při kompilaci c++ kódu.
Dělám třídu, která by měla načítat Milkshape model do proměnných, aby poté mohla být zobrazena.
Mám soubor ModelMilkshape.h:
#ifndef MODELMILKSHAPE_H
#define MODELMILKSHAPE_H
#include "../Model.h"
class ModelMilkshape : public Model
{
protected:
//data k načtení modelu - nastavována jsou potomkem této třídy
char *model_src;
public:
ModelMilkshape();
virtual ~ModelMilkshape();
virtual bool LoadModelData();
};
Tato třída dědí po třídě Model:. Model.h:
#ifndef MODEL_H
#define MODEL_H
#include "external/KMatrix.h"
class Model
{
protected:
//struktury pro model objektu
struct Vertex // Struktura vertexu
{
char m_boneID; //pro skeletálí animaci
float m_location[3]; // X, y, z souřadnice bodu (vertexu)
};
struct Triangle //struktura trojúhelníku
{
float m_vertexNormals[3][3]; //3 normálové vektory
float m_s[3], m_t[3]; //texturové koordináty
int m_vertexIndices[3]; //indexy 3 použitých vertexů
};
struct Mesh //struktura Meshe
{
int m_materialIndex; //index materiálu použitého pro mesh
int m_numTriangles; //počet trojůhelníků
int *m_pTriangleIndices; //indexy použitých trojúhelníků
};
struct Material //struktura materiálu
{
float m_ambient[4], m_diffuse[4], m_specular[4], m_emissive[4]; //nastavení světla
float m_shininess; //lesk materiálu
GLuint m_texture; //úložiště pro texturu
char *m_pTextureFilename; //adresa souboru s texturou
};
struct Keyframe // Hodnoty animace kloubu obsahující čas, rotaci a posunutí
{
int i_joint_index; // Index kloubu
float f_time; // Čas v milisekundách
float pf_parameter[3]; // Základní hodnota podle kterého se počítá vektor rotace a posunutí
};
struct Joint // Informace o kloubech kostry
{
float pf_rotation[3]; // Lokální rotace
float pf_translation[3]; // Lokální posunutí
/*
* Absolutní, či relativní matice
* Když pohnu absolutní maticí, pohnu i relativní
* Když pohnu relativní maticí, tak absolutní se nemění
*/
K_CMatrix mat_absolute, mat_relative;
int i_num_rotation_key_frames, i_num_translation_key_frames; // Počet snímků rotace a posunutí
Keyframe *p_keyframe_trans; // Ukazatel na animační hodnoty posunutí kloubu
Keyframe *p_keyframe_rot; // Ukazatel na animační hodnoty rotace kloubu
int i_current_keyframe_trans, i_current_keyframe_rot; // Aktuální posunutí a rotace
K_CMatrix mat_final; // Konečná matice
int i_parent; // Rodičovský kloub
};
protected:
double dTotalTime; // Celkový čas animace
double Time; // Čas snímku, který se má vyobrazit
double LastTime; // Absolutní čas, ve ketrém probíhala minulá část animace
double NullTime; // Čas, kdy začala animace (oproti globálnímu času) (každý cyklus animace se aktualizuje)
double TimeStart; // Čas, kde začíná lokální animace (když chci spouštět dokola jen část animace)
double TimeStop; // Čas, kde končí lokální animace
bool bLooping; // Zda se má animace pohybovat, nebo má stát. Pokud je false, poběží pořád animace v čase Time
int m_numVertices; // Počet vertexů
Vertex *m_pVertices; // Dynamické pole vertexů
int m_numTriangles; // Počet trojúhelníků
Triangle *m_pTriangles; // Dynamické pole trojúhelníků
int m_numMeshes; // Počet meshů
Mesh *m_pMeshes; // Dynamické pole meshů
int m_numMaterials; // Počet materiálů
Material *m_pMaterials; // Dynamické pole materiálů
int m_numJoints; // Počet kloubů kostry
Joint *m_pJoints; // Dynamické pole kloubů kostry
public:
Model(); //konstruktor
virtual ~Model(); //destruktor
bool Draw(); //vykreslí objekt
bool ReloadTextures(); //znovu načte textury pokud se mohly změnit nebo mohla být ztracena data
virtual bool LoadModelData()=0; //načítá data do proměnných definujících model objektu - nastavuje se v potomku, který načítá model objektu
void SetJointKeyframe( int i_joint_index, int i_keyframe_index, float f_time, float *pf_parameter, bool b_rotation );
void SetupJoints(); // Nastaví matice kloubů
void Animation(); // Animace modelu
void Restart(); // Restart animace
};
#endif // ndef MODEL_H
-ta asi není moc zásadní. Hlavní jsou ty struktury nahoře, do kterých se právě pomocí funkce LoadModelData() načítají informace.
Nechci sem vypisovat celou třídu ModelMilkshape::LoadModelData(), protože je hodně dlouhá a většina je nepodstatná. V soubou nejdříve includuji soubory:
#include <windows.h> // Header File For Windows
#include <gl\gl.h> // Header File For The OpenGL32 Library
#include <fstream> //některé funkce pro načítání dat
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include "ModelMilkshape.h"
#include "../Objekt.h"
. Potom definuji struktury MS3DHeader, MS3DVertex, MS3DTriangle a podobně pro načítání z binárního souboru .ms3d . Ve funkci načítám vertexy, rojúhelníky, meshe a tak. Problém nastane v části, která načítá Jointy (klouby kostry). Tady je ta část:
float f_anim_fps = *( float* )pPtr; // Načti rychlost animace kostry
pPtr += sizeof( float ); // Posuň se v souboru na další hodnoty
pPtr += sizeof( float ); // Přeskoč hodnotu aktuálního času
int i_total_frames = *( int* )pPtr; // Načti počet snímků
pPtr += sizeof( int ); // Posuň se v souboru na další hodnoty
dTotalTime = i_total_frames*1000.0 / f_anim_fps; // Vypočítej délku animace
m_numJoints = *( word* )pPtr; // Načti počet kloubů
pPtr += sizeof( word ); // Posuň se v souboru na další hodnoty
m_pJoints = new Joint[m_numJoints]; // Alokuj paměť pro počet kloubů kostry modelu
struct TJointNameListRec // Vytvoř pomocnou strukturu pro načtení indexu a jména specifického kloubu
{
int i_joint_index; // Index kloubu
const char *pc_joint_name; // Jméno kloubu
};
const byte *pby_temp_load_data = pPtr; // Vytvoř další buffer pro načtení indexu a jména kloubu
TJointNameListRec *p_name_list = new TJointNameListRec[m_numJoints]; // Alokuj paměť pro počet indexů typu JoinNameRec
for ( i = 0; i < m_numJoints; i++ ) // Cykluj podle počtu kloubů
{
MS3DJoint *p_joint = ( MS3DJoint* )pby_temp_load_data; // Načti ze souboru hodnoty typu MS3DJoint
pby_temp_load_data += sizeof( MS3DJoint ); // Přeskoč hodnoty času sekundach
pby_temp_load_data += sizeof( MS3DKeyframe ) * ( p_joint->w_num_key_frames_rot + p_joint->w_num_key_frames_trans ); // Přeskoč hodnoty rotace a posunutí, které budem načítat později
p_name_list[i].i_joint_index = i; // Načti index kloubu
p_name_list[i].pc_joint_name = p_joint->pc_name; // Načti jméno kloubu
}
for ( i = 0; i < m_numJoints; i++ ) // Znova cykluj podle počtu kloubů
{
MS3DJoint *p_joint = ( MS3DJoint* )pPtr; // Znova načti ze souboru hodnoty typu MS3DJoint
pPtr += sizeof( MS3DJoint ); // Posuň se v souboru na další hodnoty
int i_parent_index = -1; // Rodičovský index nastav na -1
if ( strlen( p_joint->pc_parent_name ) > 0 ) // Jestliže jméno rodičovského kloubu existuje
{
for (int j = 0; j < m_numJoints; j++ ) // Cykluj opět podle počtu kloubů
{
if ( strcomp( p_name_list[j].pc_joint_name, p_joint->pc_parent_name ) == 0 ) // Pokud je jméno kloubu a jeho rodiče totožné
{
i_parent_index = p_name_list[j].i_joint_index; // Tak nastav stejný index rodiče a potomka
break; // A vyskoč z cyklu
}
}
if ( i_parent_index == -1 ) // Jestliže je rodičovský index -1, tak
{
MessageBox( NULL, "Unable to find parent bone in MS3D file", "Error", MB_OK | MB_ICONERROR ); // Vyhoď chybovou hlášku
return false; // A funkci předej false
}
}
memcpy( m_pJoints[i].pf_rotation, p_joint->pf_rotation, sizeof( float ) * 3 ); // Načti rotaci kloubu
memcpy( m_pJoints[i].pf_translation, p_joint->pf_translation, sizeof( float ) * 3 ); // Načti posun kloubu
m_pJoints[i].i_parent = i_parent_index; // Načti rodičovský index
m_pJoints[i].i_num_rotation_key_frames = p_joint->w_num_key_frames_rot; // Načti počet snímků rotace
m_pJoints[i].p_keyframe_rot = new Keyframe[p_joint->w_num_key_frames_rot]; // Alokuj paměť podle počtu snímků rotace modelu
m_pJoints[i].i_num_translation_key_frames = p_joint->w_num_key_frames_trans; // Načti počet snímků translace
m_pJoints[i].p_keyframe_trans = new Keyframe[p_joint->w_num_key_frames_trans]; // Alokuj paměť podle počtu snímků posunutí modelu
for ( int j = 0; j < p_joint->w_num_key_frames_rot; j++ ) // Cykluj podle počtu snímků rotace
{
MS3DKeyframe *p_key_frame = ( MS3DKeyframe* )pPtr; // Načti ze souboru hodnoty typu TMs3dKeyframe
pPtr += sizeof( MS3DKeyframe ); // Posuň se v souboru na další hodnoty
SetJointKeyframe( i, j, p_key_frame->f_time*1000.0f, p_key_frame->pf_parameter, true ); // Nastav hodnoty rotace kloubu
}
for ( int j = 0; j < p_joint->w_num_key_frames_trans; j++ ) // Cykluj podle počtu snímků translace
{
MS3DKeyframe *p_key_frame = ( MS3DKeyframe* )pPtr; // Načti ze souboru hodnoty typu TMs3dKeyframe
pPtr += sizeof( MS3DKeyframe ); // Posuň se v souboru na další hodnoty
SetJointKeyframe( i, j, p_key_frame->f_time * 1000.0f, p_key_frame->pf_parameter, false ); // Nastav hodnoty posunutí kloubu
}
}
delete[] p_name_list; // Vymaž buffer bufferu souboru (počel listů kloubu)
SetupJoints(); // Nastav matice rotace a translace kloubů
Je to přejatá část kódu, kterou úplně nechápu, ale celkem se mi řekl bych povedlo implementovat jí prozatimě do mého programu. Tady je začátek výpisu kompilátoru:
1>------ Build started: Project: Program, Configuration: Release Win32 ------
1>Compiling...
1>ModelMilkshape.cpp
1>.\Model\ModelMilkshape.cpp(216) : warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> C:\Program Files\Microsoft Visual Studio 9.0\VC\include\string.h(74) : see declaration of 'strcpy'
1>.\Model\ModelMilkshape.cpp(264) : error C3861: 'strcomp': identifier not found
1>Objekty.cpp
1>.\Objekty.cpp(47) : error C2039: 'Draw' : is not a member of 'Objekt'
1> c:\_honza\programování\c++\programy visual studio\program\program\Objekt.h(5) : see declaration of 'Objekt'
1>.\Objekty.cpp(71) : error C2039: 'ReloadTextures' : is not a member of 'Objekt'
1> c:\_honza\programování\c++\programy visual studio\program\program\Objekt.h(5) : see declaration of 'Objekt'
1>.\Objekty.cpp(89) : error C2039: 'LoadModelData' : is not a member of 'Objekt'
1> c:\_honza\programování\c++\programy visual studio\program\program\Objekt.h(5) : see declaration of 'Objekt'
1>Model.cpp
1>.\Model.cpp(12) : error C2039: 'poloha' : is not a member of 'Model'
1> c:\_honza\programování\c++\programy visual studio\program\program\Model.h(7) : see declaration of 'Model'
1>.\Model.cpp(12) : error C2228: left of '.x' must have class/struct/union
1>.\Model.cpp(13) : error C2039: 'poloha' : is not a member of 'Model'
1> c:\_honza\programování\c++\programy visual studio\program\program\Model.h(7) : see declaration of 'Model'
1>.\Model.cpp(13) : error C2228: left of '.y' must have class/struct/union
1>.\Model.cpp(14) : error C2039: 'poloha' : is not a member of 'Model'
1> c:\_honza\programování\c++\programy visual studio\program\program\Model.h(7) : see declaration of 'Model'
1>.\Model.cpp(14) : error C2228: left of '.z' must have class/struct/union
1>.\Model.cpp(15) : error C2039: 'poloha' : is not a member of 'Model'
Errorů je hromada přes, stím bych neměl mít problémy. Už dlouho se ale trápím s řádkem
1>.\Model\ModelMilkshape.cpp(264) : error C3861: 'strcomp': identifier not found.
Máte někdo tušení, čím by to mohlo být a jak to vyřešit?
Děkuji mnohokrát za nápady