/* ================ idClass::Init Should be called after all idTypeInfos are initialized, so must be called manually upon game code initialization. Tells all the idTypeInfos to initialize their event callback table for the associated class. This should only be called once during the execution of the program or DLL. ================ */ void idClass::Init( void ) { idTypeInfo *c; int num; // RAVEN BEGIN // jnewquist: Tag scope and callees to track allocations using "new". MEM_SCOPED_TAG(tag,MA_CLASS); // RAVEN END gameLocal.Printf( "Initializing class hierarchy\n" ); if ( initialized ) { gameLocal.Printf( "...already initialized\n" ); return; } // init the event callback tables for all the classes for( c = typelist; c != NULL; c = c->next ) { // RAVEN BEGIN // jnewquist: Make sure the superclass was actually registered! if ( c->super == NULL && (c->superclass && idStr::Cmp(c->superclass, "NULL")) ) { common->Error("Superclass %s of %s was never registered!", c->superclass, c->classname); } // RAVEN END c->Init(); } // number the types according to the class hierarchy so we can quickly determine if a class // is a subclass of another num = 0; for( c = classHierarchy.GetNext(); c != NULL; c = c->node.GetNext(), num++ ) { c->typeNum = num; c->lastChild += num; } // number of bits needed to send types over network typeNumBits = idMath::BitsForInteger( num ); // create a list of the types so we can do quick lookups // one list in alphabetical order, one in typenum order types.SetGranularity( 1 ); types.SetNum( num ); typenums.SetGranularity( 1 ); typenums.SetNum( num ); num = 0; for( c = typelist; c != NULL; c = c->next, num++ ) { types[ num ] = c; typenums[ c->typeNum ] = c; } initialized = true; gameLocal.Printf( "...%i classes, %i bytes for event callbacks\n", types.Num(), eventCallbackMemory ); }
/* ================ idClass::Init Should be called after all idTypeInfos are initialized, so must be called manually upon game code initialization. Tells all the idTypeInfos to initialize their event callback table for the associated class. This should only be called once during the execution of the program or DLL. ================ */ void idClass::Init() { idTypeInfo* c; int num; gameLocal.Printf( "Initializing class hierarchy\n" ); if( initialized ) { gameLocal.Printf( "...already initialized\n" ); return; } // init the event callback tables for all the classes for( c = typelist; c != NULL; c = c->next ) { c->Init(); } // number the types according to the class hierarchy so we can quickly determine if a class // is a subclass of another num = 0; for( c = classHierarchy.GetNext(); c != NULL; c = c->node.GetNext(), num++ ) { c->typeNum = num; c->lastChild += num; } // number of bits needed to send types over network typeNumBits = idMath::BitsForInteger( num ); // create a list of the types so we can do quick lookups // one list in alphabetical order, one in typenum order types.SetGranularity( 1 ); types.SetNum( num ); typenums.SetGranularity( 1 ); typenums.SetNum( num ); num = 0; for( c = typelist; c != NULL; c = c->next, num++ ) { types[ num ] = c; typenums[ c->typeNum ] = c; } initialized = true; gameLocal.Printf( "...%i classes, %i bytes for event callbacks\n", types.Num(), eventCallbackMemory ); }