private static int _amInitCircle(object p) { AppMain.AMS_AME_CREATE_PARAM amsAmeCreateParam = (AppMain.AMS_AME_CREATE_PARAM)p; AppMain.AMS_AME_NODE_CIRCLE node = (AppMain.AMS_AME_NODE_CIRCLE)amsAmeCreateParam.node; AppMain.AMS_AME_RUNTIME_WORK_CIRCLE work = (AppMain.AMS_AME_RUNTIME_WORK_CIRCLE)amsAmeCreateParam.work; work.time = -node.start_time; AppMain.amVectorAdd(work.position, amsAmeCreateParam.parent_position.Value, amsAmeCreateParam.position.Value); AppMain.amVectorAdd(work.position, node.translate); AppMain.amVectorScale(work.velocity, amsAmeCreateParam.parent_velocity.Value, node.inheritance_rate); AppMain.amVectorAdd(work.velocity, amsAmeCreateParam.velocity.Value); work.rotate = node.rotate; float sizeRate = amsAmeCreateParam.ecb.size_rate; work.spread = node.spread; work.radius = node.radius * sizeRate; work.offset = node.offset * sizeRate; work.offset_chaos = node.offset_chaos * sizeRate; return(0); }
private static int _amUpdateCircle(object rr) { AppMain.AMS_AME_RUNTIME amsAmeRuntime1 = (AppMain.AMS_AME_RUNTIME)rr; AppMain.AMS_AME_NODE_CIRCLE node = (AppMain.AMS_AME_NODE_CIRCLE)amsAmeRuntime1.node; AppMain.AMS_AME_RUNTIME_WORK_CIRCLE work = (AppMain.AMS_AME_RUNTIME_WORK_CIRCLE)amsAmeRuntime1.work; work.time += AppMain._am_unit_frame; if ((double)work.time <= 0.0) { return(0); } if ((double)node.life != -1.0 && (double)work.time >= (double)node.life) { return(1); } AppMain.NNS_VECTOR4D nnsVectoR4D1 = new AppMain.NNS_VECTOR4D(); AppMain.amVectorScale(nnsVectoR4D1, work.velocity, AppMain._am_unit_time); AppMain.amVectorAdd(work.position, nnsVectoR4D1); //AppMain.GlobalPool<AppMain.NNS_VECTOR4D>.Release(nnsVectoR4D1); float sizeRate = amsAmeRuntime1.ecb.size_rate; work.spread += node.spread_variation * AppMain._am_unit_time; if ((double)node.radius_variation != 0.0) { work.radius += node.radius_variation * AppMain._am_unit_time; } else { work.radius = node.radius * sizeRate; } work.offset = node.offset * sizeRate; work.offset_chaos = node.offset_chaos * sizeRate; AppMain.NNS_MATRIX amUpdateCircleMtx = AppMain._amUpdateCircle_mtx; AppMain.nnMakeUnitMatrix(amUpdateCircleMtx); AppMain.amMatrixPush(amUpdateCircleMtx); AppMain.NNS_QUATERNION rotate = work.rotate; AppMain.amQuatToMatrix((AppMain.NNS_MATRIX)null, ref rotate, null); work.rotate = rotate; AppMain.NNS_VECTOR4D nnsVectoR4D2 = new AppMain.NNS_VECTOR4D(); AppMain.NNS_VECTOR4D nnsVectoR4D3 = new AppMain.NNS_VECTOR4D(); AppMain.NNS_VECTOR4D nnsVectoR4D4 = new AppMain.NNS_VECTOR4D(); AppMain.AMS_AME_LIST next = amsAmeRuntime1.child_head.next; for (AppMain.AMS_AME_LIST childTail = amsAmeRuntime1.child_tail; next != childTail; next = next.next) { AppMain.AMS_AME_RUNTIME amsAmeRuntime2 = (AppMain.AMS_AME_RUNTIME)next; amsAmeRuntime2.amount += node.frequency * AppMain._am_unit_frame; while ((double)amsAmeRuntime2.amount >= 1.0) { --amsAmeRuntime2.amount; ++amsAmeRuntime2.count; if ((double)node.max_count != -1.0 && (double)((int)amsAmeRuntime2.work_num + (int)amsAmeRuntime2.active_num) < (double)node.max_count) { AppMain.AMS_AME_CREATE_PARAM amsAmeCreateParam = new AppMain.AMS_AME_CREATE_PARAM(); AppMain.amVectorSet(nnsVectoR4D4, 0.0f, 1f, 0.0f); float radius = work.radius; int angle = (int)((double)AppMain.nnRandom() * 10000000.0); if (((int)node.flag & 1) == 0) { radius *= AppMain.nnRandom(); } else if (((int)node.flag & 2) != 0) { int maxCount = (int)node.max_count; angle = (int)((long)((int)ushort.MaxValue / maxCount) * ((long)amsAmeRuntime2.count % (long)maxCount)); } float pSn; float pCs; AppMain.amSinCos(angle, out pSn, out pCs); AppMain.amVectorSet(nnsVectoR4D2, pSn * radius, 0.0f, pCs * radius); AppMain.NNS_VECTOR4D nnsVectoR4D5 = new AppMain.NNS_VECTOR4D(); AppMain.NNS_QUATERNION pQuat = new AppMain.NNS_QUATERNION(); AppMain.amVectorOuterProduct(nnsVectoR4D5, nnsVectoR4D4, nnsVectoR4D2); double num = (double)AppMain.amVectorUnit(nnsVectoR4D5); AppMain.amQuatRotAxisToQuat(ref pQuat, nnsVectoR4D5, AppMain.NNM_DEGtoRAD((int)work.spread)); AppMain.amQuatMultiVector(nnsVectoR4D4, nnsVectoR4D4, ref pQuat, null); //AppMain.GlobalPool<AppMain.NNS_VECTOR4D>.Release(nnsVectoR4D5); AppMain.amMatrixCalcVector(nnsVectoR4D2, nnsVectoR4D2); AppMain.amMatrixCalcVector(nnsVectoR4D4, nnsVectoR4D4); AppMain.amVectorScale(nnsVectoR4D3, nnsVectoR4D4, work.offset + work.offset_chaos * AppMain.nnRandom()); AppMain.amVectorAdd(nnsVectoR4D2, nnsVectoR4D3); AppMain.amVectorScale(nnsVectoR4D3, nnsVectoR4D4, node.speed + node.speed_chaos * AppMain.nnRandom()); amsAmeCreateParam.ecb = amsAmeRuntime1.ecb; amsAmeCreateParam.runtime = amsAmeRuntime2; amsAmeCreateParam.node = amsAmeRuntime2.node; amsAmeCreateParam.parent_position = work.position; amsAmeCreateParam.parent_velocity = work.velocity; amsAmeCreateParam.position = nnsVectoR4D2; amsAmeCreateParam.velocity = nnsVectoR4D3; switch (AppMain.AMD_AME_NODE_TYPE(amsAmeRuntime2.node) & 65280) { case 256: AppMain._amCreateEmitter(amsAmeCreateParam); continue; case 512: AppMain._amCreateParticle(amsAmeCreateParam); continue; default: continue; } } } } //AppMain.GlobalPool<AppMain.NNS_VECTOR4D>.Release(nnsVectoR4D2); //AppMain.GlobalPool<AppMain.NNS_VECTOR4D>.Release(nnsVectoR4D3); //AppMain.GlobalPool<AppMain.NNS_VECTOR4D>.Release(nnsVectoR4D4); AppMain.amMatrixPop(); return(0); }