void Parrot_schedule_interp_qentry(Parrot_Interp interpreter, QUEUE_ENTRY* entry) { parrot_event* event; event = entry->data; /* * sleep checks events when it awakes */ edebug((stderr, "got entry - schedule_inter_qentry %s\n", et(event))); if (event->type != EVENT_TYPE_SLEEP) enable_event_checking(interpreter); /* * do push_entry last - this signales the queue condition so the * interpreter might starting process that event immediately * * we should better use a priority for placing the event * in front or at the end of the queue */ switch (event->type) { case EVENT_TYPE_CALL_BACK: case EVENT_TYPE_SIGNAL: unshift_entry(interpreter->task_queue, entry); break; default: push_entry(interpreter->task_queue, entry); break; } }
/* * Instert an entry at a specified position in a linked_list_t */ static inline int insert_entry(linked_list_t *list, list_entry_t *entry, size_t pos) { list_entry_t *prev, *next; int ret = -1; MUTEX_LOCK(list->lock); if(pos == 0) { ret = unshift_entry(list, entry); } else if(pos == list->length) { ret = push_entry(list, entry); } else if (pos > list->length) { unsigned int i; for (i = list->length; i < pos; i++) { list_entry_t *emptyEntry = create_entry(); if (!emptyEntry || push_entry(list, emptyEntry) != 0) { if (emptyEntry) destroy_entry(emptyEntry); MUTEX_UNLOCK(list->lock); return -1; } } ret = push_entry(list, entry); } if (ret == 0) { MUTEX_UNLOCK(list->lock); return ret; } prev = pick_entry(list, pos-1); if(prev) { next = prev->next; prev->next = entry; entry->prev = prev; entry->next = next; if (next) next->prev = entry; list->length++; ret = 0; } MUTEX_UNLOCK(list->lock); return ret; }
int list_push_value(linked_list_t *list, void *val) { int res; list_entry_t *new_entry = create_entry(); if(!new_entry) return -1; new_entry->value = val; res = push_entry(list, new_entry); if(res != 0) destroy_entry(new_entry); return res; }
static int All_Quadric_Intersections(OBJECT *Object, RAY *Ray, ISTACK *Depth_Stack) { DBL Depth1, Depth2; VECTOR IPoint; register int Intersection_Found; Intersection_Found = false; if (Intersect_Quadric(Ray, (QUADRIC *)Object, &Depth1, &Depth2)) { if ((Depth1 > Small_Tolerance) && (Depth1 < Max_Distance)) { VEvaluateRay(IPoint, Ray->Initial, Depth1, Ray->Direction); if (Point_In_Clip(IPoint, Object->Clip)) { push_entry(Depth1, IPoint, Object, Depth_Stack); Intersection_Found = true; } } if ((Depth2 > Small_Tolerance) && (Depth2 < Max_Distance)) { VEvaluateRay(IPoint, Ray->Initial, Depth2, Ray->Direction); if (Point_In_Clip(IPoint, Object->Clip)) { push_entry(Depth2, IPoint, Object, Depth_Stack); Intersection_Found = true; } } } return(Intersection_Found); }
static int All_Plane_Intersections (OBJECT *Object, RAY *Ray, ISTACK *Depth_Stack) { DBL Depth; VECTOR IPoint; if (Intersect_Plane(Ray, (PLANE *)Object, &Depth)) { VEvaluateRay(IPoint, Ray->Initial, Depth, Ray->Direction); if (Point_In_Clip(IPoint, Object->Clip)) { push_entry(Depth,IPoint,Object,Depth_Stack); return(true); } } return(false); }
/* * Pushes a new tagged_value_t into list. user must give a valid tagged_value_t pointer * created trough a call to create_tagged_value() routine */ int list_push_tagged_value(linked_list_t *list, tagged_value_t *tval) { list_entry_t *new_entry; int res = 0; if(tval) { new_entry = create_entry(); if(new_entry) { new_entry->tagged = 1; new_entry->value = tval; res = push_entry(list, new_entry); if(res != 0) destroy_entry(new_entry); } } return res; }
static int All_Disc_Intersections (OBJECT *Object, RAY *Ray, ISTACK *Depth_Stack) { int Intersection_Found; DBL Depth; VECTOR IPoint; Intersection_Found = false; if (Intersect_Disc (Ray, (DISC *)Object, &Depth)) { VEvaluateRay(IPoint, Ray->Initial, Depth, Ray->Direction); if (Point_In_Clip (IPoint, Object->Clip)) { push_entry(Depth,IPoint,Object,Depth_Stack); Intersection_Found = true; } } return (Intersection_Found); }
void Parrot_schedule_event(Parrot_Interp interpreter, parrot_event* ev) { QUEUE_ENTRY* entry = mem_sys_allocate(sizeof(QUEUE_ENTRY)); entry->next = NULL; ev->interp = interpreter; entry->data = ev; switch (ev->type) { case EVENT_TYPE_TIMER: case EVENT_TYPE_SLEEP: entry->type = QUEUE_ENTRY_TYPE_TIMED_EVENT; insert_entry(event_queue, entry); break; case EVENT_TYPE_CALL_BACK: case EVENT_TYPE_SIGNAL: entry->type = QUEUE_ENTRY_TYPE_EVENT; unshift_entry(event_queue, entry); break; default: entry->type = QUEUE_ENTRY_TYPE_EVENT; push_entry(event_queue, entry); break; } }
/* Turbulence */ struct Turbulence *ScnNewTurbulence(struct Scene *scene) { return (struct Turbulence *) push_entry(scene->TurbulenceList, TrbNew()); }
/* Procedure */ struct Procedure *ScnNewProcedure(struct Scene *scene, const struct Plugin *plugin) { return (struct Procedure *) push_entry(scene->ProcedureList, PrcNew(plugin)); }
/* Accelerator */ struct Accelerator *ScnNewAccelerator(struct Scene *scene, int accelerator_type) { return (struct Accelerator *) push_entry(scene->AcceleratorList, AccNew(accelerator_type)); }
/* Texture */ struct Texture *ScnNewTexture(struct Scene *scene) { return (struct Texture *) push_entry(scene->TextureList, TexNew()); }
/* ObjectGroup */ struct ObjectGroup *ScnNewObjectGroup(struct Scene *scene) { return (struct ObjectGroup *) push_entry(scene->ObjectGroupList, ObjGroupNew()); }
int All_Parametric_Intersections(OBJECT* Object, RAY* Ray, ISTACK* Depth_Stack) { PARAMETRIC * Par = (PARAMETRIC *)Object; PRECOMP_PAR_DATA * PData = ((PARAMETRIC *)Object)->PData; VECTOR P, D, IPoint; UV_VECT low_vect, hi_vect; RAY New_Ray; DBL XRayMin, XRayMax, YRayMin, YRayMax, ZRayMin, ZRayMax, TPotRes, TLen; DBL Depth1, Depth2, temp, Len, UResult, VResult, TResult = HUGE_VAL; DBL low, hi, len; int MaxPrecompX, MaxPrecompY, MaxPrecompZ; int split, i = 0, Side1, Side2; int parX, parY; int i_flg; Increase_Counter(stats[Ray_Par_Bound_Tests]); if(Par->container_shape) { if(Par->Trans != NULL) { MInvTransPoint(New_Ray.Initial, Ray->Initial, Par->Trans); MInvTransDirection(New_Ray.Direction, Ray->Direction, Par->Trans); VLength(len, New_Ray.Direction); VInverseScaleEq(New_Ray.Direction, len); i_flg = Intersect_Sphere(&New_Ray, Par->container.sphere.center, (Par->container.sphere.radius) * (Par->container.sphere.radius), &Depth1, &Depth2); Depth1 = Depth1 / len; Depth2 = Depth2 / len; } else { i_flg = Intersect_Sphere(Ray, Par->container.sphere.center, (Par->container.sphere.radius) * (Par->container.sphere.radius), &Depth1, &Depth2); } Decrease_Counter(stats[Ray_Sphere_Tests]); if(i_flg) Decrease_Counter(stats[Ray_Sphere_Tests_Succeeded]); } else { i_flg = Intersect_Box(Ray, Par->Trans, Par->container.box.corner1, Par->container.box.corner2, &Depth1, &Depth2, &Side1, &Side2); } if(!i_flg) return false; Increase_Counter(stats[Ray_Par_Bound_Tests_Succeeded]); Increase_Counter(stats[Ray_Parametric_Tests]); if (Par->Trans != NULL) { MInvTransPoint(P, Ray->Initial, Par->Trans); MInvTransDirection(D, Ray->Direction, Par->Trans); } else { P[X] = Ray->Initial[X]; P[Y] = Ray->Initial[Y]; P[Z] = Ray->Initial[Z]; D[X] = Ray->Direction[X]; D[Y] = Ray->Direction[Y]; D[Z] = Ray->Direction[Z]; } if (Depth1 == Depth2) Depth1 = 0; if ((Depth1 += 4 * Par->accuracy) > Depth2) return false; Intervals_Low[INDEX_U][0] = Par->umin; Intervals_Hi[INDEX_U][0] = Par->umax; Intervals_Low[INDEX_V][0] = Par->vmin; Intervals_Hi[INDEX_V][0] = Par->vmax; /* Fri 09-27-1996 0. */ SectorNum[0] = 1; MaxPrecompX = MaxPrecompY = MaxPrecompZ = 0; if (PData != NULL) { if (((PData->flags) & OK_X) != 0) MaxPrecompX = 1 << (PData->depth); if (((PData->flags) & OK_Y) != 0) MaxPrecompY = 1 << (PData->depth); if (((PData->flags) & OK_Z) != 0) MaxPrecompZ = 1 << (PData->depth); } /* 0 */ while (i >= 0) { low_vect[U] = Intervals_Low[INDEX_U][i]; hi_vect[U] = Intervals_Hi[INDEX_U][i]; Len = hi_vect[U] - low_vect[U]; split = INDEX_U; low_vect[V] = Intervals_Low[INDEX_V][i]; hi_vect[V] = Intervals_Hi[INDEX_V][i]; temp = hi_vect[V] - low_vect[V]; if (temp > Len) { Len = temp; split = INDEX_V; } parX = parY = 0; TLen = 0; /* X */ if (SectorNum[i] < MaxPrecompX) { low = PData->Low[0][SectorNum[i]]; hi = PData->Hi[0][SectorNum[i]]; } else Evaluate_Function_Interval_UV(*(Par->Function[0]), Par->accuracy, low_vect, hi_vect, Par->max_gradient, low, hi); /* fabs(D[X] *(T2-T1)) is not OK with new method */ if (close(D[0], 0)) { parX = 1; if ((hi < P[0]) || (low > P[0])) { i--; continue; } } else { XRayMin = (hi - P[0]) / D[0]; XRayMax = (low - P[0]) / D[0]; if (XRayMin > XRayMax) { temp = XRayMin; XRayMin = XRayMax; XRayMax = temp; } if ((XRayMin > Depth2) || (XRayMax < Depth1)) { i--; continue; } if ((TPotRes = XRayMin) > TResult) { i--; continue; } TLen = XRayMax - XRayMin; } /* Y */ if (SectorNum[i] < MaxPrecompY) { low = PData->Low[1][SectorNum[i]]; hi = PData->Hi[1][SectorNum[i]]; } else Evaluate_Function_Interval_UV(*(Par->Function[1]), Par->accuracy, low_vect, hi_vect, Par->max_gradient, low, hi); if (close(D[1], 0)) { parY = 1; if ((hi < P[1]) || (low > P[1])) { i--; continue; } } else { YRayMin = (hi - P[1]) / D[1]; YRayMax = (low - P[1]) / D[1]; if (YRayMin > YRayMax) { temp = YRayMin; YRayMin = YRayMax; YRayMax = temp; } if ((YRayMin > Depth2) || (YRayMax < Depth1)) { i--; continue; } if ((TPotRes = YRayMin) > TResult) { i--; continue; } if (parX == 0) { if ((YRayMin > XRayMax) || (YRayMax < XRayMin)) { i--; continue; } } if ((temp = YRayMax - YRayMin) > TLen) TLen = temp; } /* Z */ if ((SectorNum[i] < MaxPrecompZ) && (0 < SectorNum[i])) { low = PData->Low[2][SectorNum[i]]; hi = PData->Hi[2][SectorNum[i]]; } else Evaluate_Function_Interval_UV(*(Par->Function[2]), Par->accuracy, low_vect, hi_vect, Par->max_gradient, low, hi); if (close(D[2], 0)) { if ((hi < P[2]) || (low > P[2])) { i--; continue; } } else { ZRayMin = (hi - P[2]) / D[2]; ZRayMax = (low - P[2]) / D[2]; if (ZRayMin > ZRayMax) { temp = ZRayMin; ZRayMin = ZRayMax; ZRayMax = temp; } if ((ZRayMin > Depth2) || (ZRayMax < Depth1)) { i--; continue; } if ((TPotRes = ZRayMin) > TResult) { i--; continue; } if (parX == 0) { if ((ZRayMin > XRayMax) || (ZRayMax < XRayMin)) { i--; continue; } } if (parY == 0) { if ((ZRayMin > YRayMax) || (ZRayMax < YRayMin)) { i--; continue; } } if ((temp = ZRayMax - ZRayMin) > TLen) TLen = temp; } if (Len > TLen) Len = TLen; if (Len < Par->accuracy) { if ((TResult > TPotRes) && (TPotRes > Depth1)) { TResult = TPotRes; Par->last_u = UResult = low_vect[U]; Par->last_v = VResult = low_vect[V]; } i--; } else { /* 1 copy */ if ((SectorNum[i] *= 2) >= Max_intNumber) SectorNum[i] = Max_intNumber; SectorNum[i + 1] = SectorNum[i]; SectorNum[i]++; i++; Intervals_Low[INDEX_U][i] = low_vect[U]; Intervals_Hi[INDEX_U][i] = hi_vect[U]; Intervals_Low[INDEX_V][i] = low_vect[V]; Intervals_Hi[INDEX_V][i] = hi_vect[V]; /* 2 split */ temp = (Intervals_Hi[split][i] + Intervals_Low[split][i]) / 2.0; Intervals_Hi[split][i] = temp; Intervals_Low[split][i - 1] = temp; } } if (TResult < Depth2) { Increase_Counter(stats[Ray_Parametric_Tests_Succeeded]); VScale(IPoint, Ray->Direction, TResult); VAddEq(IPoint, Ray->Initial); if (Point_In_Clip(IPoint, Par->Clip)) { /* compute_param_normal( Par, UResult, VResult , &N); push_normal_entry( TResult ,IPoint, N, (OBJECT *) Object, Depth_Stack); */ // UV_VECT uv; // Make_UV_Vector(uv, UResult, VResult); // push_uv_entry(TResult, IPoint, uv, (OBJECT *)Object, Depth_Stack); push_entry(TResult, IPoint, (OBJECT *)Object, Depth_Stack); return true; } } return false; }
/* Curve */ struct Curve *ScnNewCurve(struct Scene *scene) { return (struct Curve *) push_entry(scene->CurveList, CrvNew()); }
/* Volume */ struct Volume *ScnNewVolume(struct Scene *scene) { return (struct Volume *) push_entry(scene->VolumeList, VolNew()); }
/* Shader */ struct Shader *ScnNewShader(struct Scene *scene, const struct Plugin *plugin) { return (struct Shader *) push_entry(scene->ShaderList, ShdNew(plugin)); }
/* Plugin */ struct Plugin *ScnOpenPlugin(struct Scene *scene, const char *filename) { return (struct Plugin *) push_entry(scene->PluginList, PlgOpen(filename)); }
/* Camera */ struct Camera *ScnNewCamera(struct Scene *scene, const char *type) { return (struct Camera *) push_entry(scene->CameraList, CamNew(type)); }
/* ObjectInstance */ struct ObjectInstance *ScnNewObjectInstance(struct Scene *scene, const struct Accelerator *acc) { return (struct ObjectInstance *) push_entry(scene->ObjectInstanceList, ObjNew(acc)); }
/* Light */ struct Light *ScnNewLight(struct Scene *scene, const char *type) { return (struct Light *) push_entry(scene->LightList, LgtNew(type)); }
/* Renderer */ struct Renderer *ScnNewRenderer(struct Scene *scene) { return (struct Renderer *) push_entry(scene->RendererList, RdrNew()); }
/* Mesh */ struct Mesh *ScnNewMesh(struct Scene *scene) { return (struct Mesh *) push_entry(scene->MeshList, MshNew()); }
/* FrameBuffer */ struct FrameBuffer *ScnNewFrameBuffer(struct Scene *scene) { return (struct FrameBuffer *) push_entry(scene->FrameBufferList, FbNew()); }