| 2934 | //---------------------------------------------------------------------------- |
| 2935 | |
| 2936 | void ShapeBase::queueCollision( SceneObject *obj, const VectorF &vec) |
| 2937 | { |
| 2938 | // Add object to list of collisions. |
| 2939 | SimTime time = Sim::getCurrentTime(); |
| 2940 | S32 num = obj->getId(); |
| 2941 | |
| 2942 | CollisionTimeout** adr = &mTimeoutList; |
| 2943 | CollisionTimeout* ptr = mTimeoutList; |
| 2944 | while (ptr) { |
| 2945 | if (ptr->objectNumber == num) { |
| 2946 | if (ptr->expireTime < time) { |
| 2947 | ptr->expireTime = time + CollisionTimeoutValue; |
| 2948 | ptr->object = obj; |
| 2949 | ptr->vector = vec; |
| 2950 | } |
| 2951 | return; |
| 2952 | } |
| 2953 | // Recover expired entries |
| 2954 | if (ptr->expireTime < time) { |
| 2955 | CollisionTimeout* cur = ptr; |
| 2956 | *adr = ptr->next; |
| 2957 | ptr = ptr->next; |
| 2958 | cur->next = sFreeTimeoutList; |
| 2959 | sFreeTimeoutList = cur; |
| 2960 | } |
| 2961 | else { |
| 2962 | adr = &ptr->next; |
| 2963 | ptr = ptr->next; |
| 2964 | } |
| 2965 | } |
| 2966 | |
| 2967 | // New entry for the object |
| 2968 | if (sFreeTimeoutList != NULL) |
| 2969 | { |
| 2970 | ptr = sFreeTimeoutList; |
| 2971 | sFreeTimeoutList = ptr->next; |
| 2972 | ptr->next = NULL; |
| 2973 | } |
| 2974 | else |
| 2975 | { |
| 2976 | ptr = sTimeoutChunker.alloc(); |
| 2977 | } |
| 2978 | |
| 2979 | ptr->object = obj; |
| 2980 | ptr->objectNumber = obj->getId(); |
| 2981 | ptr->vector = vec; |
| 2982 | ptr->expireTime = time + CollisionTimeoutValue; |
| 2983 | ptr->next = mTimeoutList; |
| 2984 | |
| 2985 | mTimeoutList = ptr; |
| 2986 | } |
| 2987 | |
| 2988 | void ShapeBase::notifyCollision() |
| 2989 | { |
no test coverage detected