public void Init() { // TODO: cmds /*cmdSystem->AddCommand( "listModels", ListModels_f, CMD_FL_RENDERER, "lists all models" ); * cmdSystem->AddCommand( "printModel", PrintModel_f, CMD_FL_RENDERER, "prints model info", idCmdSystem::ArgCompletion_ModelName ); * cmdSystem->AddCommand( "reloadModels", ReloadModels_f, CMD_FL_RENDERER|CMD_FL_CHEAT, "reloads models" ); * cmdSystem->AddCommand( "touchModel", TouchModel_f, CMD_FL_RENDERER, "touches a model", idCmdSystem::ArgCompletion_ModelName );*/ _insideLevelLoad = false; // create a default model idRenderModel_Static model = new idRenderModel_Static(); model.InitEmpty("_DEFAULT"); model.MakeDefault(); model.IsLevelLoadReferenced = true; _defaultModel = model; AddModel(model); // create the beam model // TODO: beam /*idRenderModelStatic *beam = new idRenderModelBeam; * beam->InitEmpty( "_BEAM" ); * beam->SetLevelLoadReferenced( true ); * beamModel = beam; * AddModel( beam );*/ // TODO: sprite /*idRenderModelStatic *sprite = new idRenderModelSprite; * sprite->InitEmpty( "_SPRITE" ); * sprite->SetLevelLoadReferenced( true ); * spriteModel = sprite; * AddModel( sprite );*/ }
public void CheckModelHierarchy(idRenderModel model) { if(_jointInfo.Length != model.JointCount) { idConsole.Error("Model '{0}' has different # of joints than anim '{1}'", model.Name, this.Name); } idMD5Joint[] modelJoints = model.Joints; int parent = -1; int jointCount = _jointInfo.Length; int modelJointCount = modelJoints.Length; for(int i = 0; i < jointCount; i++) { int jointIndex = _jointInfo[i].NameIndex; if(modelJoints[i].Name != idR.AnimManager.GetJointName(jointIndex)) { idConsole.Error("Model '{0}''s joint names don't match anim '{1}''s", model.Name, this.Name); } else if(modelJoints[i].Parent != null) { for(int j = 0; j < modelJointCount; j++) { if(modelJoints[j] == modelJoints[i].Parent) { parent = j; break; } } } else { parent = -1; } if(parent != _jointInfo[i].ParentIndex) { idConsole.Error("Model '{0}' has different joint hierarchy than anim '{1}'", model.Name, this.Name); } } }
/// <summary> /// Creates a static model based on the definition and view currently. /// </summary> /// <remarks> /// This will be regenerated for every view, even though /// some models, like character meshes, could be used for multiple (mirror) /// views in a frame, or may stay static for multiple frames (corpses) /// The renderer will delete the returned dynamic model the next view. /// </remarks> /// <param name="renderEntity"></param> /// <param name="view"></param> /// <param name="cachedModel"></param> /// <returns></returns> public abstract idRenderModel InstantiateDynamicModel(idRenderEntity renderEntity, View view, idRenderModel cachedModel);
public override idRenderModel InstantiateDynamicModel(idTech4.Renderer.idRenderEntity renderEntity, View view, idRenderModel cachedModel) { if (this.Disposed == true) { throw new ObjectDisposedException(this.GetType().Name); } idConsole.Warning("TODO: idRenderModel_PRT.InstantiateDynamicModel"); return(null); }
public override idRenderModel InstantiateDynamicModel(idRenderEntity renderEntity, View view, idRenderModel cachedModel) { if (cachedModel != null) { cachedModel.Dispose(); } idConsole.Error("InstantiateDynamicModel called on static model '{0}'", this.Name); return(null); }
public override idRenderModel InstantiateDynamicModel(idRenderEntity renderEntity, View view, idRenderModel cachedModel) { if(cachedModel != null) { cachedModel.Dispose(); } idConsole.Error("InstantiateDynamicModel called on static model '{0}'", this.Name); return null; }
protected override void SetModel(string modelName) { if(this.Disposed == true) { throw new ObjectDisposedException(this.GetType().Name); } FreeModelDef(); this.RenderEntity.Model = _animator.SetModel(modelName); if(this.RenderEntity.Model == null) { base.SetModel(modelName); } else { if(this.RenderEntity.CustomSkin == null) { this.RenderEntity.CustomSkin = _animator.ModelDefinition.DefaultSkin; } // set the callback to update the joints this.RenderEntity.Callback = ModelCallback; this.RenderEntity.Joints = _animator.GetJoints(); _animator.GetBounds(idR.Game.Time, out this.RenderEntity.Bounds); UpdateVisuals(); } }
public override idRenderModel InstantiateDynamicModel(idTech4.Renderer.idRenderEntity renderEntity, View view, idRenderModel cachedModel) { if(this.Disposed == true) { throw new ObjectDisposedException(this.GetType().Name); } idConsole.Warning("TODO: idRenderModel_PRT.InstantiateDynamicModel"); return null; }
/// <summary> /// World map parsing will add all the inline models with this call. /// </summary> /// <param name="model"></param> public void AddModel(idRenderModel model) { _models.Add(model.Name, model); }
public void RemoveModel(idRenderModel model) { _models.Remove(model.Name); }
public void Init() { // TODO: cmds /*cmdSystem->AddCommand( "listModels", ListModels_f, CMD_FL_RENDERER, "lists all models" ); cmdSystem->AddCommand( "printModel", PrintModel_f, CMD_FL_RENDERER, "prints model info", idCmdSystem::ArgCompletion_ModelName ); cmdSystem->AddCommand( "reloadModels", ReloadModels_f, CMD_FL_RENDERER|CMD_FL_CHEAT, "reloads models" ); cmdSystem->AddCommand( "touchModel", TouchModel_f, CMD_FL_RENDERER, "touches a model", idCmdSystem::ArgCompletion_ModelName );*/ _insideLevelLoad = false; // create a default model idRenderModel_Static model = new idRenderModel_Static(); model.InitEmpty("_DEFAULT"); model.MakeDefault(); model.IsLevelLoadReferenced = true; _defaultModel = model; AddModel(model); // create the beam model // TODO: beam /*idRenderModelStatic *beam = new idRenderModelBeam; beam->InitEmpty( "_BEAM" ); beam->SetLevelLoadReferenced( true ); beamModel = beam; AddModel( beam );*/ // TODO: sprite /*idRenderModelStatic *sprite = new idRenderModelSprite; sprite->InitEmpty( "_SPRITE" ); sprite->SetLevelLoadReferenced( true ); spriteModel = sprite; AddModel( sprite );*/ }
public override bool Parse(string text) { if(this.Disposed == true) { throw new ObjectDisposedException(this.GetType().Name); } idLexer lexer = new idLexer(idDeclFile.LexerOptions); lexer.LoadMemory(text, this.FileName, this.LineNumber); lexer.SkipUntilString("{"); int defaultAnimationCount = 0; idToken token; idToken token2; string tokenValue; string fileName; string extension; int count; idMD5Joint[] md5Joints; while(true) { if((token = lexer.ReadToken()) == null) { break; } tokenValue = token.ToString(); if(tokenValue == "}") { break; } if(tokenValue == "inherit") { idConsole.WriteLine("TODO: inherit"); /*if( !src.ReadToken( &token2 ) ) { src.Warning( "Unexpected end of file" ); MakeDefault(); return false; } const idDeclModelDef *copy = static_cast<const idDeclModelDef *>( declManager->FindType( DECL_MODELDEF, token2, false ) ); if ( !copy ) { common->Warning( "Unknown model definition '%s'", token2.c_str() ); } else if ( copy->GetState() == DS_DEFAULTED ) { common->Warning( "inherited model definition '%s' defaulted", token2.c_str() ); MakeDefault(); return false; } else { CopyDecl( copy ); numDefaultAnims = anims.Num(); }*/ } else if(tokenValue == "skin") { if((token2 = lexer.ReadToken()) == null) { lexer.Warning("Unexpected end of file"); MakeDefault(); return false; } _skin = idE.DeclManager.FindSkin(token2.ToString()); if(_skin == null) { lexer.Warning("Skin '{0}' not found", token2.ToString()); MakeDefault(); return false; } } else if(tokenValue == "mesh") { if((token2 = lexer.ReadToken()) == null) { lexer.Warning("Unexpected end of file"); MakeDefault(); return false; } fileName = token2.ToString(); extension = Path.GetExtension(fileName); if(extension != idRenderModel_MD5.MeshExtension) { lexer.Warning("Invalid model for MD5 mesh"); MakeDefault(); return false; } _model = idE.RenderModelManager.FindModel(fileName); if(_model == null) { lexer.Warning("Model '{0}' not found", fileName); MakeDefault(); return false; } else if(_model.IsDefault == true) { lexer.Warning("Model '{0}' defaulted", fileName); MakeDefault(); return false; } // get the number of joints count = _model.JointCount; if(count == 0) { lexer.Warning("Model '{0}' has no joints", fileName); } // set up the joint hierarchy md5Joints = _model.Joints; _joints = new JointInfo[count]; _jointParents = new int[count]; _channelJoints = new int[(int) AnimationChannel.Count][]; _channelJoints[0] = new int[count]; for(int i = 0; i < count; i++) { _joints[i] = new JointInfo(); _joints[i].Channel = AnimationChannel.All; _joints[i].Index = i; if(md5Joints[i].Parent != null) { _joints[i].ParentIndex = _model.GetJointIndex(md5Joints[i].Parent); } else { _joints[i].ParentIndex = -1; } _jointParents[i] = _joints[i].ParentIndex; _channelJoints[0][i] = i; } } else if(tokenValue == "remove") { idConsole.Warning("TODO: remove"); // removes any anims whos name matches /*if( !src.ReadToken( &token2 ) ) { src.Warning( "Unexpected end of file" ); MakeDefault(); return false; } num = 0; for( i = 0; i < anims.Num(); i++ ) { if ( ( token2 == anims[ i ]->Name() ) || ( token2 == anims[ i ]->FullName() ) ) { delete anims[ i ]; anims.RemoveIndex( i ); if ( i >= numDefaultAnims ) { src.Warning( "Anim '%s' was not inherited. Anim should be removed from the model def.", token2.c_str() ); MakeDefault(); return false; } i--; numDefaultAnims--; num++; continue; } } if ( !num ) { src.Warning( "Couldn't find anim '%s' to remove", token2.c_str() ); MakeDefault(); return false; }*/ } else if(tokenValue == "anim") { if(_model == null) { lexer.Warning("Must specify mesh before defining anims"); MakeDefault(); return false; } else if(ParseAnimation(lexer, defaultAnimationCount) == false) { MakeDefault(); return false; } } else if(tokenValue == "offset") { float[] tmp = lexer.Parse1DMatrix(3); if(tmp == null) { lexer.Warning("Expected vector following 'offset'"); MakeDefault(); return false; } _offset = new Vector3(tmp[0], tmp[1], tmp[2]); } else if(tokenValue == "channel") { if(_model == null) { lexer.Warning("Must specify mesh before defining channels"); MakeDefault(); return false; } // set the channel for a group of joints if((token2 = lexer.ReadToken()) == null) { lexer.Warning("Unexpected end of file"); MakeDefault(); return false; } if(lexer.CheckTokenString("(") == false) { lexer.Warning("Expected { after '{0}'", token2.ToString()); MakeDefault(); return false; } int i; int channelCount = (int) AnimationChannel.Count; for(i = (int) AnimationChannel.All + 1; i < channelCount; i++) { if(ChannelNames[i].Equals(token2.ToString(), StringComparison.OrdinalIgnoreCase) == true) { break; } } if(i >= channelCount) { lexer.Warning("Unknown channel '{0}'", token2.ToString()); MakeDefault(); return false; } int channel = i; StringBuilder jointNames = new StringBuilder(); string token2Value; while(lexer.CheckTokenString(")") == false) { if((token2 = lexer.ReadToken()) == null) { lexer.Warning("Unexpected end of file"); MakeDefault(); return false; } token2Value = token2.ToString(); jointNames.Append(token2Value); if((token2Value != "*") && (token2Value != "-")) { jointNames.Append(" "); } } int[] jointList = GetJointList(jointNames.ToString()); int jointLength = jointList.Length; List<int> channelJoints = new List<int>(); for(count = i = 0; i < jointLength; i++) { int jointIndex = jointList[i]; if(_joints[jointIndex].Channel != AnimationChannel.All) { lexer.Warning("Join '{0}' assigned to multiple channels", _model.GetJointName(jointIndex)); continue; } _joints[jointIndex].Channel = (AnimationChannel) channel; channelJoints.Add(jointIndex); } _channelJoints[channel] = channelJoints.ToArray(); } else { lexer.Warning("unknown token '{0}'", token.ToString()); MakeDefault(); return false; } } return true; }