예제 #1
0
파일: csc_lz.cpp 프로젝트: pombredanne/CSC
void LZ::EncodeNormal(uint8_t *src, uint32_t size, uint32_t lz_mode)
{
    for(uint32_t i = 0; i < size; ) {
        uint32_t cur_block_size;
        cur_block_size = MIN(wnd_size_ - wnd_curpos_, size - i);
        cur_block_size = MIN(cur_block_size, MinBlockSize);
        memcpy(wnd_ + wnd_curpos_, src + i, cur_block_size);
        if (lz_mode == 1) // fast, with no lazy parser
            compress_normal(cur_block_size, false);
        else if (lz_mode == 2)
            compress_normal(cur_block_size, true);
        else if (lz_mode == 3)
            compress_advanced(cur_block_size);
        /*
        else if (lz_mode == 4) {
            mf_.SetArg(1, 2, 0, good_len_);
            compress_normal(cur_block_size, false);
            mf_.SetArg(bt_cyc_, ht_cyc_, 1, good_len_);
            
        }*/ else if (lz_mode == 5) {
            // only copy the block data to window and put it into MF
            // No encoded output 
            mf_.SetArg(1, 1, 0, good_len_);
            compress_mf_skip(cur_block_size);
            mf_.SetArg(bt_cyc_, ht_cyc_, 1, good_len_);
        } else {
            printf("Error!");
            exit(0);
        }

        if (wnd_curpos_ >= wnd_size_) 
            wnd_curpos_ = 0;
        i += cur_block_size;
    }
    if (lz_mode != 5) {
        // for lz_mode == 5, Encode nothing, non terminator
        model_->EncodeMatch(64, 0);
    }
    return;
}
예제 #2
0
static md2_data_t *md2_process_vertices(const model_t *model, const mesh_t *mesh, int skinwidth, int skinheight)
{
	md2_data_t *data;
	int i, j, k;

	data = (md2_data_t*)qmalloc(sizeof(md2_data_t));

/* convert texcoords to integer and combine duplicates */
	data->texcoords = (dstvert_t*)qmalloc(sizeof(dstvert_t) * mesh->num_vertices);
	data->numtexcoords = 0;
	data->texcoord_lookup = (int*)qmalloc(sizeof(int) * mesh->num_vertices);

	for (i = 0; i < mesh->num_vertices; i++)
	{
		dstvert_t md2texcoord;

		md2texcoord.s = (int)(mesh->texcoord2f[i*2+0] * skinwidth);
		md2texcoord.t = (int)(mesh->texcoord2f[i*2+1] * skinheight);

		for (j = 0; j < data->numtexcoords; j++)
			if (md2texcoord.s == data->texcoords[j].s && md2texcoord.t == data->texcoords[j].t)
				break;
		if (j == data->numtexcoords)
			data->texcoords[data->numtexcoords++] = md2texcoord;
		data->texcoord_lookup[i] = j;
	}

/* compress vertices */
	data->frames = (daliasframe_t*)qmalloc(sizeof(daliasframe_t) * model->num_frames);
	data->original_vertices = (dtrivertx_t*)qmalloc(sizeof(dtrivertx_t) * mesh->num_vertices * model->num_frames);

	for (i = 0; i < model->num_frames; i++)
	{
		daliasframe_t *md2frame = &data->frames[i];
		const float *v, *n;
		float mins[3], maxs[3], iscale[3];

	/* calculate bounds of frame */
		VectorClear(mins);
		VectorClear(maxs);
		v = mesh->vertex3f + model->frameinfo[i].frames[0].offset * mesh->num_vertices * 3;
		for (j = 0; j < mesh->num_vertices; j++, v += 3)
		{
			for (k = 0; k < 3; k++)
			{
				mins[k] = (j == 0) ? v[k] : min(mins[k], v[k]);
				maxs[k] = (j == 0) ? v[k] : max(maxs[k], v[k]);
			}
		}

		for (j = 0; j < 3; j++)
		{
			md2frame->scale[j] = (maxs[j] - mins[j]) * (1.0f / 255.0f);
			md2frame->translate[j] = mins[j];

			iscale[j] = md2frame->scale[j] ? (1.0f / md2frame->scale[j]) : 0.0f;
		}

	/* compress vertices */
		v = mesh->vertex3f + model->frameinfo[i].frames[0].offset * mesh->num_vertices * 3;
		n = mesh->normal3f + model->frameinfo[i].frames[0].offset * mesh->num_vertices * 3;
		for (j = 0; j < mesh->num_vertices; j++, v += 3, n += 3)
		{
			dtrivertx_t *md2vertex = &data->original_vertices[j * model->num_frames + i];

			for (k = 0; k < 3; k++)
			{
				float pos = (v[k] - md2frame->translate[k]) * iscale[k];

				pos = (float)floor(pos + 0.5f);
				pos = bound(0.0f, pos, 255.0f);

				md2vertex->v[k] = (unsigned char)pos;
			}

			md2vertex->lightnormalindex = compress_normal(n);
		}
	}

/* combine duplicate vertices */
	data->vertices = (int*)qmalloc(sizeof(int) * mesh->num_vertices);
	data->numvertices = 0;
	data->vertex_lookup = (int*)qmalloc(sizeof(int) * mesh->num_vertices);

	for (i = 0; i < mesh->num_vertices; i++)
	{
		const dtrivertx_t *v1 = data->original_vertices + i * model->num_frames;

	/* see if a vertex at this position already exists */
		for (j = 0; j < data->numvertices; j++)
		{
			const dtrivertx_t *v2 = data->original_vertices + data->vertices[j] * model->num_frames;

			for (k = 0; k < model->num_frames; k++)
				if (v1[k].v[0] != v2[k].v[0] || v1[k].v[1] != v2[k].v[1] || v1[k].v[2] != v2[k].v[2] || v1[k].lightnormalindex != v2[k].lightnormalindex)
					break;
			if (k == model->num_frames)
				break;
		}
		if (j == data->numvertices)
		{
		/* no match, add this one */
			data->vertices[data->numvertices++] = i;
		}
		data->vertex_lookup[i] = j;
	}

	return data;
}